Boolean()函数的意外返回值

时间:2019-03-22 17:15:06

标签: javascript

为了确定对象是数组还是对象列表,我想出了以下方法:

var foo = {}
Boolean(foo["length"]+1) // returns false because foo is an object


var foo = []
Boolean(foo["length"]+1) // returns true because foo is an array

但是,看了这个之后,我意识到它不起作用。 []["length"]+1显然是正确的,因为它等于1。{}["length"]+1等于"length1",这也是正确的,因为它不是未定义的。

那么为什么Boolean({}["length"]+1)返回false而Boolean("length1")返回true?

2 个答案:

答案 0 :(得分:2)

  

那么Boolean({}["length"]+1)为什么返回false ...

因为对象没有length属性,所以{}["length"]将返回undefined并尝试在+1上进行undefined是{{ 1}},即falsy值。

  

...还NaN返回true吗?

因为字符串Boolean("length1")是一个truthy值。

更好的测试方法是查看所讨论的项目是否具有仅其中一个拥有的属性/方法。这称为"feature detection",并在整个JavaScript中得到广泛使用

length1

答案 1 :(得分:1)

false返回length,因为对象上没有{}属性,即undefined,因此它返回undefined + 1,而NaN返回{{1 }} 这是falsy

Boolean({}["length"]+1)
Boolean(undefined+1)
Boolean(NaN)
false

Boolean("length1")返回true,因为"length1"是字符串和真实值。请注意,除空字符串""

外,所有字符串都是伪造的

以下值将在强制转换为false时始终返回Boolean,而所有其他值将返回true

console.log(Boolean(0));
console.log(Boolean(''));
console.log(Boolean(null));
console.log(Boolean(undefined));
console.log(Boolean(false));
console.log(Boolean(NaN));