首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >好了!JavaScript中的运算符

好了!JavaScript中的运算符
EN

Stack Overflow用户
提问于 2012-05-23 05:57:23
回答 5查看 662关注 0票数 16

我现在很困惑!JavaScript中的运算符。我的理解是!运算符仅对布尔值进行运算。但是我的一个answers的注释说它可以对任何东西进行操作,并返回一个布尔值,在我做了一些测试之后,这恰好是真的。

代码语言:javascript
复制
alert(!undefined); //true
alert(!function(){}); //false
alert(!{}); //false
alert(!null); //true
alert(!()); //crash
alert(!"false"); //false
alert(!false)​;​​​​​​​​​​​​ //true​​​​​​​​​​​​​​​​​​

有没有人能帮我概括一下!操作符。

编辑

更令人困惑的是:

代码语言:javascript
复制
​alert( new String() == ""); //true
alert(!""); //true
alert(! new String()); //false

如何实现?​

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-23 05:58:36

!做了您认为的事情:把真变成假,反之亦然。这种奇怪的行为与Javascript如何将任何东西转换为truefalse有关。

http://11heavens.com/falsy-and-truthy-in-javascript

像C一样(更糟糕的是),所有值都可以提升为true或false。你想要的可搜索的术语是“真实”和“虚假”,或者“真实”和“虚假”。“真”的意思是“真”,“假”的意思是“假”。除了nullundefined0""NaN和...之外,所有值都为真。false

这个链接有更多有趣的例子:

http://www.sitepoint.com/javascript-truthy-falsy/

而且这个网站真的很喜欢做一些病态的事情来做一些有趣的事情:

http://wtfjs.com

还要注意,==确实在努力使事物具有可比性,而如果事物不具有可比性,则===只返回false。Crockford in Javascript:好部分建议不要完全使用==

票数 20
EN

Stack Overflow用户

发布于 2012-05-23 06:11:05

这与其说是!的函数,不如说是javascript中什么是或不是true的函数。如果您熟悉强制类型转换,即强制将变量转换为特定类型,那么以下内容对您来说应该是相当清楚的。

!只对布尔值进行操作。因此,在应用!之前,您应用它的任何不是布尔值的变量都首先被强制为布尔值。将此与您的示例相关联:

代码语言:javascript
复制
Boolean(undefined) == false 

undefined有点像javascript中的null (有一些不同,但那是不同的主题)。布尔值的等价物是false,这应该是有意义的。undefined不仅仅是没有值,它还声明您试图使用的变量甚至不存在。

代码语言:javascript
复制
Boolean(function(){}) == true

函数是javascript中的对象。即使它是空的,它仍然具有function对象共有的一些基本属性,因此它的布尔等效项是true。它不是什么都不是,所以它是有意义的。

代码语言:javascript
复制
Boolean({}) == true

与空函数类似,{}定义了一个空对象。然而,它仍然有一些与javascript中的对象相同的属性。它根本没有自定义属性。

代码语言:javascript
复制
Boolean(null) == false

正如我在undefined中提到的,null类似,但并不完全相同。它表明了价值的缺失。

代码语言:javascript
复制
Boolean(()) // error

()本身并不意味着什么。你需要它们之间的一些东西来使语法正确,所以这与你的false/true问题无关。()本身就是一个语法错误。

代码语言:javascript
复制
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中看到的行为一致

代码语言:javascript
复制
alert( new Number() == 0); //true
alert(!0); //true
alert(! new Number()); //false

然而,正如你在评论中敏锐地提到的那样:

代码语言:javascript
复制
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

票数 8
EN

Stack Overflow用户

发布于 2012-05-23 06:03:24

“有人能帮我概括一下!运算符的行为吗?”

好的。如果它的单个操作数可以转换为true,则返回false;否则返回true。

任何对象(包括“空”对象、{}或函数)、任何非空字符串和任何非零数都可以转换为true。另一方面,null、undefined、空字符串和零都将被转换为false。然后,!运算符返回相反的结果,因此您在问题中显示的结果。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10710770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档