"Var {…} =…" ifadelerindeki küme parantezleri ne işe yarar?


117

Bunun Mozilla'ya özgü bir JS sözdizimi olup olmadığından emin değilim, ancak değişkenlerin genellikle bu şekilde bildirildiğini gördüm, örneğin, eklenti SDK belgelerinde :

var { Hotkey } = require("sdk/hotkeys");

ve çeşitli krom Javascript'te ( letifade yerine kullanılıyor var),

let { classes: Cc, interfaces: Ci, results: Cr, utils: Cu }  = Components;

Bunu çok kafa karıştırıcı buldum, ancak MDN'de bile her iki sözdizimiyle ilgili herhangi bir belge bulamıyorum .


@Blender Bu yapıyı symbolhound.com'da nasıl ararsınız?
trusktr

1
@trusktr: Biraz geç: symbolhound.com/…
Blender


Temel yapısızlaştırma konusunda iyiyim. Bununla birlikte, bu örnekte, değeri farklı bir özellik adına da atıyoruz ve bu sözdizimi çok kafa karıştırıcı. Nesne oluşturma sözdizimine zıttır ve bu daha fazla kafa karışıklığı yaratır.
Sol

Yanıtlar:


72

Her ikisi de JavaScript 1.7 özellikleridir. İlki, blok düzeyindeki değişkenlerdir :

letdeğişkenleri bildirmenize izin verir, kapsamını üzerinde kullanıldığı blok, ifade veya ifade ile sınırlar. Bu, varbir değişkeni global olarak veya yerel olarak blok kapsamına bakılmaksızın tüm bir fonksiyona tanımlayan anahtar kelimeden farklıdır .

İkincisine yıkıcı denir :

Yıkıcı atama, dizi ve nesne değişmezlerinin yapısını yansıtan bir sözdizimi kullanarak dizilerden veya nesnelerden veri çıkarmayı mümkün kılar.
...
Yıkıcı atamayla yapabileceğiniz özellikle yararlı bir şey, aşağıdaki örneklerle dolu bölümde gösterildiği gibi, onlarla yapabileceğiniz birkaç ilginç şey olmasına rağmen, tek bir ifadede tüm bir yapıyı okumaktır.

Python'a aşina olanlar için bu sözdizimine benzer:

>>> a, (b, c) = (1, (2, 3))
>>> a, b, c
(1, 2, 3)

İlk kod parçası şunun kısaltmasıdır:

var {Hotkey: Hotkey} = require("sdk/hotkeys");
// Or
var Hotkey = require("sdk/hotkeys").Hotkey;

İkinci kod parçasını şu şekilde yeniden yazabilirsiniz:

let Cc = Components.classes;
let Ci = Components.interfaces;
let Cr = Components.results;
let Cu = Components.utils;

2
Benim deneyime göre, var { Hotkey }eşdeğer gibi görünüyor var { Hotkey: Hotkey }. Belgeleri bulduğunuz için teşekkür ederiz!
timdream

@timdream: Bunun gibi bir şey olduğunu hissettim, ama bu nasıl farklı var Hotkey = require(...).Hotkey? Yoksa sadece tuş vuruşlarını mı kurtarıyor?
Blender

şöyle görünüyor: - / (hehehe, bu tembel programcılar ...)
timdream

2
Ayrıca, bu kadar nadir bir sözdizimi kullanmak her şeyi daha şifreli hale getirir.
trusktr


80

Baktığın şey yıkıcı bir görev. Haskell'de olduğu gibi bir desen eşleştirme biçimi .

Yıkım atamasını kullanarak, nesnelerden ve dizilerden değerler çıkarabilir ve bunları nesne ve dizi değişmez sözdizimini kullanarak yeni bildirilmiş değişkenlere atayabilirsiniz. Bu, kodu çok daha kısa ve öz yapar.

Örneğin:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a, b, c} = ascii;

Yukarıdaki kod şuna eşdeğerdir:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var a = ascii.a;
var b = ascii.b;
var c = ascii.c;

Benzer şekilde diziler için:

var ascii = [97, 98, 99];

var [a, b, c] = ascii;

Bu şuna eşdeğerdir:

var ascii = [97, 98, 99];

var a = ascii[0];
var b = ascii[1];
var c = ascii[2];

Ayrıca, bir nesne özelliğini aşağıdaki gibi çıkarabilir ve yeniden adlandırabilirsiniz:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a: A, b: B, c: C} = ascii;

Bu şuna eşdeğerdir:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var A = ascii.a;
var B = ascii.b;
var C = ascii.c;

Hepsi bu kadar.


12
Nesne yok etme örnekleri için +1, gerçekten faydalıdır. MDN örnekler sadece bir dizi strüktür gösterir.
Blender

@Blender - Nesne yok etme örnekleri sağlarlar. Bir nesne dizisindeki değerler arasında döngü oluşturmaya bakın .
Aadit M Shah

var {a, b, c} = ascii;Sözdizimini kastetmiştim .
Blender

Bu son örnek gerçekten tuhaf çünkü normalde iki nokta üst üste solunda atanan şeydir.
Curtis

1

Bu, Javascript'teki bir yıkıcı atamadır ve ES2015 standardının bir parçasıdır. Nesnelerden farklı değişkenlere dizilerden veya özelliklerden değerleri ayırır veya çıkarır. Örneğin: Dizi Yok Etme

var foo = ["one", "two", "three"];
//without destructuring
var one = foo[0];
var two = foo[1];
var three = foo[2];

// yok edici var [bir, iki, üç] = foo ile

Ör: Nesne Yok Etme

var o = {p: 42, q: doğru}; var {p, q} = o;

console.log (s); // 42 console.log (q); // doğru

// Yeni değişken isimleri atayın var {p: foo, q: bar} = o;

console.log (foo); // 42 console.log (bar); // doğru


0

letMDN'de ifade için belgeler var : https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let

letvarbeyan edilen değişkenin kapsamını sınırlamasıyla benzerdir . Bir if(){}bloğun (veya başka bir bloğun) içinde bir değişken tanımlamanıza ve bu değişkeni yalnızca bu bloğun içinde "görünür" yapmanıza olanak tanır (şimdiye kadar JavaScript, işlev kapsamına sahiptir ve diğer dillerin çoğunda olduğu gibi kapsamı engellemez). Yani bu let, temelde birçok insanın sorunları olan bir şey için bir "düzeltme" dir. Tihs'in bir JavaScript 1.7 özelliği olduğunu unutmayın.

Üzerinde hiçbir şey bulamadım {Foo}.


Üzgünüm, ikisini de sorduğunuzu sanıyordum ... Google- {Foo}
fu'm

Ben de: - / Google {ve }.
timdream
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.