【发布时间】:2014-12-20 21:20:57
【问题描述】:
所以,这有效(至少在 chrome 中):
var foo = {
0: 'a',
1: 'b',
2: 'c'
};
//add a non-enumerable length property
Object.defineProperty(foo, 'length', {value: 3});
[].forEach.call(foo, function(val){console.log(val);}); //logs a b c
如果键是数字字符串而不是整数,它甚至可以工作,只要有一个长度属性。但是,如果键是非数字字符串,它会静默失败。如果某些键是数字键,而某些键或不是数字键,则它适用于数字键,而其他键则静默失败。所以我的问题有两个。首先,为什么我不能使用非数字字符串来执行此操作(底层实现是否使用递增的for 循环?为什么它足够聪明地对键进行类型强制呢?)
我的意思是,javascript 没有真正的数组,对吧?它们只是以整数作为键的哈希表查找?因此,尽管我意识到我在这里将语言延伸到了临界点,但为什么不能实现/破解它以以适当的多态方式表现呢?
第二个问题是,如果这不应该/不能工作,谁认为让它默默地失败是个好主意?为什么这不会引发错误?
【问题讨论】:
-
你检查过this question吗?至于垫片,流行的库/框架中有很多;最简单的方法是在
Object.keys上使用forEach。 -
你搞错了。 JavaScript 确实 有真正的数组,但它们被伪装成以字符串为键的对象。 JS 中没有“整数属性名”这样的东西。
-
关于 javascript 没有真正的数组,对吗? 部分:嗯,有点像an overstatement。
-
@raina77ow:是的,我知道如何迭代哈希,我在问为什么它的行为方式是这样的,我不是很厉害擅长阅读语言规范文档。感谢您对 js 数组性质的澄清。你也是bergi,谢谢。
-
@bergi 那么这类似于 js 包装原语的方式吗?
标签: javascript