这与其说是一个函数,!
不如说是true
javascript 中存在或不存在的函数。如果您熟悉强制转换,将变量强制转换为特定类型,那么您应该清楚以下内容。
!
仅对布尔值进行操作。因此,您应用它的任何不是 boolean 的变量在应用之前首先被强制为 boolean !
。将此与您的示例相关联:
Boolean(undefined) == false
undefined 有点像 javascript 中的 null (有一些差异,但这是一个不同的主题)。布尔等效项应该是有意义的false
。undefined
不仅没有价值,它还声明您尝试使用的变量甚至不存在。
Boolean(function(){}) == true
函数是javascript中的对象。即使它是空的,它仍然具有函数对象共有的一些基本属性,因此它的布尔等效项是true
. 这不是什么,所以它是一些东西。
Boolean({}) == true
像一个空函数,{}
定义一个空对象。但是,它仍然具有 javascript 中对象共有的一些属性。它根本没有自定义属性。
Boolean(null) == false
正如我提到的undefined
,null
是相似的,但并不完全相同。它表明没有价值。
Boolean(()) // error
()
对他们自己没有任何意义。您需要它们之间的一些东西来使语法正确,因此这与您的假/真问题无关。()
单独只是一个语法错误。
Boolean("false") == true
"false"
是一个字符串。仅仅因为它包含字母 f,a,l,s,e 并不能使其与布尔值相同false
。非空字符串是某种东西,因此会强制转换为 Boolean true
。注意字符串是一种特殊的对象,因为空字符串""
强制转换false
为空对象,{}
如前所述,强制转换为true
。
布尔(假)==假
这个应该很清楚。 false
已经是一个布尔值,所以转换它不会改变它的值。还是false
。
从那里,您可以看到应用!
到每个案例将如何给您带来您所看到的结果。
为了进一步阅读,这是一篇关于 javascript 中类型强制的非常好的文章
更新:
关于你的String
问题。String
对象和字符串文字(用引号括起来的东西)之间存在差异。您可以从字符串文字创建String
对象,但文字不会自动成为对象。javascript中的数字也是如此。JS 有一个Number
对象,但您通常会定义数字文字。的行为Number
与您所看到的一致String
:
alert( new Number() == 0); //true
alert(!0); //true
alert(! new Number()); //false
但是,正如您在评论中敏锐地提到的那样:
alert( new String() === ""); //false
由于类型不一样;对象与文字。
通常,Boolean(some_object)
将始终评估为true
但取决于确切的值,Boolean(some_literal)
可能评估为假。
附录
仅仅因为本周早些时候我在脚上开枪,我认为这将是一个有用的信息。在大多数语言中,一个空数组[]
, 将被强制转换为false
. 但是,在 Javascript 中,数组是对象,因此即使是空数组也会强制转换为true
. 一个要提防的。在 js 和各种服务器端语言之间切换时,很容易出现错误,if(!maybe_empty_array){...}
因为永远不会通过,因为maybe_empty_array
总是会强制转换为true
. 相反,您应该这样做if(maybe_empty_array.length){...}
。如果数组为空,则其长度为 0,可以安全地强制转换为false
.