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