DOM NodeList를 일반 배열로 변환하기위한이 깔끔한 지름길을 우연히 발견했지만 작동 방식을 완전히 이해하지 못합니다.
[].slice.call(document.querySelectorAll('a'), 0)
그것은 하늘의 배열로 시작 그래서 []
, 다음 slice
의 결과를 변환하는 데 사용됩니다 call
그래 새로운 배열에?
내가 이해하지 못하는 것은 call
입니다. document.querySelectorAll('a')
NodeList에서 일반 배열 로 어떻게 변환 합니까?
답변
여기서 일어나는 일은 slice()
마치를 NodeList
사용 하는 함수처럼 호출한다는 것 call()
입니다. 어떤 slice()
이 경우에 수행하는 것은 현재 실행중인 개체 (지금은 원래 배열을 통해 다음 반복,를 빈 배열을 만들 것이다 NodeList
) 결국 반환이 만든 빈 배열로 객체의 요소를 추가 유지. 여기에 대한 기사가 있습니다.
편집하다:
빈 배열로 시작합니다. [], 호출 결과를 새로운 배열로 변환하기 위해 slice가 사용됩니다.
그건 맞지 않습니다. [].slice
함수 객체를 반환합니다. 함수 객체에는 call()
의 첫 번째 매개 변수를 할당 하는 함수 를 호출하는 함수 call()
가 있습니다 this
. 즉, 함수 가 배열이 아닌 매개 변수 (에서 NodeList
반환 document.querySelectorAll('a')
) 에서 호출되었다고 생각하게합니다 .
답변
JavaScript에서 객체의 메서드는 런타임에 다른 객체에 바인딩 될 수 있습니다. 간단히 말해서, 자바 스크립트는 객체가 다른 객체의 메소드를 “빌리도록”허용합니다.
object1 = {
name: 'Frank',
greet() {
alert(`Hello ${this.name}`);
}
};
object2 = {
name: 'Andy'
};
// Note that object2 has no greet method,
// but we may "borrow" from object1:
object1.greet.call(object2); // Will show an alert with 'Hello Andy'
call
과 apply
이 작업을 수행 할 수 있습니다 함수 객체의 방법 (물론 자바 스크립트는 함수 객체). 따라서 코드에서 NodeList가 배열의 슬라이스 메소드를 빌리고 있다고 말할 수 있습니다. .slice()
다른 배열을 결과로 반환하여 사용할 수있는 “변환 된”배열이됩니다.
답변
에서 slice
함수를 검색합니다 Array
. 그런 다음 해당 함수를 호출하지만 결과를 실제 배열 대신 객체 document.querySelectorAll
로 사용합니다 this
.
답변
배열과 유사한 객체를 실제 배열로 변환하는 기술입니다.
이러한 개체 중 일부는 다음과 같습니다.
arguments
기능에서- NodeList (가져온 후 내용이 변경 될 수 있음을 기억하십시오!
- jQuery 컬렉션, 일명 jQuery 객체 (일부 문서 : API , type , learn )
예를 들어 객체는 참조로 전달되고 배열은 값으로 전달됩니다.
또한, 첫 번째 인수주의 0
, omited 수 있습니다 여기에 철저한 설명 .
그리고 완전성을 위해 jQuery.makeArray ()도 있습니다.
답변
어떻게 그 변환
document.querySelectorAll('a')
A로부터
NodeList
규칙적인 배열에?
이것은 우리가 가진 코드입니다.
[].slice.call(document.querySelectorAll('a'), 0)
먼저 해체하자
[] // Array object
.slice // Accessing the function 'slice' present in the prototype of Array
.call // Accessing the function 'call' present in the prototype of function object(slice)
(document.querySelectorAll('a'),0)
// 'call' can have arguments like, (thisArg, arg1,arg2...n).
// So here we are passing the 'thisArg' as an array like object,
// that is a 'nodeList'. It will be served as 'this' object inside of slice function.
// And finally setting 'start' argument of slice as '0' and leaving the 'end'
// argument as 'undefined'
1 단계 : call
기능 실행
- 내부
call
이외는thisArg
, 인수의 나머지는 인수 목록에 추가됩니다. - 이제 함수
slice
는 (객체에서 온 배열과 같은)this
값을
인수 목록과 함께 바인딩하여 호출됩니다 . 즉 , 포함하는 인수thisArg
document.querySelector
start
0
2 단계 : 2 slice
내부에서 호출 된 함수 실행call
start
변수에 다음s
과 같이 할당 됩니다0
- 이후
end
이다undefined
,this.length
에 저장됩니다e
- 빈 배열은 변수에 저장됩니다
a
-
위의 설정을 한 후 다음과 같은 반복이 발생합니다.
while(s < e) { a.push(this[s]); s++; }
- 채워진 배열
a
이 결과로 반환됩니다.
추신 시나리오에 대한 이해를 돕기 위해 문맥에 필요한 일부 단계는 호출 및 슬라이스 의 원래 알고리즘에서 무시되었습니다 .
답변
[].slice.call(document.querySelectorAll('.slide'));
1. The querySelectorAll() method returns all elements in the document that matches a specified selector(s).
2. The call() method calls a function with a given this value and arguments provided individually.
3. The slice() method returns the selected elements in an array, as a new array object.
so this line return the array of [object HTMLDivElement]. Here is the six div with classname "slide" so array length will be 6.
<div class="slideshow">
<div class="slide">
first slider1
</div>
<div class="slide">
first slider2
</div>
<div class="slide">
first slider3
</div>
<div class="slide">
first slider4
</div>
<div class="slide">
first slider5
</div>
<div class="slide">
first slider6
</div>
</div>
<script type="text/javascript">
var arraylist = [].slice.call(document.querySelectorAll('.slide'));
alert(arraylist);
</script>
답변
ES6에서 : Array.from (element.children) 또는 Array.from ({length : 5})으로 간단히 배열을 만듭니다 .