! JavaScript中的运算符
我现在很困惑!JavaScript中的运算符。我的理解是!运算符仅对布尔运算。但是我的一个朋友的评论说它可以对任何东西进行操作,并返回一个布尔值,在我做了一些测试之后,它恰好是真的! JavaScript中的运算符,javascript,operators,Javascript,Operators,我现在很困惑!JavaScript中的运算符。我的理解是!运算符仅对布尔运算。但是我的一个朋友的评论说它可以对任何东西进行操作,并返回一个布尔值,在我做了一些测试之后,它恰好是真的 alert(!undefined); //true alert(!function(){}); //false alert(!{}); //false alert(!null); //true alert(!()); //crash alert(!"false"); //false alert(!false);
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
有关
与C语言一样(更糟糕的是),所有值都可以提升为true或false。你想要的谷歌术语是“truthy”和“falsy”,或者“truthy”和“falsiness”。truthy的意思是某物转化为真,falsy的意思是某物转化为假。除了null
,未定义的,0
,,“
,NaN
,以及<代码>错误
这个链接有更多有趣的例子:
Boolean(undefined) == false
这个网站真的很喜欢用有趣的行为做病态的事情:
还要注意的是,=
确实努力使事物具有可比性,而如果事物不具有可比性,===
只返回false
。Javascript中的Crockford:好的部分建议不要完全使用=
。!如果其单个操作数可以转换为true,或者如果它是非布尔值,则返回false:
!(x == y)
!"something"
如果其操作数可以转换为false,则为true:
!(x > y)
“有人能帮我概括一下!运算符的行为吗?”
当然。如果其单个操作数可以转换为true,则返回false;否则,返回true
任何对象(包括“空”对象、{}
或函数)、任何非空字符串和任何非零数字都可以转换为true。另一方面,null、undefined、空字符串和zero都将转换为false。
运算符然后返回相反的结果,因此在问题中显示结果。这不是的函数
作为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
对象,但文字不会自动成为对象。javascript中的数字也是如此。JS有一个Number
对象,但您通常会定义数字文本。Number
的行为与您看到的String
一致:
alert( new Number() == 0); //true
alert(!0); //true
alert(! new Number()); //false
然而,正如你在评论中敏锐地提到的:
alert( new String() === ""); //false
由于类型不同;对象与文字
通常,Boolean(某些对象)
的计算结果总是true
,但根据具体值,Boolean(某些文字)
的计算结果可能是false
附录
就因为我在本周早些时候射中了自己的脚,我认为这将是一个有用的信息补充。在大多数语言中,空数组[]
将被强制为false
。但是,在Javascript中,数组是对象,因此即使是空数组也强制为true
。一个值得注意的人。在js和各种服务器端语言之间切换时,很容易在if(!maybe_empty_array){…}
这一行上犯错误,因为maybe_empty_array
总是强制执行true
。相反,如果(可能是空的数组.length){…}
,则应该执行。如果ar