{} 또는 new Object ()를 사용하여 JavaScript로 빈 객체를 만드시겠습니까?


370

거기에 두 개의 서로 다른는JavaScript에서 빈 객체를 만드는 방법 가지가 있습니다.

var objectA = {}
var objectB = new Object()

스크립트 엔진이 처리하는 방법에 차이가 있습니까? 다른 것을 사용하는 이유가 있습니까?

마찬가지로 다른 구문을 사용하여 빈 배열을 만들 수도 있습니다.

var arrayA = []
var arrayB = new Array()

6
경고 : 매우 자극적 인 버그를 일으킬 수있는 사소한 차이가 있습니다! Object 프로토 타입에서 "{}"에 빈 오브젝트를 지정하면 "new"연산자로 작성된 모든 오브젝트 인스턴스에서 동일한 오브젝트 인스턴스가됩니다. "new Object ({})"를 사용하는 동안 인스턴스가 다릅니다.
peterh-복 직원 모니카

언급 할 가치 var objectA = {} var objectB = new Object()가있는 것은 동일한 결과를 낳을 세 번째 구조물이 있다는 것입니다.var objectC = Object.create(Object.prototype);
kalitsov

{}[] 사용 {}대신에 new Object(). []대신 사용하십시오 new Array(). 멤버 이름이 순차 정수인 경우 배열을 사용하십시오. 멤버 이름이 임의의 문자열 또는 이름 인 경우 개체를 사용하십시오. 출처
ilgaar 2016 년

new Object()그리고 {}매우 객체를 비어 있지 않은, 그들은 Object.prototype에있는 개체입니다. Object.create(null)정말로 빈 객체에 사용할 수 있습니다 (최소한 mozilla 문서에 따르면 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )

답변:


459

사물

사용하는 이점이 없습니다 new Object();- 반면, {};코드를 더욱 작고, 더 읽기 쉽게 만들 수 있습니다.

빈 객체를 정의하는 것은 기술적으로 동일합니다. {}구문은 짧고 깔끔한 (이하 자바 틱)이며, 즉시 개체 인라인을 채울 수 있습니다 -과 같이 :

var myObject = {
        title:  'Frog',
        url:    '/img/picture.jpg',
        width:  300,
        height: 200
      };

배열

배열의 경우, 예외를 제외하고 new Array();over를 사용하면 거의 이점이 없습니다 [];.

var emptyArray = new Array(100);

포함 된 모든 슬롯 100 항목 긴 배열을 생성 undefined- 좋은 / (같은 특정 상황에서 유용 할 수있다 (new Array(9)).join('Na-Na ') + 'Batman!').

내 추천

  1. 절대 사용하지 마십시오 new Object();-그것은 더 {};어리 석고 어리 석습니다.
  2. [];미리 정의 된 길이로 "빈"배열을 빠르게 만들어야하는 경우를 제외하고 항상 사용하십시오 .

22
101 번째 위치에서 Array (100) 구문을 사용하더라도 동일한 배열이 정의되지 않았습니다. 숫자가 실제로하는 유일한 것은 length 속성 값을 변경하는 것입니다.
Jason Bunting

6
@Pablo에 대해서는 잘못된 것이 없습니다 new Array(100). 문학을 읽으십시오 : developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Már

9
@Pablo 나는 당신의 주장이 무엇인지 전혀 모른다. Douglas Crockford와 마찬가지로을 사용하는 것이 좋습니다 []. 거기에 논쟁이 없습니다. 그러나 당신 new Array(100)은 어떻게 든 "유효하지 않다"고 주장했다 . 그것은 사실이 아니다.
Már Örlygsson

10
또한 new Array(1,2,3)결과는 [1,2,3]이지만 결과 new Array(1)아닙니다[1] . 따라서의 의미 Array는 일관성이없고 불필요하게 혼동됩니다.
Dancrumb

3
그 추가 거라고 Object.create(null)반면, 빈 객체를 생성하는 데 유용 할 수 있습니다 { }개체 프로토 타입에서 상속됩니다.
Meow

90

