Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
! JavaScript中的运算符_Javascript_Operators - Fatal编程技术网

! 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)​;​​

我现在很困惑!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
有关

与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