잘림으로부터 JS 배열을 보호하는 방법
7130 단어 webdevjavascript
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의 내부 기어가 어떻게 설계되었는지 조금 이해하는 것을 좋아합니다.
Reference
이 문제에 관하여(잘림으로부터 JS 배열을 보호하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/smlka/how-to-protect-a-js-array-against-truncation-1lfk텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)