예, 차이가 있습니다. 동일하지 않습니다. 동일한 결과를 얻을 수 있지만 엔진은 두 가지 방식으로 다르게 작동합니다. 그중 하나는 객체 리터럴이고 다른 하나는 생성자입니다. 자바 스크립트에서 객체를 만드는 두 가지 방법입니다.

var objectA = {} //This is an object literal

var objectB = new Object() //This is the object constructor

JS에서는 모든 것이 객체이지만 new Object ()를 사용하여 다음 사항에 대해 알고 있어야합니다. 매개 변수를 수신 할 수 있으며 해당 매개 변수에 따라 문자열, 숫자 또는 빈 오브젝트 만 작성합니다.

예를 들어 : new Object(1)는 숫자를 반환합니다. new Object("hello")문자열을 반환합니다. 즉, 개체 생성자가 매개 변수에 따라 개체 생성을 문자열, 숫자 등과 같은 다른 생성자에게 위임 할 수 있음을 의미합니다. 동적 데이터를 관리 할 때이 점을 명심해야합니다. 객체 생성

많은 제작자들은 특정 리터럴 표기법을 대신 사용할 수있을 때 객체 생성자를 사용하지 않는 것이 좋습니다. 여기서 생성하는 것이 코드에서 기대하는 것임을 확신 할 수 있습니다.

자세한 내용을 찾으려면 javascript의 리터럴 표기법과 생성자 간의 차이점에 대해 자세히 읽어 보는 것이 좋습니다.


리터럴 표기법은 사실 동적 데이터 객체를 생성하기에 더 읽기 쉽고 간결합니다.
Sid

12

이것들은 최종 결과가 같지만 리터럴 구문을 사용하면 JSON 구문 (JavaScript 리터럴 객체 구문의 문자열 화 하위 집합)에 익숙해 지도록 도울 수 있으므로 추가하는 것이 좋습니다. .

다른 한 가지 : new연산자 를 잊어 버린 경우 미묘한 오류가 발생할 수 있습니다 . 따라서 리터럴을 사용하면 해당 문제를 피할 수 있습니다.

궁극적으로 상황과 선호도에 따라 다릅니다.


8

오브젝트 및 배열 리터럴 구문 {} / []은 JavaScript 1.2에서 도입되었으므로 4.0 이전의 Netscape Navigator 버전에서는 사용할 수 없으며 구문 오류가 발생합니다.

내 손가락은 여전히 ​​새로운 Array ()를 말하지만, 나는 아주 노인입니다. 고맙게도 Netscape 3는 오늘날 많은 사람들이 고려해야 할 브라우저가 아닙니다 ...


11
넷스케이프 3? 남자, 그것은 지난 세기에 있었다 ! :-D
Tomalak

8
var objectA = {}

내 경험상 훨씬 더 일반적으로 사용되므로 '표준'을 채택하고 일부 입력을 저장하는 것이 가장 좋습니다.


1
더 빨리 달리거나 타이핑하는 것이 더 빠릅니까?
hippietrail

글쎄, 필자는 "입력"을 의미했지만 여분의 구문 분석 시간을 감안할 때 실행 속도가 약간 빠를 것입니다. :-)
Bobby Jack

2
또한 리터럴은 일반적으로 구문 분석 시간에 작성되지만 new Object런타임에 실행해야합니다.
Phrogz

8

나는 여기{} 에있는 자바 스크립트 비디오 중 하나 에서 좋은 코딩 규칙 으로 추천 되었다고 생각 합니다. 의사 클래식 상속에 필요합니다. 이 방법은 이것이 고전적인 객체 지향 언어가 아니라 프로토 타입 언어임을 상기시켜줍니다. 따라서 생성자 함수를 사용할 때만 실제로 필요한 시간 입니다. 예를 들면 다음과 같습니다.newvar obj = {};new

var Mammal = function (name) {
  this.name = name;
};

Mammal.prototype.get_name = function () {
  return this.name;
}

Mammal.prototype.says = function() {
  return this.saying || '';
}

그런 다음 다음과 같이 사용됩니다.

var aMammal = new Mammal('Me warm-blooded');
var name = aMammal.get_name();

반대로 사용 {}하는 또 다른 이점 new Object은 JSON 스타일 객체 리터럴을 수행하는 데 사용할 수 있다는 것입니다.


