[javascript] 객체 속성을 반복하는 동안 삭제해도 안전합니까?

객체의 속성을 반복 할 때 for-in 루프에서 삭제해도 안전합니까?

예를 들면 :

for (var key in obj) {
    if (!obj.hasOwnProperty(key)) continue;

    if (shouldDelete(obj[key])) {
        delete obj[key];
    }
}

다른 많은 언어에서 배열 또는 사전을 반복하고 내부를 삭제하는 것은 안전하지 않습니다. JS에서 괜찮습니까?

(저는 Mozilla의 Spidermonkey 런타임을 사용하고 있습니다.)



답변

인 ECMAScript 5.1 표준 말한다 (대한-에서 루프에) 섹션 12.6.4 :

열거되는 개체의 속성은 열거 중에 삭제 될 수 있습니다. 열거 중에 아직 방문하지 않은 속성이 삭제되면 방문하지 않습니다. 열거 중에 열거되는 객체에 새 속성이 추가되면 새로 추가 된 속성이 활성 열거에서 방문된다는 보장이 없습니다. 속성 이름은 열거에서 두 번 이상 방문해서는 안됩니다.

따라서 OP의 코드가 합법적이며 예상대로 작동 할 것이 분명하다고 생각합니다. 브라우저 문제는 일반적으로 반복 순서 및 삭제 문에 영향을 주지만 OP 코드가 작동하는지 여부에는 영향을주지 않습니다. 일반적으로 반복에서 현재 속성 만 삭제하는 것이 가장 좋습니다. 개체의 다른 속성을 삭제하면 예측할 수없이 해당 속성이 포함되거나 (이미 방문한 경우) 반복에 포함되지 않습니다. 상태.

또한보십시오:

이들 중 어느 것도 OP의 코드에 실제로 영향을 미치지 않습니다.


답변

로부터 자바 스크립트 / 인 ECMAScript 사양 (특히 12.6.4에 대한-의 문 ) :

열거되는 객체의 속성은 열거 중에 삭제 될 수 있습니다 . 열거 중에 아직 방문하지 않은 속성이 삭제되면 방문하지 않습니다. 열거 중에 열거되는 객체에 새 속성이 추가되면 새로 추가 된 속성이 활성 열거에서 방문된다는 보장이 없습니다 . 속성 이름은 열거에서 두 번 이상 방문해서는 안됩니다.


답변