{} Veya yeni Object () ile JavaScript'te boş bir nesne mi oluşturuyorsunuz?


370

JavaScript'te boş bir nesne oluşturmanın iki farklı yolu vardır :

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

Betik motorunun bunları işleme biçiminde herhangi bir fark var mı? Birini diğerinin üzerinde kullanmak için herhangi bir neden var mı?

Benzer şekilde, farklı sözdizimi kullanarak boş bir dizi oluşturmak da mümkündür:

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

6
Uyarı: çok rahatsız edici hatalara neden olabilecek küçük bir fark var! Bir Object prototipinde "{}" öğesine atanan boş bir nesne oluşturmak, "new" operatörü tarafından oluşturulan her Object örneğinde aynı Object örneği olacaktır. "Yeni Nesne ({})" kullanırken, farklı örnekleriniz olacaktır.
peterh - Monica'yı

Ayrıca var objectA = {} var objectB = new Object(), aynı sonucu verecek üçüncü bir yapı olduğunu belirtmek gerekir :var objectC = Object.create(Object.prototype);
Kalitsov 26:16

{}ve [] Kullanım {}yerine new Object(). Yerine []kullanın new Array(). Üye adları sıralı tamsayılar olduğunda dizileri kullanın. Üye adları rastgele dizeler veya adlar olduğunda nesneleri kullanın. kaynak
ilgaar

new Object()ve {}oldukça boş nesneler değiller, bunlar Object.prototype olan nesnelerdir. Object.create(null)Gerçekten boş bir nesne için kullanabilirsiniz (en azından mozilla belgelerine göre: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )

Yanıtlar:


459

Nesneler

Kullanmanın bir yararı yoktur new Object();- oysa {};kodunuzu daha kompakt ve daha okunabilir hale getirebilirsiniz.

Boş nesneleri tanımlamak için teknik olarak aynıdırlar. {}Sözdizimi kısa, kıvrımlara (daha az Java imsi), ve anında nesne satır içi doldurmak için izin verir - şöyle:

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

Diziler

Diziler için, benzer şekilde, küçük bir istisna dışında, new Array();aşırı kullanımın neredeyse hiçbir faydası yoktur [];:

var emptyArray = new Array(100);

undefinedbelirli durumlarda hoş / yararlı olabilecek tüm yuvaları içeren 100 öğe uzunluğunda bir dizi oluşturur .(new Array(9)).join('Na-Na ') + 'Batman!' ) .

Benim tavsiyem

  1. Asla kullanmayın new Object();- daha karmaşık{}; ve aptalca görünüyor.
  2. Her zaman [];- önceden tanımlanmış uzunlukta bir "boş" dizi oluşturmanız gerekmediği sürece kullanın .

22
Array (100) sözdizimini kullansanız bile, aynı dizinin 101. konumunda tanımlanmamıştır; bu sayının gerçekten yaptığı tek şey length özelliğinin değerini değiştirmektir.
Jason Bunting

6
@Pablo hakkında geçersiz bir şey yok new Array(100). Literatürü okuyun: developer.mozilla.org/tr/JavaScript/Reference/Global_Objects/…
Már Örlygsson

9
@Pablo Tartışmanızın ne olduğu hakkında hiçbir fikrim yok. Douglas Crockford gibi, kullanmanızı tavsiye ederim []. Orada tartışma yok. Bununla birlikte, bunun new Array(100)bir şekilde "geçersiz" olduğunu iddia ettiniz, ki bu doğru değil.
Már Örlygsson

10
Ayrıca unutmayın new Array(1,2,3)sonuçlanır [1,2,3], ancak new Array(1)yok değil neden [1]; dolayısıyla, anlambilimi Arraytutarsız ve gereksiz yere kafa karıştırıcıdır.
Dancrumb

3
Bunu eklersiniz Object.create(null), oysa boş nesne oluşturmak için yararlı olabilir { }Nesne prototip devralır.
Miyav

