!JavaScript中的运算符

ris*_*p89 16 javascript operators

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

alert(!undefined); //true
alert(!function(){}); //false
alert(!{}); //false
alert(!null); //true
alert(!()); //crash
alert(!"false"); //false
alert(!false)?;???????????? //true??????????????????
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我概括一下行为!运营商.

编辑

更令人困惑的事情:

?alert( new String() == ""); //true
alert(!""); //true
alert(! new String()); //false
Run Code Online (Sandbox Code Playgroud)

怎么样?

dje*_*lin 20

!你的想法是什么:将true变为false,反之亦然.奇怪的行为与Javascript如何将字面上的任何内容转换为truefalse.

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

就像在C中一样(只有更糟),所有值都可以提升为true或false.你想要的可耻术语是"真实的"和"虚假的",或"真实性"和"虚假性".Truthy意味着某些东西转化为真实,虚假意味着某些东西转化为虚假.所有值都只是truthy null,undefined,0,"",NaN,和...false

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

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

这个网站非常喜欢用这里有趣的行为来做病态的事情:

http://wtfjs.com

另外请注意,==确实很难使事物具有可比性,而如果事情不具有可比性则===只会返回false.Javascript中的 Crockford :Good Parts建议不要==完全使用.

  • 是的,但你提出了错误的问题.`!`完全按照你的想法,它变为假,反之亦然.你所看到的奇怪行为更多地与你正在应用的事物的奇怪真实性有关!至. (2认同)

End*_*age 8

!不是truejavascript中是什么或不是什么功能的功能.如果您熟悉转换,将变量强制转换为特定类型,那么您应该合理地了解以下内容.

!仅适用于布尔值.因此,应用它的任何变量都不是布尔值,在应用之前首先被强制为布尔值!.要将此与您的示例相关联:

Boolean(undefined) == false 
Run Code Online (Sandbox Code Playgroud)

undefined在javascript中有点像null(有一些差异,但这是一个不同的主题).布尔等价物应该是有意义的false.undefined超越了缺乏价值,它宣称你试图使用的变量甚至不存在.

Boolean(function(){}) == true
Run Code Online (Sandbox Code Playgroud)

函数是javascript中的对象.即使它是空的,它仍然具有函数对象共有的一些基本属性,因此它的布尔等价物是true.这不是什么都不是.

Boolean({}) == true
Run Code Online (Sandbox Code Playgroud)

像空函数一样,{}定义一个空对象.但是,它仍然具有javascript中对象共有的一些属性.它根本没有自定义属性.

Boolean(null) == false
Run Code Online (Sandbox Code Playgroud)

正如我所提到的undefined,null类似但不完全相同.它表明没有价值.

Boolean(()) // error
Run Code Online (Sandbox Code Playgroud)

()对自己来说并不是什么意思.你需要它们之间的东西来使语法正确,所以这与你的错误/真实问题无关.()单独只是一个语法错误.

Boolean("false") == true
Run Code Online (Sandbox Code Playgroud)

"false"是一个字符串.仅仅因为它包含字母f,a,l,s,e不会使它与布尔值相同false.非空字符串是某种东西,因此强制布尔值true.注意字符串是一种特殊的对象,因为空字符串""强制执行,false但是{}如上所述,空对象强制执行true.

布尔值(false)== false

这一点应该清楚. false已经是一个布尔值,因此它不会改变它的值.它仍然是false.

从那里,您可以看到如何应用于!每个案例将为您提供您所看到的结果.

为了进一步阅读,这里有一篇关于javascript中类型强制的相当好的文章

更新:

关于你的String问题.String对象和字符串文字之间有不同(用引号括起来的东西).您可以String从字符串文字创建对象,但文字不会自动成为对象.javascript中的数字也是如此.JS有一个Number对象,但你经常会定义数字文字.行为Number与您所看到的一致String:

alert( new Number() == 0); //true
alert(!0); //true
alert(! new Number()); //false
Run Code Online (Sandbox Code Playgroud)

但是,正如你在评论中明确提到的那样:

alert( new String() === ""); //false
Run Code Online (Sandbox Code Playgroud)

因为类型不一样; 对象与文字.

通常,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.

  • 注意`new String()=== new String()`也返回`false`,因为操作数是两个不同的对象. (2认同)

nnn*_*nnn 5

"有人可以帮我概括!运营商的行为."

当然.如果单个操作数可以转换为true,则返回false; 否则,返回true.

任何对象(包括"空"对象,{}或函数),任何非空字符串和任何非零数字都可以转换为true.另一方面,null,undefined,空字符串和零将全部转换为false.然后!操作员返回相反的结果,因此您在问题中显示结果.

  • 字符串和字符串对象在JS中并不完全相同.(这有点像Java中int和Integer之间的区别.)`typeof""`是"string",而`typeof new String()`是"object".这很令人困惑,但字符串是一种值类型,但是当你在它们上调用字符串方法(例如,`.substr()`)时,它们就会被转换为对象.(类似地,你可以在数字基元上调用Number方法,例如,`123.123.toFixed(1)`返回`123.1`.) (2认同)