Javascript 布尔()函数的意外返回值

Javascript 布尔()函数的意外返回值,javascript,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”]+

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

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呢

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

因为对象没有
length
属性,所以
{}[“length”]
将返回
undefined
,并且尝试在
undefined
上执行
+1
NaN
,这是一个值

…但是
Boolean(“length1”)
返回true

因为字符串
length1
是一个值

更好的测试是查看相关项是否具有只有其中一个具有的属性/方法。这被称为JavaScript,并在整个JavaScript中广泛使用

让obj1={};
设obj2=[];
console.log(obj1.length);//未定义:对象没有长度
console.log(obj1.hasOwnProperty);//本机函数(即truthy)
console.log(obj2.length);//0:数组具有长度,而此数组的长度为0
console.log(obj2.map);//本机函数(即truthy)
Boolean({}[“length”]+1)
返回
false
,因为对象上没有
length
属性,即
{}
,所以它返回
未定义的
未定义的+1
返回
NaN
什么是价值

Boolean(“length1”)
返回true,因为
“length1”
是字符串和trucy值。注意:除了空字符串
“”

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

console.log(布尔值(0)); console.log(布尔值(“”)); log(布尔值(null)); log(布尔值(未定义)); log(布尔值(false));
log(Boolean(NaN))
foo为
{}
且foo['length']导致未定义,未定义+1为NaN。NaN是Falsy虽然这是一个有趣的JS类型转换示例,但是简单地使用
Array.isArray()
不是更好吗@wilsonwilson作为一名开发者,你真的应该留心你在重新发明轮子上所付出的努力。通常,如果你需要某样东西,别人已经比你想得多了。即使他们没有审查他们的流程,也会让你更好地了解自己的解决方案。在这种情况下,您可以依赖一个实现
Boolean({}["length"]+1)
Boolean(undefined+1)
Boolean(NaN)
false