90

Evet, bir fark var, onlar aynı değil. Aynı sonuçları alacağınız doğrudur, ancak motor her ikisi için de farklı bir şekilde çalışır. Bunlardan biri bir nesne değişmezidir ve diğeri bir yapıcıdır, javascript'te bir nesne oluşturmanın iki farklı yolu.

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

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

JS'de her şey bir nesnedir, ancak yeni Object () ile şu şeyin farkında olmalısınız: Bir parametre alabilir ve bu parametreye bağlı olarak bir dize, bir sayı veya yalnızca boş bir nesne oluşturur.

Örneğin:, new Object(1)bir Sayı döndürür.new Object("hello")bir dize döndürürse, nesne oluşturucunun - parametreye bağlı olarak - nesne oluşturma işlemini dize, sayı vb. gibi diğer kuruculara devredebileceği anlamına gelir. Dinamik verileri yönetirken nesne yarat ..

Birçok yazar, bunun yerine belirli bir hazır gösterimi kullanabileceğinizde nesne oluşturucuyu kullanmamanızı önerir; burada oluşturduğunuz şeyin kodunuzda olmasını beklediğiniz şey olduğundan emin olabilirsiniz.

Daha fazla bilgi edinmek için javascript üzerinde gerçek gösterim ve kurucular arasındaki farklar hakkında daha fazla okuma yapmanızı öneririm.


Değişmez gösterim aslında okunabilir ve dinamik veri nesneleri oluşturmak için özlüdür.
Sid

12

Bunlar aynı sonuç sonucuna sahiptir, ancak basit bir sözdizimi kullanmanın bir kişinin JSON sözdizimine (JavaScript değişmez nesne sözdiziminin dize ified bir alt kümesi) alışmasına yardımcı olabileceğini ekleyebilirim, bu yüzden içine girmek iyi bir uygulama olabilir .

Başka bir şey: newoperatörü kullanmayı unutursanız küçük hatalarınız olabilir . Yani, değişmez değerleri kullanmak bu sorunu önlemenize yardımcı olacaktır.

Sonuçta, duruma ve tercihe bağlı olacaktır.


8

Nesne ve dizi değişmez sözdizimi {} / [], JavaScript 1.2'de tanıtıldı, bu nedenle Netscape Navigator'ın 4.0'dan önceki sürümlerinde kullanılamıyor (ve sözdizimi hatası üretecek).

Parmaklarım hala yeni Array () demeye devam ediyor, ama ben çok yaşlı bir adamım. Neyse ki Netscape 3, birçok insanın bugün düşünmesi gereken bir tarayıcı değil ...


11
Netscape 3? Dostum, önceki yüzyıldaydı ! :-D
Tomalak

8
var objectA = {}

çok daha hızlı ve benim tecrübelerime göre, daha yaygın olarak kullanıldığından, muhtemelen 'standardı' benimsemek ve yazmayı kaydetmek en iyisidir.


1
Çalıştırmak için hızlı mı yoksa yazmak için mi daha hızlı?
2012'de hippietrail

Kuşkusuz, "yazmak" demek istedim ama ekstra ayrıştırma süresi göz önüne alındığında, muhtemelen çok daha hızlı yürütme açısından da :-)
Bobby Jack

2
Ayrıca, değişmez değerler genellikle ayrıştırma zamanında oluşturulurken new Object, çalışma zamanında yürütülmesi gerekir.
Phrogz

8

Buradaki{} Javascript videolarından birinde iyi bir kodlama kuralı olarak önerildiğine inanıyorum . psödoklasik kalıtım için gereklidir. şekilde bu bir klasik nesne yönelimli dil ama prototypal biri olmadığını hatırlatmak için yardımcı olur. Böylece gerçekten ihtiyacınız olan tek zaman yapıcı işlevlerini kullanmaktır. Örneğin: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 || '';
}

