我现在很困惑!JavaScript中的运算符。我的理解是!运算符仅对布尔值进行运算。但是我的一个answers的注释说它可以对任何东西进行操作,并返回一个布尔值,在我做了一些测试之后,这恰好是真的。
alert(!undefined); //true
alert(!function(){}); //false
alert(!{}); //false
alert(!null); //true
alert(!()); //crash
alert(!"false"); //false
alert(!false); //true
有没有人能帮我概括一下!操作符。
编辑
更令人困惑的是:
alert( new String() == ""); //true
alert(!""); //true
alert(! new String()); //false
如何实现?
发布于 2012-05-23 05:58:36
!
做了您认为的事情:把真变成假,反之亦然。这种奇怪的行为与Javascript如何将任何东西转换为true
或false
有关。
http://11heavens.com/falsy-and-truthy-in-javascript
像C一样(更糟糕的是),所有值都可以提升为true或false。你想要的可搜索的术语是“真实”和“虚假”,或者“真实”和“虚假”。“真”的意思是“真”,“假”的意思是“假”。除了null
、undefined
、0
、""
、NaN
和...之外,所有值都为真。false
这个链接有更多有趣的例子:
http://www.sitepoint.com/javascript-truthy-falsy/
而且这个网站真的很喜欢做一些病态的事情来做一些有趣的事情:
还要注意,==
确实在努力使事物具有可比性,而如果事物不具有可比性,则===
只返回false
。Crockford in Javascript:好部分建议不要完全使用==
。
发布于 2012-05-23 06:11:05
这与其说是!
的函数,不如说是javascript中什么是或不是true
的函数。如果您熟悉强制类型转换,即强制将变量转换为特定类型,那么以下内容对您来说应该是相当清楚的。
!
只对布尔值进行操作。因此,在应用!
之前,您应用它的任何不是布尔值的变量都首先被强制为布尔值。将此与您的示例相关联:
Boolean(undefined) == false
undefined有点像javascript中的null (有一些不同,但那是不同的主题)。布尔值的等价物是false
,这应该是有意义的。undefined
不仅仅是没有值,它还声明您试图使用的变量甚至不存在。
Boolean(function(){}) == true
函数是javascript中的对象。即使它是空的,它仍然具有function对象共有的一些基本属性,因此它的布尔等效项是true
。它不是什么都不是,所以它是有意义的。
Boolean({}) == true
与空函数类似,{}
定义了一个空对象。然而,它仍然有一些与javascript中的对象相同的属性。它根本没有自定义属性。
Boolean(null) == false
正如我在undefined
中提到的,null
类似,但并不完全相同。它表明了价值的缺失。
Boolean(()) // error
()
本身并不意味着什么。你需要它们之间的一些东西来使语法正确,所以这与你的false/true问题无关。()
本身就是一个语法错误。
Boolean("false") == true
"false"
是一个字符串。仅仅因为它包含字母f,a,l,s,e并不意味着它与布尔值false
相同。非空字符串是某种东西,因此强制为布尔型true
。注意字符串是一种特殊的对象,因为空字符串""
强制为false
,而空对象{}
强制为true
。
布尔值( false ) == false
这一点应该很清楚。false
已经是一个布尔值,所以强制转换它不会改变它的值。仍然是false
。
由此,您可以看到如何将!
应用于每个案例,从而获得您所看到的结果。
为了进一步阅读,这里有一个关于javascript中类型强制的pretty good article
更新:
关于你的String
问题。String
对象和字符串文字(用引号括起来的东西)是不同的。您可以从字符串文字创建String
对象,但文字不会自动成为对象。javascript中的数字也是如此。JS有一个Number
对象,但您通常会定义数字文字。Number
的行为与您在String
中看到的行为一致
alert( new Number() == 0); //true
alert(!0); //true
alert(! new Number()); //false
然而,正如你在评论中敏锐地提到的那样:
alert( new String() === ""); //false
因为类型是不同的;object和文字。
通常,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
。
发布于 2012-05-23 06:03:24
“有人能帮我概括一下!运算符的行为吗?”
好的。如果它的单个操作数可以转换为true,则返回false;否则返回true。
任何对象(包括“空”对象、{}
或函数)、任何非空字符串和任何非零数都可以转换为true。另一方面,null、undefined、空字符串和零都将被转换为false。然后,!
运算符返回相反的结果,因此您在问题中显示的结果。
https://stackoverflow.com/questions/10710770
复制相似问题