문제

나는 John Resig의 우수한 것을 겪고 있습니다 고급 JavaScript 자습서 그리고 나는 다음 전화의 차이점을 철저히 이해하지 못합니다.

>>> arguments  
[3, 1, 2, 3]  
>>> Array.slice.call( arguments )  
3,1,2,3 0=3 1=1 2=2 3=3  
>>> Array.slice.call( arguments, 1 )  
[]
>>> Array().slice.call( arguments )  
3,1,2,3 0=3 1=1 2=2 3=3  
>>> Array().slice.call( arguments, 1 )  
1,2,3 0=1 1=2 2=3  

기본적으로 나의 오해는 array.slice와 array () 슬라이스의 차이로 요약됩니다. 이 둘의 차이점은 정확히 무엇이며 왜 배열이 예상대로 행동하지 않는가? (인수 목록의 첫 번째 요소를 제외한 모든 것을 돌려주고 있습니다).

도움이 되었습니까?

해결책

좀 빠지는.

string.substring.call ( "foo", 1) 및 String (). substring.call ( "foo", 2) :

>>> String.substring.call("foo", 1)
"1"

>>> String().substring.call("foo", 1)
"oo"

Array.slice입니다 어느 것도 아니다 배열 프로토 타입에 첨부 된 슬라이스 함수 또는 인스턴스 배열 인스턴스 (Array () 또는 [])에 첨부 된 슬라이스 함수를 올바르게 참조합니다.

Array.slice가 널이 없다는 사실은 객체 (/function/constructor) 자체를 잘못 구현 한 것입니다. IE에서 동등한 코드를 실행 해보면 Array.slice가 Null이라는 오류가 발생합니다..

이것이 바로 Array.slice가 올바르게 행동하지 않는 이유입니다 (String.substring).

증명 (다음은 Slice ()의 정의를 기반으로하지 말아야 할 것입니다 ... 위의 substring ()과 마찬가지로) :

>>> Array.slice.call([1,2], [3,4])
3,4

이제 인스턴스화 된 개체에서 Slice ()를 올바르게 호출하면 또는 배열 프로토 타입, 당신이 기대하는 것을 얻을 수 있습니다.

>>> Array.prototype.slice.call([4,5], 1)
[5]
>>> Array().slice.call([4,5], 1)
[5]

더 많은 증거 ...

>>> Array.prototype.slice == Array().slice
true
>>> Array.slice == Array().slice
false

다른 팁

배열은 특수한 기능이지만 (배열을 초기화하는 데 사용) 기능입니다. Array.slice는 배열 프로토 타입의 Slice () 함수에 대한 참조입니다. 생성자 (즉, 배열) 자체가 아닌 배열 객체에서만 호출 될 수 있습니다. Array ()가 빈 배열을 반환하면 배열이 특별히 작동하는 것 같습니다. 이것은 구축되지 않은 생성자 기능에 대해서는 작동하지 않는 것 같습니다 (새로 사용해야 함). 그래서

Array().slice.call

와 같다

[].slice.call

컨텍스트 매개 변수가 제공되지 않기 때문에 제공된 예제에서 slice.call ()에 대한 호출은 어떻게 작동합니까? Slice는 자체 호출 방법을 구현하여 JavaScript의 호출 방법을 무시합니까? 호출 및 적용 메소드는 첫 번째 매개 변수로 객체를 사용하여 호출에 적용 할 컨텍스트 (이) 개체를 지정합니다.

나는 믿는다 정렬 유형이고 정렬() 생성자 함수입니다.

주위를 엉망으로 만들었습니다 개똥 벌레:

>>> Array === Array()
false

>>> Array.constructor
Function()

>>> Array().constructor
Array()

잘,

보고 있습니다 http://www.devguru.com/technologies/ecmascript/quickref/slice.html

Array (). 슬라이스는 배열 클래스의 함수 (생성자)이며 데이터 구성원으로 사용할 수 없습니다. '()'를 사용하지 않으려면 배열에서 호출해야합니다. IE -Arguments.slice (1)

내 생각에 배열은 프로토 타입이고 Array ()는 실제 배열 객체 인 것입니다. JavaScript 해석에 따라 내장 객체 유형의 프로토 타입 방법을 직접 호출하는 것이 작동하거나 그렇지 않을 수 있습니다. 나는 사양이 작동해야한다고 말하지 않고, 인스턴스화 된 객체에서 그것을 부르는 것만으로도 작동한다고 생각하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top