Sonra şöyle kullanılır:

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

Kullanmanın bir başka avantajı {}olarak karşı new ObjectJSON tarzı nesne değişmezleri yapmak için kullanabilirsiniz edilir.


7

Dizi örnekleme performansı

Uzunluğu olmayan bir dizi oluşturmak istiyorsanız:

var arr = []; daha hızlı var arr = new Array();

Belirli bir uzunlukta boş bir dizi oluşturmak istiyorsanız:

var arr = new Array(x);daha hızlıdır var arr = []; arr[x-1] = undefined;

Kıyaslamalar için aşağıdakileri tıklayın: https://jsfiddle.net/basickarl/ktbbry5b/

Ancak ikisinin de bellek ayak izini bilmiyorum, new Array()bunun daha fazla yer kapladığını hayal edebiliyorum .


arr = new Array(x)dizini ile arr = []; arr.length = x;atamaya değil eşittir . x-1undefined
Bergi

2

Bu aslında aynı şey. Daha uygun bulduklarınızı kullanın.


Belki burada javascript için çok derin araştırıyorum, ama aynı mı? {Proto} Objectdeğeri null değil, {proto} {}ise 'Object.prototype' mi?
Izhaki

@Izhaki Prototipi Objectnull, bu doğru. Çünkü Objectprototip zincirini sonlandırır. Ancak nesne örneklerinin bir prototipi yoktur, yalnızca kurucuların bir prototipi vardır. Ve (new Object()).constructor === ({}).constructor->true
Tomalak

Peki bu yanlış mı?
Izhaki

Benim açımdan: new Object()boş bir Object örneği verir. {}boş bir Object örneği verir. Bu örneklerin her ikisi de kesinlikle ayırt edilemez. Bağlandığınız örnek başka bir şey yapıyor (prototip zincirini değiştiriyor) ve burada gerçekten geçerli değil - ya da argümanınızı anlamıyorum.
Tomalak

1

Tamam , aynı şeyi yapmanın sadece 2 farklı yolu var! Biri aradı object literal, diğeri bir işlev constructor!

Ama okuyun, paylaşmak istediğim birkaç şey var:

Kullanılması {}, kodunuzu daha okunabilir hale getirirken, Objecttavsiye edilmeyen yerleşik işlevlerin veya diğer yerleşik işlevlerin örneklerini oluştururken ...

Ayrıca, Nesne işlevi parametreleri gibi bir işlev olarak alır, Object(params)ancak ... {}bir nesneyi JavaScript'te başlatmanın saf bir yoludur ...

Nesne hazır bilgisi kullanmak, kodunuzun diğer geliştiriciler için daha temiz ve okunmasını kolaylaştırır ve JavaScript'teki en iyi uygulamalarla aynı satırdadır ...

Javascript'teki Nesne neredeyse her şey olabilir, {}ancak javascript nesnelerine işaret eder, nasıl çalıştığını test etmek için javascript kodunuzda veya konsolunuzda şunları yapın:

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

Şaşırtıcı bir şekilde, bir Sayı yaratıyor!

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

Ve bu bir Dizi yaratıyor!

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

ve bu garip sonuç String!

Bu nedenle, bir nesne oluşturuyorsanız, standart bir koda sahip olmak ve yukarıdaki gibi herhangi bir kod kazasından kaçınmak için nesne değişmezini kullanmanız önerilir {}.


sen Dezfooli misin? İran'da?
Ehsan

Merhaba Ehsan, evet, ama İran'da yaşamıyorum dostum, burada harika bir profilin var! Tanıştığımıza memnun oldum ...
Alireza

telefonunuzu kaydedebilir ve programlama hakkında sizden yardım alabilir miyim?
Ehsan

Telgraf kullandığını görüyorum.
Ehsan

Evet, elbette, telgrafla ilgili bazı bilgileri kesin olarak paylaşabiliriz! ___
Alireza
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.