Javascript 怎么会![]不是真的吗?
当我测试这个时,我只是在玩nodejs和chrome的控制台:Javascript 怎么会![]不是真的吗?,javascript,Javascript,当我测试这个时,我只是在玩nodejs和chrome的控制台: [] == true // false ![] == true // false !![] == true // true 为什么?是不是错了?这与浏览器如何处理JS中的隐式转换有关。 由于[]是一个空数组,它的计算结果为false: [] == true false == true ![] == true false == true !![] == true !false == true true == true 但是
[] == true // false
![] == true // false
!![] == true // true
为什么?是不是错了?这与浏览器如何处理JS中的隐式转换有关。
由于
[]
是一个空数组,它的计算结果为false
:
[] == true
false == true
![] == true
false == true
!![] == true
!false == true
true == true
但是,
not
ing将对象转换为值为false
的布尔值:
[] == true
false == true
![] == true
false == true
!![] == true
!false == true
true == true
但是,boolean([])
将返回true
。
但是,
not
ing将其转换为值为的布尔值!错误
:
[] == true
false == true
![] == true
false == true
!![] == true
!false == true
true == true
这就是除非需要,否则不推荐隐式转换的原因:
"1" == true
true == true
"1" === true
false
见:
11.4.9逻辑非运算符(!)
生产一元表达式:UnaryExpression的计算方法如下:
- 未定义→ 假的
- 空的→ 假的
- 布尔值→ 结果等于输入参数(无转换)
- 数→ 如果参数为+0、-0或NaN,则结果为false;否则结果就是 对
- 如果参数为空字符串(其长度为零),则结果为false; 否则,结果是正确的
- 反对→ 真的
数组是一个对象。
[]==true
为false,因为[]
不等于true
,就像“某些字符串”
也不等于true
![]==true
为false,因为在条件语句中使用时,[]
的计算结果为真值:
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)
将始终具有相同的结果。在node.js上是相同的(编辑:当然,它是相同的引擎。但在IE的控制台上也是相同的)@zneak这是一个错误,修复了布尔([])
->真的,试试看。@hugo_leonardo,因为隐式转换和显式转换不一样。欢迎使用Javascript,其中强制转换不是同构的。@FatalError:==
算法有点复杂,这是无法回避的事实。首先要记住的是,==
没有对其操作数进行布尔运算。当人们假设这一点时,它会变得令人困惑,这是可以理解的。这就是为什么除非需要,否则不使用隐式的。@ColeJohnson考虑代码>运算符将LHS转换为布尔值,并且RHS已经是布尔值,结果将相同。对于后两种算法,两种算法(和比较算法)的步骤完全相同,因此使用一种算法比使用另一种算法没有任何好处。可能有很好的理由去做[]==0
而不是[]==0
,因为前者可能是真的,也可能是假的(取决于arra中的成员),但后者总是假的。但是,奇怪的是,空对象是更接近真或假的D:@hugo_leonardo:当作为布尔值计算时,空对象总是true
。a={};a==真;a==假
在我的控制台中,两个比较结果都返回false…@hugo_leonardo:=
运算符不会将其操作数强制转换为布尔值values@hugo_leonardo:研究抽象相等比较算法,您会发现,当两个操作数的类型不同时,转换几乎总是一个toNumber转换。对象获得TopPrimitive转换。对于数组,我相信它首先得到字符串,然后是toNumber。因此,空数组将被转换为”
,然后转换为0
。布尔值转换为数字,因此false
为0
0==0
我个人使用术语“相等”表示=
,“相同”表示==
,当两者之间的区别很重要时。只要我的2美分。