잘림으로부터 JS 배열을 보호하는 방법

7130 단어 webdevjavascript
면책 조항: JS에서 배열을 자르는 방법에는 여러 가지 옵션이 있지만 여기서는 그중 하나에 대해서만 이야기하고 싶습니다.

JS에서 배열을 자르려면 길이 속성을 사용하는 트릭이 있습니다.

const numbers = [1, 2, 3, 4, 5];

if (numbers.length > 3) {
  numbers.length = 3;
}

console.log(numbers); // [1, 2, 3]
console.log(numbers.length); // 3


때때로 나는 나 자신이 건강을 유지하기 위해 작은 이론적 JS 문제를 설정하고 싶습니다.
따라서 작은 연습을 함께 수행하고 길이 속성 조작을 통해 배열을 보호하고 변형을 비활성화하는 방법에 대한 솔루션을 찾아보도록 하겠습니다.

첫 번째 솔루션:

기본적으로 배열의 길이 속성에는 다음 속성이 있습니다.

열거 가능 === 거짓
구성 가능 === 거짓
쓰기 가능 === 참

구성 가능한 속성 속성이 false인 경우 속성에 대한 몇 가지 변경만 허용됩니다. 그 중 하나는 쓰기 가능한 속성을 false로 변경하는 것입니다.
configurable===false 및 writable === false 속성의 조합은 가능한 모든 방법으로 속성을 삭제하거나 수정하는 것을 불가능하게 만듭니다.

const numbers = [1, 2, 3, 4, 5];
Object.defineProperty(numbers,'length',{writable:false})

if (numbers.length > 3) {
  numbers.length = 3;
}

console.log(numbers); // [1, 2, 3, 4, 5]
console.log(numbers.length); // 5

Object.defineProperty(numbers,'length',{value:3})
// Uncaught TypeError: Cannot redefine property: length


목표가 달성되었습니다! 속성 길이에 따른 배열 변형이 비활성화됩니다.

두 번째 솔루션(이국적인 종류):

배열 길이 조작에 대한 내용ES specification을 확인해 보겠습니다.

For each own property key P of A that is an array index, whose numeric value is greater than or equal to newLen, in descending numeric index order, do:



간단히 말해서 배열의 절단은 배열의 끝에서 시작합니다(내림차순 숫자 인덱스 순서). 첫 번째 코드 조각에서 요소 5가 먼저 삭제된 다음 요소 4가 삭제됩니다.

이제 JS에서 배열은 인덱스가 속성의 키이고 요소가 속성의 값인 개체(이국적이지만 여전히 개체)라는 점을 기억해야 합니다.
따라서 배열이 잘린다는 것은 키가 새 길이보다 크거나 같은 배열의 속성이 삭제됨을 의미합니다.

Let deleteSucceeded be ! A.[[Delete]](P).



여기서 A는 배열이고 [[Delete]]는 객체에서 속성을 삭제하는 추상 메서드이고 P는 속성 키입니다.

그러니 함께 합체합시다.
숫자 배열이 있는 예제에서 키가 === 4인 속성이 먼저 삭제됩니다. 그러나 객체에서 속성 삭제를 방지하는 방법이 있습니다. 구성 가능한 속성을 false로 설정하십시오!

실험:

const numbers = [1, 2, 3, 4, 5];
Object.defineProperty(numbers,'4',{configurable:false})

if (numbers.length > 3) {
  numbers.length = 3;
}

console.log(numbers); // [1, 2, 3, 4, 5]
console.log(numbers.length); // 5


배열이 변경되지 않았습니다!
사양(see 17단계)에 따르면 길이 속성 감소로 인한 배열 잘림은 실패한 첫 번째 속성 삭제가 충족될 때 중지됩니다.
따라서 마지막 배열 요소만 삭제하지 않도록 보호하면 배열 변경을 방지하는 목표를 달성할 수 있습니다.

추신 [[삭제]] 배열 절단을 정의하는 데 사용되는 추상 메서드는 삭제 연산자의 논리를 정의하는 데에도 사용됩니다. 따라서 배열의 길이를 줄이면 말 그대로 배열에서 속성을 삭제하는 것입니다. 부작용으로 이러한 배열에 대해 pop() 메서드도 비활성화됩니다.

추신 나는 내 작업에서 그것을 사용한 적이 없으며 결코 사용하지 않기를 바랍니다 =) 그러나 JS의 내부 기어가 어떻게 설계되었는지 조금 이해하는 것을 좋아합니다.

좋은 웹페이지 즐겨찾기