javascript感叹号1,关于javascript:双感叹号?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:

What is the !! (not not) operator in JavaScript?

What does the !! operator (double exclamation point) mean in JavaScript?

所以我调试了一些代码并遇到了这个问题:

var foo.bar = 0; // this is actually passed from another function, adding it for context

function(foo) {

var someVar = !!foo.bar;

if (foo.bar) {

// ..stuff happens

} else {

// .. something else happens

}

}

好吧,我的问题是,!!的意义是什么?现在所做的一切都是制造江户X(1)。

与boolean(foo.bar)相比,使用它有什么好处吗?

foo.bar可以在if-as-is中进行评估,因为0 === false已经存在,那么为什么要进行转换呢?(somevar不能在其他任何地方重复使用)

好吧,我知道它是什么,我只是想知道在你的关联问题中没有解释的好处是什么。

0==false不是0===false,三等号阻止了内隐的投射尝试。

这会将值转换为布尔值并确保布尔类型。

"foo"      // Evaluates to"foo".

!"foo"     // Evaluates to false.

!!"foo"    // Evaluates to true.

如果通过foo.bar,那么它可能不是0,而是其他一些不稳定的值。见下表:

javascript的真值表

''        ==   '0'           // false

0         ==   ''            // true

0         ==   '0'           // true

false     ==   'false'       // false

false     ==   '0'           // true

false     ==   undefined     // false

false     ==   null          // false

null      ==   undefined     // true

" \t

" ==   0             // true

Source: Doug Crockford

当涉及到NaN值时,JavaScript也会变得非常奇怪。这是我能想到的唯一一个例子,在我的头顶上!!的行为与===不同。

NaN   ===  NaN     //false

!!NaN === !!NaN    //true

// !!NaN is false

这并不能回答问题。问题问:"foo.bar可以在if-as-is中进行评估,因为0==false已经存在,所以为什么要进行转换?"您的答案解释了它确保了布尔类型,但是OP已经知道了;问题是,确保布尔类型的意义是什么?

@if语句是隐式的,不会使用===

对不起,你能详细解释一下你最后的评论吗?因为我真的不明白它到底想说什么。- -

@鲁克,我明白这是怎么回事。我试着将代码与op发布的if foo.bar联系起来,但是除了偏好之外,我可以推测的唯一原因是在处理nan时。我已将此编辑成我的答案。

我认为答案是没有什么意义。我们可以推测它是如何产生的:

可能早期版本的函数在多个地方使用了someVar,或者以真正受益于true或false的方式使用,所以这更合理。

也许编写函数的人习惯于使用!!转换为true或false,他甚至没有注意到这里没有必要。

也许编写函数的人认为,每一个计算(在本例中是布尔转换)都应该通过为其结果分配一些变量来赋予一个有意义的名称。

也许,因为javascript中的布尔转换非常容易出错(例如,new Boolean(false)是一个真正的值),所以编写函数的人认为应该始终显式地进行转换,而不是隐式地进行转换,即使效果是相同的,只是为了引起人们的注意,将其作为一个潜在的错误点。

当然,这是假定编写函数的人认为!!是一个"显式"布尔转换。从技术上讲,它并不像if那样使用隐式布尔转换,但如果您习惯了这种习惯用法,那么它就相当于显式转换。

但在我的主观看法中,这些理由都不是很好的理由!

这一点尤其重要,使我更喜欢这个答案;(例如,新布尔值(false)是一个真值)

我认为这比公认的答案更好,因为它实际上解释了为什么双感叹号可能被用作操作请求,而不仅仅是解释它的作用。我认为这将有助于说明这一点!!给您一个布尔值,而new boolean()给您一个布尔对象。

如上所述,它强制使用布尔类型的对象。你可以自己看到:

(function typecheck() {

var a ="a";

var b = !a;

var c = !!a;

alert("var a =" + typeof(a) +"

" +

"var b =" + typeof(b) +"

" +

"var c =" + typeof(c));

})();

如果您只是进行比较,转换只会在以后保存类型强制。

仅供参考,以下值在javascript中被强制为false:

"

无效的

未定义

"胁迫为假"是指如果我这样做:像var b = (nullthing) ? 'sad' : 'happy'这样的东西,如果nullthing是0、空、未定义的空白或假,我能可靠地得到b='快乐'?我可以发誓我遇到了一些问题,抱怨在这种情况下它是未定义的或空的。

比较规则有点奇怪。下面是一个很好的深入解释。在您给出的示例中,您将得到一个引用错误,这是正确的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值