布尔运算符||

时间:2015-03-05 11:31:08

标签: javascript syntax boolean

我最近不得不处理一些javascript并遇到了这段代码:

name: function(arg){
            //...
            var arg = arg || new Object();
            //...
}

TBH,我不太适合js,但据我所知,这意味着如果未定义argarg将为new Object(); 我现在的问题是,js如何知道这不是一个布尔解释?或者这种比较有多么令人兴奋?

就像,javascript确实有动态数据类型,所以我假设arg是一个布尔值,(如果我没有错,new Object();的布尔值总是为真){运行该函数后,{1}}将为真,无论arg的先前值是什么。 但是,我测试了这个,使用了各种参数(同样,我是js的新手),结果对我来说很奇怪:

使用:

arg

结果:

function name(arg) {
    var arg = arg || new Object();
    return arg;
}

除了name() = [object Object] name(1) = 1 name(true) = true name(false) = [object Object] name('true') = true name('false') = false name(null) = [object Object] 之外,我原本期望这些结果。这个结果是什么原因?我真的找不到令人满意的答案。

此致 西蒙

1 个答案:

答案 0 :(得分:1)

  

...这意味着如果未定义arg,则arg将为new Object();

不完全:这意味着如果arg falsey 值,则将new Object()分配给arg

||运算符的工作方式如下:它计算左侧操作数,如果该值是 truthy ,则操作的结果是该值;否则,它会评估右侧操作数并产生该值。

那是什么" falsey"和" truthy"?虚假值包括undefinednull0""NaN,当然还有false。 Truthy值是其他所有。

我的博客上的this article更多内容。

&&运算符同样强大,以某种相反的方式:它评估左侧操作数,如果该值是 falsey ,则操作的结果是该值;否则它会评估右侧操作数,结果就是该值。因此a = b && b.foo;a分配b的值,如果它是假的(nullundefined等)或b.foo的值|| 1}}如果没有。

  

我现在的问题是,js如何知道这不是一个布尔解释?

因为它是如何在规范中定义的。 JavaScript的&&和{{1}}与Java不同,后者总是会产生布尔值。它的设计非常强大。