2013-07-25 39 views
1

以下代码将输出'true',表示Array()为true。在Python中,list()是False,这是否仅仅是因为语言设计者的偏好?javascript为什么Array()是真的?

document.write("<p>Array() is " + (Array() ? "true" : "false") + "</p>"); 
+0

有用答案:http://stackoverflow.com/questions/10440792/why-does-false-evaluate-to-false-when-if-not-succeeds#answer-10440825 –

+0

它看起来像对JS对象的低度理解 – vladkras

回答

6

这是因为JavaScript将Array()的值强制为布尔值。这就是所谓的“真实性”,在javascript中,真值包括任何有效的对象。 Array()会生成一个有效的对象,因此会在布尔表达式中评估为真值。

NullundefinedNaN0,并且空字符串""评估为假。

为什么?因为ECMAScript spec这样说。

+0

甚至有语言,0评估为真(Lua)。 – immibis

0

Array()是truthy。换句话说,它有一个值,并且该值不是false,null或undefined。有很多什么是真理的列表,并没有在网络上的JavaScript。举一个例子,创建新数组的更多“标准”/“接受”方法是使用数组literal - []。如果你把它放在你的控制台中,你也会变得“真实”。

console.log(!!([])); 
0

阵列()返回数组这里(虽然是空的),尝试(Array().length ? "true" : "false")

+0

是的,但你仍然*在这里做一个隐式类型转换,因为'Array().length'是一个整数,而不是布尔值。 – kojiro

+0

@kojiro什么隐含在'.length'中? – vladkras

+0

问题是关于隐式布尔转换,例如*为什么在一种语言中为空数组为'false'而在另一种语言中为'真'?*您的答案表明,而不是一个隐式布尔转换'Array()? “true”:“false”'⇒'布尔({})? “true”:“false”',OP应该使用一个*不同的*隐式布尔转换'Array().length? “true”:“false”'⇒'布尔(0)? “真”:“假”。它碰巧有不同的结果,因为它是一种不同的类型转换,但它仍然是一种隐式转换。 – kojiro

0

这里阵列()是一个构造函数,它会指向一个非空,定义的对象甚至
这将是空的您的例子,但一个有效的,当它就会转化成
布尔值,它会被评估为真(仅不确定对象进行评估,以
假)。

相关问题