布尔运算符 ||

Boolean operator ||

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

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

TBH,我不太适合 js,但据我所知,这意味着如果未定义 argarg 将是 new Object(); 我现在的问题是,js怎么知道这不是布尔解释呢?或者这种比较的效果如何?

就像,javascript 确实有动态数据类型,所以我假设 arg 是一个布尔值,(如果我没记错的话,[=15= 的布尔值] 始终为真) arg 在 运行 函数之后为真,无论 arg 的先前值是什么。 但是,我使用各种参数进行了测试(同样,我是 js 的新手),结果对我来说很奇怪:

使用:

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]

除了 name(false) = [object Object],我会预料到这些结果。造成这种结果的原因是什么?我真的找不到满意的答案。

此致, 西蒙

...this means that if arg is not defined, arg will be new Object();

不完全:这意味着如果arg有一个值,那么将new Object()分配给arg

|| 运算符的工作原理如下:它计算左侧操作数,如果该值为 truthy,则运算结果为该值;否则,它计算右侧操作数并得出该值。

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

更多内容在我的博客 this article 中。

&& 运算符同样强大,但方式有点相反:它计算左侧操作数,如果该值为 falsey,则操作就是那个值;否则它计算右边的操作数,结果就是那个值。所以 a = b && b.foo; 将分配 a 如果 b 的值是假的(nullundefined 等)或 b.foo 的值如果没有。

My question now is, how does js know that this isn't considered a boolean interpretation?

因为规范中就是这样定义的。 JavaScript 的 ||&& 与 Java 不同,后者总是产生布尔值。这是设计使然,非常强大。