javascript 2d - Array.of 대 "[]". "[]"이상의 Array.of를 사용하는 경우?





sort objects (4)


이 방법은 표준화되었을 지 모르지만 여러 브라우저에서 지원되지 않는 것으로 보입니다. 따라서이 방법을 사용하는 것은 위험한 것처럼 보입니다.

이 함수의 유용성은 배열을 선언해야하지만 배열을 어셈블하지 않으려는 경우에 해당하는 것으로 보입니다. 즉, 여러 함수에 인수를 전달하여 배열을 반환 할 수 있기를 원합니다.

그 방법의 정당화에 대한 링크를 따라 가면 다음과 같이됩니다 :

유스 케이스는 funarg로 함수를 전달하기 때문에 리터럴을 쓸 수없는 경우이며, 최종 호출자는 하나의 숫자 arg 또는 여러 개의 arg 만 전달할 수 있습니다. 이 경우 Array는 one-number-arg 경우에 올바른 작업을 수행하지 않습니다.

이것은 기본적으로 "이 함수는 가변 길이 인수 목록을 수신 할 수 있으며 일관되게 올바른 값으로 채워진 배열을 반환합니다"라고 말하지만 배열을 배열로 변환하는 것처럼 실제로이 것을 확신하지는 않습니다. 존재할 필요가 있고 명백하게 많은 브라우저 구현자가 비슷한 사고 방식을 가지고있다.

new Array() 불일치하게 동작한다는 사실에 대한 대체로 Array.of 대한 푸시 :

new Array(2);
// [ , ] 2-element array that's unpopulated

new Array(1,2);
// [1,2] 2-element array populated with the provided values

Array.of항상 후자 버전처럼 작동합니다.

나는 Array.of 발견했을 때 약간의 독서를하고 Array.of .

MDN에 따라,

Array.of () 메서드는 인수의 수 또는 유형에 관계없이 가변 개수의 인수로 새 Array 인스턴스를 만듭니다.

var a = Array.of(1,2,3,4,5);
console.log(a)

그러나 이미 값을 알고 있다면 [] 로 묶어 동일한 출력을 얻을 수도 있습니다. 그래서 우리가 Array.of 를 사용할 수 Array.of 사용해야 할 특정한 시나리오가 있습니까? 또한 [] 이상으로 사용하면 어떤 이점이 있습니까?

편집 1 :

이 질문의 목적은 Array.of vs []new Array vs Array.of




Redu의 답변을 반복하면 ArraySubclass.of 를 사용하여 배열 하위 클래스의 인스턴스를 만들 수 있습니다. 예를 들어, lodash 의 Array 메소드를 중심으로 Array-subclass 래퍼를 만들 수 있습니다.

예 :

_.Array = class extends Array {
  uniq() {
    return _.Array.from(_.uniq(this));
  }
  last() {
    return _.last(this);
  }
  flatten() {
    return _.Array.from(_.flatten(this));
  }
  // ... more methods
}

_.Array.of([1,2,3], [3,4,5]) // <_.Array> [[1,2,3],[3,4,5]]
  .flatten()                 // <_.Array> [1,2,3,3,4,5]
  .uniq()                    // <_.Array> [1,2,3,4,5]
  .last()                    // <number> 5

JSFiddle

편집하다

ES 프록시를 사용하기 위해이 예제를 확장했습니다.

_.Array = class extends Array { }
_.Array.prototype = new Proxy(Array.prototype, {
  get(proto, name) {
    if (name in _) return function (...args) {
        const ret = _[name](this, ...args);
        return Array.isArray(ret) ? _.Array.from(ret) : ret;
    }
    return proto[name];
  }
});

이제 모든 lodash 함수를 사용할 수 있으며 배열을 반환하는 배열은 _(array) 암시 적 체인과 비슷한 _.Array 클래스로 래핑됩니다.




Array.of()Array() / [] 생성자 간에는 미묘한 차이가 있습니다. 일반적으로 Array() 와 마찬가지로 Array.of()Array 객체가 Array 객체이며 Array.constructorfunction Array() 사용하여 결과를 생성합니다.

그러나 Array.of 바인딩 된 컨텍스트를 변경하여 다르게 동작 할 수 있습니다. 바운드 컨텍스트를 생성자로 사용할 수있는 경우 (바인딩 된 객체가 함수 인 경우) 해당 함수를 사용하여 생성합니다. 이제 Array.of() 를 함수에 바인딩하고 어떤 일이 발생하는지 살펴 보겠습니다.

function Test(n){console.log(n)}
Test.prototype.last = function(){return this[this.length-1]};

var what = Array.of.call(Test, [5,6,7], {a:0,b:1}, 42, null, "this is last");
console.log(JSON.stringify(what,null,2));
console.log(what.last());

그래서 우리는 모든 함수 메소드에 액세스 할 수있는 thingy와 생성자의 프로토 타입에있는 배열을 얻었습니다.

그것의 definition 를 기억하는 것이 가장 좋습니다.

비고 2 기능은 의도적으로 일반적인 공장 방법이다. 이 값을 Array 생성자로 할 필요는 없습니다. 따라서 단일 숫자 인수로 호출 할 수있는 다른 생성자로 전달되거나 상속 될 수 있습니다.

OK 배열 서브 클래 싱에 매우 유용 할 수 있습니다. Array 하위 클래스는 Object.setPrototypeOf() 또는 __proto__ 를 포함하여 가능하지만 다소 낙담 한 작업 이며 Array.of() 사용하여 유사한 작업을 수행 할 수 있습니다. 그래서 .. 한때 쓸모없는 Array.of() 가 영웅이되었습니다. 가장 유용한 Array 메소드 중 하나입니다. 어떻게 ..? 어디 보자 ...

function SubArr(){}
SubArr.prototype = Object.create(Array.prototype); // make SubArr.prototype's prototype Array.prototype
SubArr.prototype.last = function(){return this[this.length-1]}; // add prototype methods to SubArr

var what = Array.of.call(SubArr, 1, 2, 3, 4, "this is last");
console.log(JSON.stringify(what,null,2));
console.log(what.last());
console.log(what.map(e => e));
console.log(what instanceof Array);
console.log(Array.isArray(what));
console.log(Object.prototype.toString.call(what));

또한 SubArr.prototype.constructor = Array; 만들려고했습니다 SubArr.prototype.constructor = Array; 그러나 Array.isArray(what) 여전히 false 결과가 발생했습니다.




엄밀히 말하면 의미에는 차이가 없습니다. 선택의 편의성이 떨어집니다.

다음은 귀하의 선택에 영향을 미칠 수있는 몇 가지 요소입니다.

  • 하우스 스타일 : 일부 개발자 그룹은 이미 하나의 컨벤션 또는 다른 컨벤션을 사용합니다.
  • 클라이언트 측 요구 사항 : 문자열 내에서 따옴표를 사용합니까? (아디의 대답 참조).
  • 서버 측 언어 : VB.Net 사람들은 자바 스크립트에 작은 따옴표를 사용하여 스크립트가 서버 측에서 빌드되도록 선택할 수 있습니다 (VB.Net은 문자열에 큰 따옴표를 사용하므로 자바 스크립트 문자열을 쉽게 구별 할 수 있습니다). 작은 따옴표를 사용하는 경우).
  • 라이브러리 코드 : 특정 스타일을 사용하는 라이브러리를 사용하는 경우 동일한 스타일을 직접 사용하는 것이 좋습니다.
  • 개인적 취향 : 하나 또는 다른 스타일이 더 좋아 보일 수도 있습니다.




javascript arrays