ECMAScript 5.1 사양§15.4.4.4 내용:
concat 함수는 의도적으로 범용적으로 설계되었습니다. 따라서 이 값이 반드시 Array 객체일 필요는 없습니다. 따라서 다른 유형의 객체로 전송하여 메서드로 호출할 수 있습니다.
이 문서의 코드는 모두 []를 Array.prototype에 대한 바로가기로 사용합니다. 이는 이미 매우 일반적인 기술이지만 가독성은 낮습니다. 객체 인스턴스를 통해 액세스합니다. Array.prototype의 메소드 그러나 이 액세스 메소드는 최신 JavaScript 엔진에서 너무 빠르기 때문에 이러한 JavaScript 엔진이 더 이상 이 호출 메소드에서 배열 인스턴스를 생성하지 못할 수도 있습니다. 이 기사의 모든 예제는 Firefox 및 V8에서 시도되었습니다.
concat이 범용 메서드인지 살펴보겠습니다. 범용 메서드라면 this의 값이 실제 배열인지 또는 배열과 유사한 객체(길이가 있는)인지는 중요하지 않습니다. 속성을 가지며 인덱스로 각 요소에 액세스할 수 있으므로 메서드의 반환 결과는 먼저 배열에서 concat 메서드를 호출하려고 시도합니다.
> ["hello"].concat(["world"])
["hello " , "world"]
> [].concat.call(["hello"], ["world"]) // 위와 동일
["hello", "world" ]
그런 다음 배열과 유사한 객체를 사용하여 위의 연결 작업을 수행합니다.
> [].concat.call({ 0: "hello", length: 1 }, ["world" ])
[ { '0': 'hello', length: 1 }, 'world' ]
특수 변수 인수도 배열과 유사한 객체입니다. 예상했던 것:
> function f() { return [].concat .call(arguments, ["world"]) }
> f("hello")
[ { '0': 'hello' }, 'world' ]
실제 범용 메서드는 다음과 같아야 합니다 Array.prototype.push:
> var arrayLike = { 0: "hello", 길이: 1 }; "world")
2
> arrayLike
{ '0': 'hello', '1': 'world', 길이: 2 }
번역자 주: 브라우저는 표준에 따라서만 구현하므로 버그 문제는 없습니다.