Javascript 对象内拼接键(obj).forEach(函数(索引)

Javascript 对象内拼接键(obj).forEach(函数(索引),javascript,node.js,Javascript,Node.js,在node.js中执行类似操作可以吗: Object.keys(obj).forEach(function(index) { if (index == 'sth') obj.splice(obj.indexOf(index), 1); } 我想知道如果脚本由许多客户机执行并写入/输出到obj对象中,这个拼接是否会达到预期效果 obj确实是一个对象,索引可以是字母数字值。因此,splice在对象中不起作用,而应该使用delete。同样的问题是,在对象的foreach中使用de

在node.js中执行类似操作可以吗:

Object.keys(obj).forEach(function(index) { 
   if (index == 'sth')
      obj.splice(obj.indexOf(index), 1);
}
我想知道如果脚本由许多客户机执行并写入/输出到obj对象中,这个拼接是否会达到预期效果

obj确实是一个对象,索引可以是字母数字值。因此,splice在对象中不起作用,而应该使用delete。同样的问题是,在对象的foreach中使用delete可以吗

您没有在
obj
上执行
forEach
(您不能,
forEach
仅为类似数组的东西定义。)您正在通过
对象.key
查找
obj
的所有可枚举属性而创建的数组上执行
forEach

让我们看看上面描述的更改代码,并更正语法错误:

Object.keys(obj).forEach(function(key) { 
   if (key == 'sth')
      delete obj[key];
});
当然,您可以从
Object.keys
在数组上的
forEach
回调中从
obj
删除属性。它对正在循环的数组没有任何影响



旁注:当您在对象上使用
delete
时,在V8(NodeJS使用的JavaScript引擎)和其他一些对象上,它会显著降低以后查找该对象属性的性能,因为它会从优化版本转到“字典模式”版本。当然,只有当您将对象标识为性能问题的根源时,这才重要;在此之前,请删除…:-)

splice对对象不起作用。@JordanHendrix:我认为
obj
是一个数组。当然除了,那么
索引将是一个数字(好的,是数字字符串),而不是
'sth'
。所以……是的,真的很不清楚。:-)那代码真的没有多大意义。如果
obj
是一个数组,那么
索引将是它的每个现有条目索引,并且
obj.indexOf(index)
没有意义,因为它查找的是条目,而不是索引。如果
obj
不是数组,那么它就不会有
splice
(除非您创建并添加一个数组;在非数组对象上没有标准的
splice
)。是的,这真的很让人困惑,我认为它是一个obj,因为:'in/out into the obj object'。“预期的事情”是什么?如果您的期望是事情将按照规范中描述的定义良好的行为进行,那么答案是“是”。谢谢!所以,如果
delete
降低了那么多性能,那么应该用什么来代替呢?@Luciano:这完全取决于你的代码在做什么。有时,在属性上设置值
undefined
是一个很好的答案。有时,创建一个新对象,它只具有您想要保留的属性,这是一个很好的答案。有时候,对潜在的性能问题保持良好的态度是一个很好的答案。