[已解决]js中!!有存在的必要么?为什么?

业务背景


  • 浏览`lodash源码
  • 发现了!!这个用法
  • 查了一下,是两次取反的意思
  • 但是没搞懂他存在的必要

示例代码


lodash官方源码
function isObjectLike(value) {
  return !!value && typeof value == 'object';
}
我修改后的代码,即直接去掉!!
function isObjectLike(value) {
  return value && typeof value == 'object';
}

我的困惑


  • 官方代码的含义

    • 就是取反之后再取反,最后来判断这个变量是否为真
  • 我的代码

    • js会根据数据类型以及变量值,自动判断他为真为假

比如传一个0进去

  • 官方的步骤:

    1. !0 => true
    2. !true => false
  • 我的步骤

    1. 0 => false\

问题


  • 既然结果都一样,那很多大佬写的代码为什么都要这样用呢?肯定不是多此一举吧
阅读 4.3k
5 个回答

作用是为了类型转换, 强制转换成布尔值.

至于为什么需要. 我来详细说说:

function isObjectLike(value) {}

我们期望 isObjectLike 的返回值是个 boolean. 但 && 操作的返回值是参与操作的操作数.

console.log(1 && 2) // 打印 2
console.log(0 && 2) // 打印 0

所以如果我们传递给 && 的操作数不是布尔类型的, 那么我么得到的返回值就不是布尔值. 我们看看去掉 !! 会造成怎样的不一致性和bug.

function isObjectLike(value) {
  return value && typeof value == 'object'; // 去掉 !!
}

isObjectLike(0) === false // false 什么? 居然不相等?

console.log(isObjectLike(0)) // 打印 0

你能想象一个叫 isObjectLike 的函数返回值类型却不是 boolean 值吗?

我觉得主要原因还是返回值 因为这是一个判断真假的方法
0&&true => 0
!!0&&true => false

强制转化成bool值,还是有必要的。虽然隐式转换也是可以运行,在终归是不科学的

这个涉及js的类型转换网上一直以来都说js的隐性强制转换不好,相反使用显性的更容易让人理解,在某些情况下也可以避免不必要的错误,简单举个例子,如果你不注意自己的代码中涉及到这样的比较:

null == false  // false
!!null == false  // true

当然代码中最好不要直接通过falsetrue来进行“==”和“===” 的比较。

它存在的作用就是楼上说的强制转任何值为布尔值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题