Soru Javascript object literal: tam olarak ne {a, b, c}?


Sahip olduğum soru en iyi şekilde bu jsfiddle, kodu aşağıdaki gibidir:

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ı f? Bu sadece bir kısa yol mu d?


76
2017-12-22 11:22


Menşei


İlki aslında JSON değil. - GolezTrol
Bu sadece kısa yol değil, ES6'da birkaç tane daha var - Kos
Tamam @GolezTrol kesinlikle JSON değildir, çünkü anahtarlar çift tırnak içinde değildir. Yani tam olarak ne olur sen ara d yazımdaki veri yapısı? - drmrbrewer
Sürümlerin hiçbirinin geçerli JSON olmadığını anlamak önemlidir. Verileri bir JSON dizesi olarak temsil etme yolu {"a" : 1, "b" : "x", "c" : true } - Benjamin Gruenbaum
@drmrbrewer Bu bir nesne değişmezi. JSON değil çünkü javascript koduJSON bir serileştirme formatı iken. Örneğin var a = '{ "a" : "value"}' -> a bir nesneye seri hale getirilebilen bir dizeyi tutar JSON.parse. - moonwave99


Cevaplar:


Bir Object Initializer Emlak Kestirme ES6'da.

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

Bu özellik değeri özellik tanımlayıcısı ile aynı ada sahip olduğundan çalışır. Bu sözdizimine yeni bir ek Nesne Başlatıcısı (bölüm 11.1.5) en geç ECMAScript 6 taslağı Rev 13. Ve tabi ki, ECMAScript 3'ten belirlenen sınırlamalar gibi, mülk adınız olarak ayrılmış bir kelimeyi kullanamazsınız.

Böyle bir kısa yol, kodunuzu önemli ölçüde değiştirmez, sadece 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 notasyonlar için destek için uyumluluk tablosuna bakınız. Destekleyici olmayan ortamlarda, bu gösterimler sözdizimi hatalarına neden olur.

Bu kestirme gösterim, nesne eşleştirmesini oldukça güzel sunar:

İçinde ECMAScript5'i Ne yapardık?

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

İçinde yapılabilir ECMAScript6 tek bir kod satırı ile:

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

59
2017-12-22 11:24



Bu neden bir dil özelliği olmak için bu kadar yararlı olur? İnsanların nesneyi doğrudan editörlerle, geri dönüş değerleriyle ve benzeriyle başlatması ya da ilk önce nesneyi oluşturması, sonra da özellikleri doğrudan belirlemesi daha yaygın olacaktır. Aynı isimlerle değişkenler oluşturmak, bunları başlatmak ve daha sonra nesneyi bu şekilde başlatmak olağandışı görünmüyor mu ... ya da öyle mi? - Panzercrisis
@Panzercrisis ES6'ya hoş geldiniz, hepsi böyle. - Racheet
@Panzercrisis Bu, kişisel olarak, hataları bulmak için istenmeyen ve zor bir sürü neden olur gibi görünüyor. Çok izin veren şekilde if(a = 1) {...} geçerli sözdizimi yapar. - Anthony Grist
@Panzercrisis Eğer b, b ve c'nin daha karmaşık veri yapıları ve diğer karmaşık özellikleri de içerdiğini düşünürseniz en azından mantıklı olduğunu düşünüyorum. İyi bir fikir olduğundan emin değil, ama yararlı olduğunu görebiliyordum. - Josh Rumbut
@Panzercrisis bir lambda işlevinden bir tuple dönmek çok yararlı olabilir, gibi bir şey (a, b) => {a, b}. En azından aynı özelliği kullandım. C#. - Vincent van der Weele


var f = {a, b, c};

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

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

Object Literal Property Value Shorthands (ya da sadece özellik değeri shorthand, shorthand properties) olarak adlandırılır.

Ayrıca, klasik başlatma ile kısayolları da birleştirebilirsiniz:

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

Daha fazla bilgi için bakınız Nesne başlatıcısı.


75
2017-12-22 11:23





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

Yeni ECMAScript 2015 notasyonunu kullanarak JavaScript'teki bir nesneyi tanımlar:

Göre Mozilla Geliştirici Ağı:

"Nesneler yeni Object (), Object.create () kullanılarak veya literal gösterimi (initializer notasyonu) kullanılarak başlatılabilir. Nesne başlatıcısı, içine eklenen bir nesnenin sıfır veya daha fazla özellik adının ve ilişkili değerlerin bir listesidir. kaşlı 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
};

12
2017-12-22 11:30