怎么来了![] 不是真的
how come ![] is not true?
当我测试这个时,只是在玩nodejs和chrome的控制台:
[] == true // false
![] == true // false
!![] == true // true
怎么来了?难道没有错吗?
参见 ECMAScript 标准:
11.4.9 逻辑非运算符 ( !
生产 一元表达式 : !一元表达式的计算方法如下:
- 让 expr 是计算 UnaryExpression 的结果。
- 让 oldValue 是 ToBoolean(GetValue(expr))。
- 如果 oldValue 为 true,则返回 false。
- 返回 true。
9.2 托布尔值
抽象操作 ToBoolean 根据表 11 将其参数转换为布尔类型的值:
- 未定义→错误
- 空→假
- 布尔→ 结果等于输入参数(无转换)。
- 数字 → 如果参数为 +0、-0 或 NaN,则结果为 false;否则结果为 真。
- 如果参数是空字符串(其长度为零),则结果为 false; 否则结果为真。
- 对象→为真
数组是一个对象。
它与浏览器如何处理 JS 中的隐式转换有关。<小时 />由于[]
是一个空数组,因此它的计算结果为false
:
[] == true
false == true
<小时 />但是,not
它,会将对象转换为值为 false
的布尔值:
![] == true
false == true
但是,boolean([])
将返回true
。<小时 />但是,not
这样做,会将其转换为值为 !false
的布尔值:
!![] == true
!false == true
true == true
<小时 />这就是为什么除非需要,否则不建议使用隐式转换的原因:
"1" == true
true == true
"1" === true
false
[] == true
是假的,因为[]
不等于true
,就像"some string"
也不等于true
一样。
![] == true
为 false,因为在条件语句中使用时[]
计算结果为 true 值:
if([]) console.log('[]');
if(![]) console.log('![]');
// the result will be '[]' because [] will evaluate to true
// in a conditional even though it doesn't equal true
另一件可以帮助您思考的事情是 ![] == false
将是 true
.
!![] == true
为 true,因为!!
根据条件语句中的真或假将任何内容转换为真值或假值。 因此,if(obj)
和if(!!obj)
将始终具有相同的结果。
相关文章:
- 我已经创建了一个jquery转盘,并使用if条件来运行和停止转盘
- 如何通过溢出来判断元素被切断了多少像素:隐藏在父级上
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- 如何逃离<脚本>jquery html()中的标记.我使用了innerHTML和outerHTML来解决这个
- 有没有什么方法可以通过输入字段(type=file)来找出选择了多少个文件
- html() 真的取代了 html 代码吗?
- 是否有必要使用 === 来比较 Javascript 中的字符串,或者 == 就足够了
- 我能确定这个页面赢了吗;如果我使用`location.replace`来更改哈希,则不会重新加载
- blink()方法真的被弃用了吗
- 如何使用“引导”来选择引导选项卡;下一个“;按钮我遵循了其他答案,但没有奏效
- Quick Javascript考虑了document.getElementByClassName来修复错误
- 当我转到另一个单选按钮时;s的价值观来了
- 我正在用java脚本编写一个hangman程序,如果玩家失败了,我需要帮助来显示这个词
- 你能使用JavaScript来检测用户是否关闭了浏览器选项卡吗?关闭浏览器?或已离开浏览器
- 根据是否选择了文件来更改文件上传时的边框颜色
- 我将如何创建一个javaScript函数来计算选中了多少复选框
- Javascript 渲染动画在 HTML5 DOM 上来自 Array.第一次运行慢!第二次运行顺利.怎么来了
- 怎么来了![] 不是真的
- 在表单中验证电话号码…真的卡住了
- 我怎么能删除后h2标签开放类来了.我在努力,但不工作