如何在Javascript中镜像哈希功能?

如何在Javascript中镜像哈希功能?,javascript,Javascript,我知道Javascript对象足够灵活,可以模仿常见的哈希数组功能(键作为字符串,值作为基本类型,能够按键/值循环) 我有这个例子,我不明白为什么它不起作用: var hash = { 'a' : '', 'b' : '', 'c' : '', } 其中一个值的初始化方式如下: hash['a'] = 5; 然后我试着循环它们: var keys = Object.keys(hash); for(var i in keys){ console.log(hash[i]); } 结果

我知道Javascript对象足够灵活,可以模仿常见的哈希数组功能(键作为字符串,值作为基本类型,能够按键/值循环)

我有这个例子,我不明白为什么它不起作用:

var hash = {
 'a' : '',
 'b' : '',
 'c' : '',
}
其中一个值的初始化方式如下:

hash['a'] = 5;
然后我试着循环它们:

var keys = Object.keys(hash);
for(var i in keys){
  console.log(hash[i]);
}
结果是3个“未定义”


为什么会发生这种情况?

您遇到的问题是,您正在迭代
对象的键。键
数组(这些键是整数0、1、2…)并尝试使用这些整数获取
哈希的属性

您不需要
对象。键
在此处:

for(var i in hash){
  console.log(hash[i]);
}
如果确实要使用
Object.keys
,请迭代数组中的元素:

var keys = Object.keys(hash);
for(var i=0; i<keys.length; i++){
  console.log(hash[keys[i]]);
}

您遇到的问题是,您正在迭代
对象.keys
数组的键(这些键是整数0、1、2…),并尝试使用这些整数获取
哈希的属性

您不需要
对象。键
在此处:

for(var i in hash){
  console.log(hash[i]);
}
如果确实要使用
Object.keys
,请迭代数组中的元素:

var keys = Object.keys(hash);
for(var i=0; i<keys.length; i++){
  console.log(hash[keys[i]]);
}
变量“keys”没有用键值初始化,因为变量名“keys”和函数“keys”之间似乎存在冲突。

但是,如果您预先将“keys”初始化为变量,然后运行代码段,那么它将正常工作

另外,如果您将变量“keys”重命名为其他名称,那么它也可以正常工作

下面所附的屏幕截图显示了在Chrome控制台中重新执行这些步骤

由于变量名“keys”和函数“keys”之间似乎存在冲突,因此变量“keys”未使用键值初始化。

但是,如果您预先将“keys”初始化为变量,然后运行代码段,那么它将正常工作

另外,如果您将变量“keys”重命名为其他名称,那么它也可以正常工作

下面所附的屏幕截图显示了在Chrome控制台中重新执行这些步骤


对于..in来说这很聪明,是吧?
对象。键
很好,但是如果你在
中使用
进行迭代,那么你应该用
对象.hasOwnProperty(键)
来保护它。如果某个bozo已添加到
Object.prototype
,则
hasOwnProperty
将仅对您分配给实例的键返回true。您不能也不应该防范bozos。在我看来,添加不必要的hasOwnProperty是不好的做法。它表明你不知道什么时候需要它。它并不是真正的“bozo”保护,但有时你只对那些没有通过原型链共享或访问的属性感兴趣。所以,要么使用
Object.getOwnPropertyNames()
,要么检查
.hasOwnProperty
。我们说的是一个用作映射并创建为文本的对象,而不是一些随机对象。这对..来说很聪明,对吧?
对象。键
很好,但是如果您在
中使用
进行迭代,那么您应该使用
对象.hasOwnProperty(key)
来保护它。如果某个bozo已添加到
Object.prototype
,则
hasOwnProperty
将仅对您分配给实例的键返回true。您不能也不应该防范bozos。在我看来,添加不必要的hasOwnProperty是不好的做法。它表明你不知道什么时候需要它。它并不是真正的“bozo”保护,但有时你只对那些没有通过原型链共享或访问的属性感兴趣。因此,要么使用
Object.getOwnPropertyNames()
,要么检查
.hasOwnProperty
。我们说的是一个用作映射并创建为文本的对象,不是关于一些随机对象。很好的解释,这是我在第一时间应该做的来追踪错误。很好的解释,这是我在第一时间应该做的来追踪错误。