English 中文(简体)
JavaScript 的操作员
原标题:! operator in JavaScript

现在,我对 JavaScript 的操作员感到困惑。 据我所知, 操作员只能在布林操作。 但对我的一个< a href=> 的“ https:// stackoverflow.com/ a 8876061/929701> 回答< /a> 说它可以在任何东西上操作, 并返回布林, 这在我做了一些测试之后就属实了。

alert(!undefined); //true
alert(!function(){}); //false
alert(!{}); //false
alert(!null); //true
alert(!()); //crash
alert(!"false"); //false
alert(!false)​;​​​​​​​​​​​​ //true​​​​​​​​​​​​​​​​​​

有人能帮我概括一下"操作员"的行为吗?

<强 > EDIT

更令人困惑的是:

​alert( new String() == ""); //true
alert(!""); //true
alert(! new String()); //false

How? ​

最佳回答

! 做你想做的事: 变真或变假。 怪异的行为涉及 Javascript 如何将字面上的东西转换为 true false

http://11heavens.com/falsy-and-truthy-in-javascript < /a>http://11heavens.com/falsy-and-truthy-in-javascrept

在 C 中( 更糟糕的) 中, 所有值都可以被提升为真实或虚假 。 您想要的可识别术语是“ trighthy” 和“ falsy” 、 或“ truthsy” 和“ falsidence ” 。 真理意指某物转换为真, 虚假意指某物转换为假。 除 < code> null 、 < code > 未定义的 、 < code> 0 < /code > 、 < code> > 、 < code > 、 < code > 、 < code > 、 < naN < /code > 和... < code> false 外, 所有值都是真理 。

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

http://www.sitepoint.com/javascription-truthy-falsy/" rel="nolfollown noreferrer" >http://www.sitepoint.com/javascription-truthy-falsy/

这个网站非常喜欢做病理学的事情 与有趣的行为在这里:

< a href=> "http://wtfjs.com" rel= "没有跟随 Noreferrer" > http://wtfjs.com

请注意, 确实很难让事情具有可比性,而 仅仅是返回false ,如果这些事情不具有可比性。Crockford in Javascript:The good parts 建议不完全使用

问题回答

这不是一个“code”的函数! 的函数,而是 Javascript 中 true 的函数。 如果您熟悉铸造, 则将变量强制到特定类型, 那么以下内容应该可以合理地为您弄清楚 。

! 只在布林安操作。 因此, 您将它应用到非布林安的变量在应用 ! 之前首先被迫是布林安! 。 要将此与您的例子联系起来 :

Boolean(undefined) == false 

未定义在 javascript 中类似空( 存在一些差异, 但却是一个不同的话题) 。 布尔等值应该是 < code> false 。 < code> un defed 不仅仅是没有价值, 它声明您试图使用的变量甚至不存在 。

Boolean(function(){}) == true

函数是 javascript 中的对象。 即使它是空的, 它仍然有一些功能对象共有的基本属性, 因此它的布尔等值是 < code> true 。 它不是空的, 所以它有些东西 。

Boolean({}) == true

和空函数一样, 定义了空对象。 但是,它仍然有一些在 javascript 中的对象共有的属性。 它只是没有自定义的属性 。

Boolean(null) == false

正如我提到的undered , null 是相似的,但并不完全相同。它表示没有价值。

Boolean(()) // error

() 本身并不真正意味着什么。 您需要他们之间的某种方法才能使语法正确, 这样对您的错误/ 真正的问题没有影响 。 () 单是一个语法错误。

Boolean("false") == true

“false” 是一个字符串。 仅仅因为它包含字母 f, a, l, s, e 与布尔值 false 不相同。 非空字符串是某种东西, 因而强制使用布尔值 true 。 注意字符串是一种特殊对象, 因为空字符串 " 强制使用 , 但它是一个空对象, , 如前所述, 强制使用 true

Boolean( 假) : 假 :

