Javascript nesnesi değişmez: {a, b, c} tam olarak nedir?


88

Sahip olduğum soru en iyi , kodu aşağıda olan bu jsfiddle aracılığıyla verilir :

var a = 1, b = 'x', c = true;

var d = {a: a, b: b, c: c}; // <--- object literal
var e = [a, b, c];          // <--- array
var f = {a, b, c};          // <--- what exactly is this??

// these all give the same output:
alert(d.a  + ', ' + d.b +  ', ' + d.c );
alert(e[0] + ', ' + e[1] + ', ' + e[2]);
alert(f.a  + ', ' + f.b +  ', ' + f.c );

Ne tür bir veri yapısıdır f? Sadece kısaltması dmı?


25
İlki aslında JSON değil.
GolezTrol


1
Tamam @GolezTrol, anahtarlar çift tırnak içinde olmadığı için kesinlikle JSON değil. Tam olarak ne Yani olurdu aramak dbenim sonrası veri yapısını?
drmrbrewer

6
Hiçbir sürümün geçerli JSON olmadığını anlamak önemlidir. Verileri JSON dizesi olarak göstermenin yolu şu olacaktır{"a" : 1, "b" : "x", "c" : true }
Benjamin Gruenbaum

14
@drmrbrewer Bir nesne değişmezidir . JSON bir serileştirme formatı iken javascript kodu olduğu için JSON değildir . Örneğin var a = '{ "a" : "value"}'-> a, aracılığıyla bir nesneye seri durumdan çıkarılabilen bir dizge tutar JSON.parse.
moonwave99

Yanıtlar:


71

ES6'daki bir Nesne Başlatıcı Özellik Kestirimidir.

var f = {a, b, c, d:1}; // Will be equal to {a:a, b:b, c:c, d:1}

Bu işe yarar çünkü özellik değeri, özellik tanımlayıcısıyla aynı ada sahiptir. Bu , en son ECMAScript 6 taslak Rev 13'teki Object Initialiser sözdizimine ( bölüm 11.1.5 ) yeni bir ek . Ve elbette, tıpkı ECMAScript 3'ten belirlenen sınırlamalar gibi, mülk adınız olarak ayrılmış bir kelime kullanamazsınız.

Böyle bir kısaltma, kodunuzu önemli ölçüde değiştirmez, yalnızca her şeyi biraz daha tatlı hale getirir!

function createCar(name, brand, speed) {
  return { type: 'Car', name: name, brand: brand, speed: speed };
}

// With the new shorthand form
function createSweetCar(name, brand, speed) {
  return { type: 'Car', name, brand, speed }; // Yes it looks sweet.
}

Bu gösterimler için destek için lütfen uyumluluk tablosuna bakın. Desteklenmeyen ortamlarda, bu gösterimler sözdizimi hatalarına yol açacaktır.

Bu kısa gösterim, nesne eşleştirmesini oldukça güzel bir şekilde sunar:

In ECMAScript5'i biz ne yapardık:

var tmp = getData();
var op  = tmp.op;
var lhs = tmp.lhs;
var rhs = tmp.rhs;

ECMAScript6'da tek bir kod satırı ile yapılabilir :

var { op, lhs, rhs } = getData();

10
Bu neden bir dil özelliği haline gelecek kadar yararlı olsun? İnsanların nesneyi doğrudan değişmez değerler, dönüş değerleri vb. İle başlatması ya da önce nesneyi oluşturması, sonra özellikleri doğrudan ayarlaması çok daha yaygın gibi görünüyor. Aynı isimlere sahip değişkenler oluşturmak, onları örneklemek ve sonunda nesneyi bu şekilde başlatmak alışılmadık görünüyor ... yoksa öyle mi?
Panzercrisis

3
@Panzercrisis Kişisel olarak pek çok istenmeyen ve bulunması zor hatalara yol açacak gibi görünüyor. if(a = 1) {...}Geçerli sözdizimine izin vermekle aynı şekilde .
Anthony Grist

1
@Panzercrisis Bence a, b ve c'nin daha karmaşık veri yapıları olduğunu ve f'nin diğer karmaşık özellikleri de içerdiğini düşünürseniz en azından mantıklı geliyor. Yine de harika bir fikir olduğundan emin değilim, ama bunun yararlı olduğunu görebiliyordum.
Josh Rumbut

1
@Panzercrisis gibi bir lambda işlevinden bir demeti döndürmek çok yararlı olabilir (a, b) => {a, b}. En azından aynı özelliği nasıl kullandım C#.
Vincent van Weele der

2
@Alex bu nasıl bir "tuhaflık" veya "karmaşık"? Normalde birçok kod tabanında bulacağınız çok yaygın bir şey, anahtarın değer olarak verilen değişkenle eşleştiği bir nesneyi başlatmaktır {id: id, data: data, isSelected: isSelected}. Yerel olanlara gelen ve sonra geri gelen nesneleri eşlerken çok şey olur. Çoğu durumda, öğelerinize biraz farklı ad vermek istemezsiniz {identifier: id, viewData: data, isElementSelected: isSelected }, tam olarak bahsettiğiniz "ilginç", "karmaşık" ve "kafa karıştırıcı" dır.
VLAZ

77
var f = {a, b, c};

ES6 (ECMAScript 2015) ile geldi ve tam olarak aynı anlama geliyor:

var f = {a: a, b: b, c: c};

Nesne Değişmez Özellik Değeri Kestirmeleri (veya sadece özellik değeri kısaltması, steno özellikleri) olarak adlandırılır.

Ayrıca stenoları klasik ilklendirme ile birleştirebilirsiniz:

var f = {a: 1, b, c};

Daha fazla bilgi için bkz. Nesne başlatıcı .


12
var f = {a, b, c};          // <--- what exactly is this??

JavaScript'te yeni ECMAScript 2015 gösterimini kullanarak bir nesneyi tanımlar:

Gereğince Mozilla Geliştirici Ağı :

"Nesneler, new Object (), Object.create () veya değişmez notasyon (başlatıcı gösterimi) kullanılarak başlatılabilir. Nesne başlatıcı, sıfır veya daha fazla özellik adı çiftinin ve bir nesnenin ilişkili değerlerinin bir listesidir. küme ayraçları ({}). "

var a = "foo", 
    b = 42, 
    c = {};

// Shorthand property names (ES6)
var o = { a, b, c }; 

eşdeğerdir:

var a = "foo", 
    b = 42,
    c = {};

var o = { 
  a: a,
  b: b,
  c: c
};
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.