7

배열 인스턴스화 성능

길이가없는 배열을 생성하려는 경우 :

var arr = []; 보다 빠르다 var arr = new Array();

특정 길이의 빈 배열을 만들려면

var arr = new Array(x);보다 빠르다 var arr = []; arr[x-1] = undefined;

벤치 마크를 보려면 다음을 클릭하십시오. https://jsfiddle.net/basickarl/ktbbry5b/

그러나 둘 다의 메모리 공간을 모르는 경우 new Array()더 많은 공간 을 차지 한다고 상상할 수 있습니다 .


arr = new Array(x)로 색인 arr = []; arr.length = x;을 할당하지 않는 것과 같습니다 . x-1undefined
Bergi

2

이것은 본질적으로 동일합니다. 더 편리한 것을 사용하십시오.


아마도 여기에 자바 스크립트에 대해 너무 깊이 파고 들고 있지만 동일합니까? {proto} Object가 null 이 아닌 반면 {proto} {}가 'Object.prototype'입니까?
Izhaki

@Izhaki의 프로토 타입 Object이 null입니다. 맞습니다. Object프로토 타입 체인을 종료 하기 때문 입니다. 그러나 객체 인스턴스 에는 프로토 타입이 없으며 생성자 만 프로토 타입을 가지고 있습니다. 그리고 (new Object()).constructor === ({}).constructor->true
Tomalak

그렇다면 이것이 맞지 않습니까?
이자키

내 요점은 : new Object()빈 Object 인스턴스를 생성합니다. {}빈 Object 인스턴스를 생성합니다. 이 두 가지 사례는 완전히 구별 할 수 없습니다. 링크 된 예제는 다른 것을 수행하고 (시제품 체인을 수정 함) 실제로 적용되지 않습니다-또는 나는 당신의 주장을 이해하지 못합니다.
Tomalak

1

OK , 같은 일을하는 단 2 가지 방법이 있습니다! 하나는 호출 object literal되고 다른 하나는 함수입니다 constructor!

그러나 계속 읽으십시오. 공유하고 싶은 몇 가지가 있습니다.

를 사용 {}하면 코드를 더 읽기 쉽게 만들면서 Object권장하지 않는 다른 내장 함수 또는 인스턴스를 만들 수 있습니다 .

또한 객체 함수는 Object(params)... 과 같은 함수이므로 매개 변수를 가져옵니다 .{} JavaScript에서 객체를 시작하는 순수한 방법입니다 ...

객체 리터럴을 사용하면 다른 개발자가 코드를 훨씬 깨끗하고 쉽게 읽을 수 있으며 JavaScript의 모범 사례와 인라인됩니다 ...

Javascript의 Object는 거의 모든 것이 될 수 있지만 Javascript 객체 {}만 가리키고 작동 방식을 테스트하려면 Javascript 코드 또는 콘솔에서 아래를 수행하십시오.

var n = new Object(1); //Number {[[PrimitiveValue]]: 1}

놀랍게도, 그것은 숫자를 만들고 있습니다!

var a = new Object([1,2,3]); //[1, 2, 3]

그리고 이것은 배열을 만들고 있습니다!

var s = new Object('alireza'); //String {0: "a", 1: "l", 2: "i", 3: "r", 4: "e", 5: "z", 6: "a", length: 7, [[PrimitiveValue]]: "alireza"}

그리고이 이상한 결과 String!

따라서 객체를 만드는 경우 표준 코드를 사용하고 위와 같은 코드 사고를 피하기 위해 객체 리터럴을 사용하는 {}것이 좋습니다. 내 경험에서 성능을 사용하는 것이 더 좋습니다!


당신은 Dezfooli입니까? 이란에서?
Ehsan

안녕 Ehsan, 그렇습니다. 그러나 나는이란 친구에 살고 있지 않습니다. 만나서 반가워요 ...
Alireza

전화 번호를 저장하고 프로그래밍에 대한 도움을받을 수 있습니까?
Ehsan

전보를 사용하는 것이 보입니다.
Ehsan

물론, 전보에 대한 지식을 확실히 공유 할 수 있습니다! ___
Alireza
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.