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


100

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

예를 들면 :

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

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

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

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


나는 현재 답변이 부적절하고 제시된 질문에 대한 답변이 없다고 생각하기 때문에이 질문에 대한 현상금을 시작 했습니다 . 해당되는 경우 관련 소스 (사양에서 가져옴) 및 주목할만한 브라우저 '특성'도 포함하세요.
user2864740 2010 년

답변:


116

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

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

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

또한보십시오:

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


1
나는 다른 대답과 같은 표준 인용문을 포함했다는 것을 깨달았습니다.
TomW

17

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.