일반적인 사용법 외에도, 슬라이스는 배열형 객체를 실제 배열로 변환하는 데 자주 사용됩니다.
명사 설명: 배열형 객체 – { 0: 'foo', length: 1 } 또는 심지어 { length: 'bar' }. 가장 일반적인 배열형 객체는 인수와 NodeList입니다.
V8 엔진 array.js의 소스 코드를 보면 슬라이스의 내부 구현입니다. 다음과 같이 단순화할 수 있습니다:
함수 Slice(start, end) {
var len = ToUint32(this.length), result = []
for(var i = start; i < end; i ) {
result.push( this[i]);
return result;
}
Slice가 배열 유형일 필요는 없음을 알 수 있습니다. 길이 속성이 있어야 합니다. 그리고 길이 속성은 숫자 유형일 필요가 없습니다. 숫자 값으로 변환할 수 없는 경우 ToUnit32(this.length)는 0을 반환합니다.
표준 브라우저의 경우 슬라이스의 원리가 명확하게 설명되어 있습니다. 위에. 하지만 짜증나는 것은 항상 문제를 야기합니다:
var Slice = Array.prototype.slice;
slice.call(); // => IE: 개체가 필요합니다.
slice.call(document.childNodes) // => .
위 코드는 IE에서 오류를 보고합니다. IE의 Trident 엔진이 오픈소스가 아니어서 추측만 할 수 있다는 점은 아쉽습니다.
function ie_slice(start, end) {
var len = ToUint32(this.length), result = [];
if(__typeof__ this !== ' JScript 객체') throw 'JScript 객체 예상';
if(this === null) throw '객체 예상'
for(var i = start; i < end; i ) {
result.push(this[ i]);
}
return result;
}
이 시점에서 비참한 ie가 정당화됩니다.
슬라이스에 관해서는 또 다른 주제가 있습니다. Array.prototype.slice를 사용해야 할까요? 아니면 [].slice를 사용해야 할까요? 이론적으로 []는 배열을 만들어야 하며 Array.prototype보다 성능이 약간 떨어집니다. 그러나 사실 둘은 거의 동일합니다. 루프에서 i를 사용할지, i를 사용할지 여부는 순전히 개인 습관의 문제입니다.
마지막 주제는 퍼포먼스에 관한 것입니다. 배열 필터링의 경우 색상을 희생해서 작성하는 방법이 있습니다:
var ret = [];
for(var i = start, j = 0; i < end; i ) {
ret[j ] = arr[i]; 🎜>}
공간을 시간으로 교환합니다. 푸시를 제거하면 대규모 어레이의 성능이 확실히 향상됩니다.
이른 아침에 블로그를 쓰다보니 기분이 좋지 않아 모두를 위한 주제를 남겨야 합니다:
var Slice = Array.prototype.slice;
alert(slice.call({0: 'foo', length: 'bar'})[0]); / / ?
alert(slice.call(NaN).length) // ?
alert(slice.call({0: 'foo', 길이: ' 100'})[0]); // ?