这并不完全是由于
!
的函数,而是由于javascript中的真假值。如果您熟悉类型转换,即将变量强制转换为特定类型,则以下内容应该很清楚。
!
仅适用于布尔值。因此,在应用
!
之前,您将其应用于的任何非布尔变量都会首先被强制转换为布尔值。为了与您的示例相关联:
Boolean(undefined) == false
undefined
在JavaScript中有点像null
(虽然它们之间有些差异,但这是另一个话题)。布尔值等价于false
是有道理的。 undefined
不仅表示缺少值,而且还声明你正在尝试使用的变量根本不存在。
Boolean(function(){}) == true
函数在JavaScript中是一种对象。即使它是空的,它仍然具有一些基本属性,这些属性对于函数对象是共同的,因此它的布尔等效值为true
。它不是空的,所以它是存在的。
Boolean({}) == true
就像一个空函数一样,{}
定义了一个空对象。然而,它仍然具有 JavaScript 对象的一些共同属性。它只是没有自定义属性。
Boolean(null) == false
就像我提到的undefined
,null
也类似但又有所不同。它表示值的缺失。
Boolean(()) // error
< p > < code >()< /code >单独使用并没有实际意义,你需要在括号中间加入内容以使其符合语法规则,这与你的真/假问题无关。只有
()
是语法错误。< /p >
Boolean("false") == true
"false"
是一个字符串。仅仅因为它包含了字母f,a,l,s,e,并不意味着它与布尔值false
相同。非空字符串是某种东西,因此强制转换为布尔型true
。请注意,字符串是一种特殊的对象,空字符串""
强制转换为false
,但是一个空对象{}
,如上所述,强制转换为true
。
Boolean(false) == false
这个应该很清楚了。 false
已经是一个布尔型,因此将其转换不会改变其值。它仍然是false
。
从中可以看出,对每种情况应用!
将给您看到的结果。
有关更多信息,请参见javascript类型强制转换的一篇相当不错的文章
更新:
关于您的String
问题。 String
对象和字符串文字(用引号括起来的内容)之间存在差异。您可以从字符串文本创建String
对象,但是文本并不自动成为对象。在javascript中,数字也是如此。JS有一个Number
对象,但您经常定义数字文字。 Number
的行为与您在String
中看到的一致:
alert( new Number() == 0);
alert(!0);
alert(! new Number());
然而,正如你在评论中敏锐指出的一样:
alert( new String() === ""); //false
由于类型不同,分别为对象和字面量。
通常情况下,Boolean(some_object)
将始终评估为true
,但根据确切的值,Boolean(some_literal)
可能会评估为false。
补充说明
就在本周我自己踩了个坑,所以我认为这是一个有用的信息。在大多数语言中,空数组[]
将被强制转换为false
。然而,在Javascript中,数组是对象,因此即使是空数组也会被强制转换为true
。需要注意的一点是,在js和各种服务器端语言之间切换时,很容易出现错误,例如if(!maybe_empty_array){...}
,这将永远无法通过,因为maybe_empty_array
将始终强制转换为true
。相反,您应该执行if(maybe_empty_array.length){...}
。如果数组为空,则其长度为0,安全地强制转换为false
。