我最近不得不处理一些javascript并遇到了这段代码:
name: function(arg){
//...
var arg = arg || new Object();
//...
}
TBH,我不太适合js,但据我所知,这意味着如果未定义arg
,arg
将为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]
之外,我原本期望这些结果。这个结果是什么原因?我真的找不到令人满意的答案。
此致 西蒙
答案 0 :(得分:1)
...这意味着如果未定义
arg
,则arg
将为new Object()
;
不完全:这意味着如果arg
的 falsey 值,则将new Object()
分配给arg
。
||
运算符的工作方式如下:它计算左侧操作数,如果该值是 truthy ,则操作的结果是该值;否则,它会评估右侧操作数并产生该值。
那是什么" falsey"和" truthy"?虚假值包括undefined
,null
,0
,""
,NaN
,当然还有false
。 Truthy值是其他所有。
我的博客上的this article更多内容。
&&
运算符同样强大,以某种相反的方式:它评估左侧操作数,如果该值是 falsey ,则操作的结果是该值;否则它会评估右侧操作数,结果就是该值。因此a = b && b.foo;
会a
分配b
的值,如果它是假的(null
,undefined
等)或b.foo
的值||
1}}如果没有。
我现在的问题是,js如何知道这不是一个布尔解释?
因为它是如何在规范中定义的。 JavaScript的&&
和{{1}}与Java不同,后者总是会产生布尔值。它的设计非常强大。