过滤掉对象成员的好习惯用法(javascript)

Gru*_*rig 7 javascript node.js

我想删除一个对象的某些成员(为了参数,那些键以'_'开头).这是一种优雅的方式吗?天真的方式是:

for (var i in obj) 
  if (i[0] === '_') 
    delete obj[i];
Run Code Online (Sandbox Code Playgroud)

但是在迭代期间修改了底层对象.在Node中至少我想我可以

Object.keys(obj).forEach(function (i) { if (i[0] === '_') delete obj[i]; });
Run Code Online (Sandbox Code Playgroud)

每次用尴尬的嵌套循环删除某些内容时重启迭代.

还有更好的解决方案吗?

编辑:刚刚在测试中,至少在node.js中,天真的解决方案实际上似乎有效.当然(有必要)安全地实施...... in当然是可能的.谁知道?

OnT*_*Fly 18

你不必担心它.ECMAScript语言规范 §12.6.4 的摘录明确指出(由我强调):

枚举属性的机制和顺序(第一个算法中的步骤6.a,第二个算法中的步骤7.a)未指定. 枚举期间可以删除要枚举的对象的属性.如果删除枚举期间尚未访问的属性,则不会访问该属性.如果在枚举期间将新属性添加到要枚举的对象,则无法保证在活动枚举中访问新添加的属性.在任何枚举中不得多次访问属性名称.