!JavaScript 中的运算符
! operator in JavaScript
我现在对 JavaScript 中的 ! 运算符感到困惑。我的理解是!运算符仅在布尔值上运行。但是对我的一个答案的评论说它可以对任何东西进行操作并返回一个布尔值,这在我做了一些测试后恰好是正确的。
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
如何?
!
做你的想法:从真变成假,反之亦然。 这种奇怪的行为与Javascript如何将任何东西转换为true
或false
有关。
http://11heavens.com/falsy-and-truthy-in-javascript
就像在C中一样(只是更糟(,所有值都可以提升为真或假。 你想要的可谷歌术语是"真实"和"虚假",或"真实"和"虚假"。 真意味着某物转化为真,假意味着某物转化为假。 除null
、undefined
、0
、""
、NaN
和... false
此链接有更多有趣的示例:
http://www.sitepoint.com/javascript-truthy-falsy/
这个网站真的很喜欢用这里的有趣行为做病态的事情:
http://wtfjs.com
还要注意的是,==
真的努力使事情具有可比性,而===
只是在事情不具有可比性的情况下返回false
。 Javascript中的Crockford:The Good Parts建议不要完全使用==
。
与其说是!
的函数,不如说是javascript中true
或不的函数。 如果您熟悉强制转换,即将变量强制转换为特定类型,那么以下内容对您来说应该相当清楚。
!
只对布尔值进行操作。 因此,在应用 !
之前,您将其应用于的任何非布尔变量首先被强制为布尔值。 要将其与您的示例相关联,请执行以下操作:
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
相同。 非空字符串是某种东西,因此强制到布尔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。
补遗
仅仅因为我本周早些时候搬起石头砸了自己的脚,我认为这将是一个有用的信息。 在大多数语言中,空数组 []
将被强制false
。但是,在Javascript中,数组是对象,因此即使是空数组也会强制true
。 一个需要注意的。 在js和各种服务器端语言之间切换时,很容易沿着永远不会通过的if(!maybe_empty_array){...}
路线出错,因为maybe_empty_array
总是会强制true
。相反,您应该if(maybe_empty_array.length){...}
. 如果数组为空,则其长度为 0,这安全地强制到 false
。
"有人可以帮我概括一下 !操作员。
确定。如果它的单个操作数可以转换为 true,则返回 false;否则,返回 true。
任何对象(包括"空"对象、{}
或函数(、任何非空字符串和任何非零数字都可以转换为 true。另一方面,null、未定义、空字符串和零都将转换为 false。然后,!
运算符返回相反的结果,因此您在问题中显示的结果。
! 如果它的单个操作数可以转换为 true,或者它是一个非布尔值,则返回 false:
!(x == y)
!"something"
如果其操作数可以转换为 false,则为 true:
!(x > y)
<</div>
div class="answers">很难写出比这更笼统的解释:
var arr = [0, "", false, null, undefined, NaN];
for(var i = 0; i < 6; i++){
console.log(!(arr[i]));//always true
}
任何其他值将产生false
- 这是什么 ==- javascript 运算符
- Javascript逻辑运算符和字符串/数字
- Javascript,如果条件在没有&&逻辑运算符当&&它不起作用
- 如果在构造函数中有“返回”,则在 JavaScript 中的新运算符中做了什么
- JavaScript 中三元条件和逻辑和运算符的运算符优先级
- JavaScript-===vs===运算符性能
- 在 Jquery/Javascript 中使用多个 OR (||) 运算符时如何设置变量
- 在 JavaScript 对象中设置要使用的运算符的属性
- 哪个JavaScript相等运算符(==或===)更快
- 用javascript中的三元运算符连接字符串
- 应该在什么时候使用Javascript条件运算符
- 我可以在不使用乘法运算符“”的情况下进行乘法运算吗*"在JavaScript中
- 什么时候可以对条件参数使用管道运算符?-JavaScript
- 如何使用逻辑运算符 JavaScript 或 jQuery
- 使用余数运算符Javascript对奇数和偶数进行排序
- 右移运算符 - Javascript
- 使用空数组时比较运算符 JavaScript 的奇怪行为
- 在条件中使用逻辑运算符和比较运算符(javascript)
- 动态运算符javascript
- 逻辑运算符&&javascript中的两个字符串