!JavaScript 中的运算符

! operator in JavaScript

本文关键字:运算符 JavaScript      更新时间:2023-09-26

我现在对 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如何将任何东西转换为truefalse有关。

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

就像在C中一样(只是更糟(,所有值都可以提升为真或假。 你想要的可谷歌术语是"真实"和"虚假",或"真实"和"虚假"。 真意味着某物转化为真,假意味着某物转化为假。 除nullundefined0""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