Array.prototype.push push는 배열 끝에 항목을 추가하고 길이를 업데이트하여 배열 길이를 반환합니다.
객체에서 푸시를 사용하면 어떻게 되나요?
아래 코드를 보면 obj가 배열처럼 작동합니다. 길이는 자동으로 업데이트됩니다.
var push = Array.prototype.push;
var obj = {};
push.call(obj, "hello"); // 반환 값 1
// obj {"0":"hello", 길이:0}
push.call (obj, "world"); // 반환 값 2
// obj {"0":"hello", "1":"world",length:2}
Array .prototype.length Array.prototype.splice
Object에 길이와 splice를 부여
다음 코드를 보세요: Obj가 실제로 배열이 되나요? 실제로 그렇지 않으면 이는 디버깅 도구의 일부 출력 검사 문제일 수 있습니다.
instanceof를 사용하여 obj instanceof Array를 테스트합니다. //false
var obj = { length:0, splice:Array.prototype.splice};console.log( obj ) // 인쇄: []
계속해서 다음 코드를 살펴보세요:
obj.push(0)//Return obj.length
1obj.push(1)//Return obj.length
2obj.splice (0, 1);//첫 번째 항목을 삭제하고 삭제된 항목을 반환
[0]obj.length // 1 splice는 항목 삭제 시 길이 속성
도 업데이트하므로 성능이 향상됩니다. obj는 배열과 거의 동일합니다. 당연히 슬라이스, 팝, 시프트, 시프트 해제 등은 모두 객체에서 정상적으로 작동할 수 있습니다.
단, 길이를 직접 설정하면 아래 표에서 길이보다 큰 항목은 배열에서 삭제되지만 내부의 obj는 업데이트되지 않습니다.
어디에 적용되나요? jQuery 객체는 배열처럼 동작하지만 실제로는 객체입니다. 이런 종류의 객체를 새로 만드는 방법은 무엇입니까?
실제로 jQuery는 이 jQuery 객체의 효과를 얻기 위해 Array 메소드를 Object에 빌려줍니다. push와 같은 Array 메소드도 jQuery 객체 내에서 직접 사용됩니다.
jQuery 소스코드 일부 보기(굵게 표시된 부분 참고)
// 빈 선택기로 시작
selector: "",
// 현재 사용 중인 jQuery 버전
jquery: "1.7.1",
// jQuery 객체의 기본 길이는 0입니다.
length: 0,
......
// 내부용으로만 사용됩니다.
// 배열의 메서드처럼 작동하지만, 그렇지 않습니다. jQuery 메서드
push: push,
sort: [].sort,
splice: [].splice
객체를 배열로 재생하려면 다음이 필요합니다. 길이 속성이 "배열" 항목의 합계에 해당하지 않는 잠재적인 문제가 있을 수 있습니다.
따라서 길이를 직접 사용하여 길이를 설정하는 것은 지원되지 않습니다.
아래 jquery 코드를 보세요. 길이는 업데이트되지만 jquery 개체는 업데이트되지 않습니다. (물론 이것은 jquery에는 문제가 되지 않습니다.)
var jq = $('div') //페이지에서 40
divjq.length를 얻는다고 가정합니다. // 40
jq.length = 0; jq //? jq에는 여전히 40개의 dom 객체가 저장되어 있으며 길이 속성은 "배열" 항목의 합계와 일치하지 않습니다.
객체의 배열 사용 방법은 여전히 정상적으로 작동할 수 있는데, 이는 다소 예상치 못한 일입니다.