Javascript 枚举对象属性

Javascript 枚举对象属性,javascript,ecmascript-6,Javascript,Ecmascript 6,ecma262规范有一个标题,标题的名称可以从其名称中理解,它负责枚举对象中的属性。这个“半算法”表示对象必须遵循以下规则(我不会列出所有规则,因为其余规则是显而易见的): 迭代器的throw和return方法为null,永远不会被调用 如果我理解正确,那么迭代器应该返回null,并且在尝试调用这些方法时返回undefined。尽管这可能意味着迭代器没有这些方法,而且它们实际上是空的,并且不具有null类型形式的空值 枚举过程中可能会删除目标对象的属性。在迭代器的下一个方法处理之前删除的属性将被

ecma262规范有一个标题,标题的名称可以从其名称中理解,它负责枚举对象中的属性。这个“半算法”表示对象必须遵循以下规则(我不会列出所有规则,因为其余规则是显而易见的):

  • 迭代器的throw和return方法为null,永远不会被调用
  • 如果我理解正确,那么迭代器应该返回null,并且在尝试调用这些方法时返回undefined。尽管这可能意味着迭代器没有这些方法,而且它们实际上是空的,并且不具有null类型形式的空值

  • 枚举过程中可能会删除目标对象的属性。在迭代器的下一个方法处理之前删除的属性将被忽略 是的,在枚举过程中确实可以删除该属性(表示…in/of)

    ///对象上的删除属性
    var arr={a:111,b:222,c:333,d:444,e:555,f:666,g:777,h:888,i:999};
    用于(arr中的var项目){
    如果(项目==“c”)删除arr[“c”];
    如果(项目==“e”)删除arr[“e”];
    如果(项目==“h”)删除arr[“h”];
    console.log(arr[item]);///当我们在属性“c”上时,我们可以删除它,它将成功完成
    }
    控制台日志(arr)
    
    据说在迭代器处理下一个方法之前删除的属性将被忽略

    这意味着您可以在迭代期间删除尚未到达的元素,然后将不会枚举这些元素:

    constobj={a:1,b:2,c:3};
    用于(让道具插入obj){
    console.log('prop',prop);
    删除obj.b;
    
    }
    “据说在迭代器处理下一个方法之前删除的属性将被忽略。您能演示这样一个示例吗?”尝试将
    if
    语句更改为
    if(item==“c”)delete arr[“e”]@racman它将被删除,不符合规范规则的内容。或者什么会被忽略?规范中说“在处理之前”,但您的示例代码会在处理之后删除它。@racraman注释中的示例将删除之前的
    e
    ,并演示未迭代
    e
    的规范行为。@loganfsmyth我的示例最初并不是为此而创建的。顺便问一下,预期的行为结果是什么?
    对于{a:1,b:2,c:3}(var项){if(item==“a”)delete arr[“b”];console.log(item);}
    将不会记录
    b