这应该很清楚。 false 已经是一个布尔, 所以抛出它不会改变它的值。 它仍然是 false

从中,您可以看到对每个案例应用 < code>! 是如何提供你所看到的结果的。

com/2010/10/javascription-coercion-demystificated.html" rel="没有跟随 noreferrer" >pretty good article status on type struction in javascript.

<强 > UPATE:

关于您的 < code> string 问题。 < code> string 对象与字符串字典( 由引号环绕) 之间有不同之处。 您可以从字符串字典创建 < code> string 对象, 但字典不是自动的对象。 数字在 javastatim 中是相同的。 JUS有一个 < code> number 对象, 但您通常会定义数字字典。 < code> number 的行为与您所看到的 < code> string 相符:

alert( new Number() == 0); //true
alert(!0); //true
alert(! new Number()); //false

然而,正如你在评论中精辟地提到的那样:

alert( new String() === ""); //false

由于类型不同;对象与字面上不同。

一般说来, Boolean( some_object) 将总是评估为 true ,但取决于准确值, Boolean( some_literal) 可能评估为虚假。

< 强 > 增编 < /强 >

仅仅因为我本周早些时候打中了自己的脚,我以为这将是需要添加的有用信息。 在大多数语言中,空阵列 < code> <[] , 将被迫加入 false > 。 然而,在 Javascript 中, 阵列是对象, 甚至空阵列也迫使自己加入 true 。 一个需要注意。 当 js 和各种服务器侧边语言之间切换时, 很容易按照 < code> if (! maybe_ sety_ array){...\\\\\\\ / code > 的线条滑落。 因为 < code> maybe_ empty_ rary 将总是强制加入 train 。 相反, 您应该做 < code> (be_ se_ arrayy_ array. lant){/code > 。 如果阵列的阵列的长度为空, 如果阵列为空空, 它的长度是0, 它的长度是安全胁迫, 。

"谁能帮我概括一下!"操作员的行为吗? "/他们"

当然,如果其单项操作能够转换成真,它返回假的;否则,它返回真。

任何对象( 包括“ 空” 对象, < code_ / code > 或一个函数 ), 任何非空字符串, 以及任何非零数字都可以转换为真实 。 另一方面, 空字符串和零将被全部转换为虚假 。 < code>! 运算符然后返回反向, 因此您在问题中显示的结果 。

返回假 : 如果其单个操作可转换成真, 或如果它是一个非子值, 则返回错误 :

!(x == y)
!"something" 

如果它的魔方可以被转换成假的,也是真实的:

!(x > y)

很难写出比这更笼统的解释:

var arr = [0, "", false, null, undefined, NaN];

for(var i = 0; i < 6; i++){
    console.log(!(arr[i]));//always true
}

任何其他值将产生 false





相关问题
selected text in iframe

How to get a selected text inside a iframe. I my page i m having a iframe which is editable true. So how can i get the selected text in that iframe.

How to fire event handlers on the link using javascript

I would like to click a link in my page using javascript. I would like to Fire event handlers on the link without navigating. How can this be done? This has to work both in firefox and Internet ...

How to Add script codes before the </body> tag ASP.NET

Heres the problem, In Masterpage, the google analytics code were pasted before the end of body tag. In ASPX page, I need to generate a script (google addItem tracker) using codebehind ClientScript ...

Clipboard access using Javascript - sans Flash?

Is there a reliable way to access the client machine s clipboard using Javascript? I continue to run into permissions issues when attempting to do this. How does Google Docs do this? Do they use ...

javascript debugging question

I have a large javascript which I didn t write but I need to use it and I m slowely going trough it trying to figure out what does it do and how, I m using alert to print out what it does but now I ...

Parsing date like twitter

I ve made a little forum and I want parse the date on newest posts like twitter, you know "posted 40 minutes ago ","posted 1 hour ago"... What s the best way ? Thanx.

热门标签