为了确定对象是数组还是对象列表,我想出了以下方法:
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?
答案 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));