[javascript] JavaScript에서 “arguments”객체를 배열로 변환하려면 어떻게해야합니까?

argumentsJavaScript 의 객체는 이상한 사마귀입니다. 대부분의 상황에서 배열처럼 작동하지만 실제로 는 배열 객체 가 아닙니다 . 그 이후 완전히 다른 정말 뭔가 , 그것에서 유용한 기능이없는 Array.prototypeforEach, sort, filter,와 map.

간단한 for 루프를 사용하여 arguments 객체에서 새 배열을 구성하는 것은 간단합니다. 예를 들어이 함수는 인수를 정렬합니다.

function sortArgs() {
    var args = [];
    for (var i = 0; i < arguments.length; i++)
        args[i] = arguments[i];
    return args.sort();
}

그러나 이것은 매우 유용한 JavaScript 배열 함수에 액세스하기 위해 수행해야하는 다소 불쌍한 일입니다. 표준 라이브러리를 사용하여 기본 제공 방법이 있습니까?



답변

나머지 매개 변수를 사용하는 ES6

ES6를 사용할 수있는 경우 다음을 사용할 수 있습니다.

나머지 매개 변수

function sortArgs(...args) {
  return args.sort(function (a, b) { return a - b; });
}

document.body.innerHTML = sortArgs(12, 4, 6, 8).toString();

링크 에서 읽을 수 있듯이

rest 매개 변수 구문을 사용하면 무한한 수의 인수를 배열로 나타낼 수 있습니다.

...구문 이 궁금하면 Spread Operator 라고하며 여기에서 더 읽을 수 있습니다 .

Array.from ()을 사용하는 ES6

Array.from 사용 :

function sortArgs() {
  return Array.from(arguments).sort(function (a, b) { return a - b; });
}

document.body.innerHTML = sortArgs(12, 4, 6, 8).toString();

Array.from Array-like 또는 Iterable 객체를 Array 인스턴스로 변환하기 만하면됩니다.



ES5

실제로 arguments 객체에 Arrayslice함수를 사용 하면 표준 JavaScript 배열로 변환됩니다. Array의 프로토 타입을 통해 수동으로 참조하면됩니다.

function sortArgs() {
    var args = Array.prototype.slice.call(arguments);
    return args.sort();
}

왜 이것이 작동합니까? ECMAScript 5 문서 자체 에서 발췌 한 내용은 다음과 같습니다.

참고 :이 slice기능은 의도적으로 일반적입니다. 값이 Array 객체 일 필요는 없습니다 . 따라서 방법으로 사용하기 위해 다른 종류의 객체로 전송할 수 있습니다. slice함수가 호스트 객체에 성공적으로 적용될 수 있는지 여부 는 구현에 따라 다릅니다.

따라서 속성 slice이있는 모든 항목에서 편리하게 작동합니다.lengtharguments


경우 Array.prototype.slice너무 많은 당신을 위해 입의, 당신은 약간 배열 리터럴을 사용하여 축약 할 수 있습니다 :

var args = [].slice.call(arguments);

그러나 나는 이전 버전이 더 명시 적이라고 생각하는 경향이 있으므로 대신 선호합니다. 배열 리터럴 표기법을 남용하면 해키 느낌이 들고 이상하게 보입니다.


답변

또한 참조 가치가 이 블루 버드 약속 라이브러리 위키 페이지를 하는 방법을 관리하는 방법을 보여줍니다 arguments함수 최적화 할 수있는 방법으로 배열로 객체를 V8 자바 스크립트 엔진 아래를 :

function doesntLeakArguments() {
    var args = new Array(arguments.length);
    for(var i = 0; i < args.length; ++i) {
        args[i] = arguments[i];
    }
    return args;
}

이 방법은에 유리하게 사용됩니다 var args = [].slice.call(arguments);. 저자는 또한 빌드 단계가 자세한 정보를 줄이는 방법을 보여줍니다.


답변

function sortArgs(){ return [].slice.call(arguments).sort() }

// Returns the arguments object itself
function sortArgs(){ return [].sort.call(arguments) }

일부 배열 메소드는 의도적으로 대상 객체가 실제 배열 일 필요가 없도록 만들어졌습니다. 대상에는 length 및 index 라는 이름의 속성 만 있으면됩니다 (0 이상의 정수 여야 함).

[].sort.call({0:1, 1:0, length:2}) // => ({0:0, 1:1, length:2})


답변

사용하다:

function sortArguments() {
  return arguments.length === 1 ? [arguments[0]] :
                 Array.apply(null, arguments).sort();
}

Array(arg1, arg2, ...) 보고 [arg1, arg2, ...]

Array(str1) 보고 [str1]

Array(num1)num1요소 가있는 배열을 반환

인수 수를 확인해야합니다!

Array.slice 버전 (느리게) :

function sortArguments() {
  return Array.prototype.slice.call(arguments).sort();
}

Array.push 버전 (슬라이스보다 느리고 빠름) :

function sortArguments() {
  var args = [];
  Array.prototype.push.apply(args, arguments);
  return args.sort();
}

버전 이동 (느리지 만 작은 크기가 더 빠름) :

function sortArguments() {
  var args = [];
  for (var i = 0; i < arguments.length; ++i)
    args[i] = arguments[i];
  return args.sort();
}

Array.concat 버전 (가장 느림) :

function sortArguments() {
  return Array.prototype.concat.apply([], arguments).sort();
}


답변

jQuery를 사용하는 경우 다음과 같은 의견을 쉽게 기억할 수 있습니다.

function sortArgs(){
  return $.makeArray(arguments).sort();
}


답변

ECMAScript 6에서는과 같은 못생긴 해킹을 사용할 필요가 없습니다 Array.prototype.slice(). 대신 스프레드 구문 ( ...)을 사용할 수 있습니다 .

(function() {
  console.log([...arguments]);
}(1, 2, 3))

이상하게 보일지 모르지만 상당히 간단합니다. 단지 arguments‘요소를 추출 하여 배열에 다시 넣습니다. 여전히 이해하지 못하는 경우 다음 예를 참조하십시오.

console.log([1, ...[2, 3], 4]);
console.log([...[1, 2, 3]]);
console.log([...[...[...[1]]]]);

IE 11과 같은 일부 구형 브라우저에서는 작동하지 않으므로 이러한 브라우저를 지원하려면 Babel 을 사용해야합니다 .


답변

다음은 인수를 배열로 변환하는 몇 가지 방법의 벤치 마크 입니다.

저에 관해서는, 소량의 논쟁에 대한 가장 좋은 해결책은 다음과 같습니다.

function sortArgs (){
  var q = [];
  for (var k = 0, l = arguments.length; k < l; k++){
    q[k] = arguments[k];
  }
  return q.sort();
}

다른 경우 :

function sortArgs (){ return Array.apply(null, arguments).sort(); }