var olmadan nesne yok etme


102

Nesne yok etme var, önünde anahtar kelime yoksa neden bir hata veriyor?

{a, b} = {a: 1, b: 2};

atar SyntaxError: expected expression, got '='

Aşağıdaki üç örnek sorunsuz çalışıyor

var {a, b} = {a: 1, b: 2};
var [c, d] = [1, 2];
    [e, f] = [1, 2];

Bonus soru: varDizi yıkımı için neden a'ya ihtiyacımız yok?

Soruna benzer bir şey yaparak karşılaştım

function () {
  var {a, b} = objectReturningFunction();

  // Now a and b are local variables in the function, right?
  // So why can't I assign values to them?

  {a, b} = objectReturningFunction();
}

Yanıtlar:


163

Sorun, {...} operatörlerin JavaScript'te birden çok anlama sahip olmasından .

Ne zaman {bir başında görünen Tablosu , her zaman temsil edeceğiz blok tahsis edilemez. Daha sonra görünüyorsa Beyanı bir şekilde İfade , o zaman bir nesne temsil edeceğiz.

varBir takip edilemez, çünkü bu ayrım yapmak yardımcı Bildirimi irade olarak, gruplama parantez :

( {a, b} = objectReturningFunction() );

Dokümanlarından: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Assignment_without_declaration

Notlar: Atama deyiminin etrafındaki parantezler (...), bildirim olmadan nesne değişmez yıkıcı atama kullanılırken gereklidir.

{a, b} = {a: 1, b: 2} geçerli bağımsız sözdizimi değildir, çünkü sol taraftaki {a, b} bir nesne değişmezi değil bir blok olarak kabul edilir.

Bununla birlikte, ({a, b} = {a: 1, b: 2}), var {a, b} = {a: 1, b: 2} gibi geçerlidir

(...) ifadenizin önünde noktalı virgül bulunmalı veya önceki satırda bir işlevi çalıştırmak için kullanılabilir.


İfadede daha sonra İfade olarak görünüyorsa, o zaman bir Nesneyi temsil eder. Bu, gruplama parantezi içinde asla engelleme kapsamımız olamayacağı anlamına mı geliyor?
sharad_kalya

Gruplama parantez ipucu harika bir ipucu.
James Smith

Bu, beni şaşkına çeviren zekice belirsiz bir bilgi parçası. Kapsamda yıkıma izin verir (bir nevi - tabii ki değişkenlerinizi bildirmeniz gerekir). Ancak, çok fazla karışıklık yaratmadan, bir Promise zincirinin bir adımından başka bir adımdan çözülen birden fazla değişkeni kullanma ihtiyacı duyarken, Promise zincirlerini kullanmanın bir kısıtlamasını çözer. Teşekkürler.
Kevin Teljeur

27

Javascript'i noktalı virgül olmadan yazarsanız , tahmin edilebilir şekilde çalışması için 'bildirimsiz atama' sözdiziminin önünde noktalı virgül bulunmalıdır.

let a, b

;({a, b} = objectReturningFunction()) // <-- note the preceding ;

Sadece beni yakaladığı için bunu vurgulamak istedim ve umarım başkalarının neden çalışmadığını ve / veya gibi kod formatlayıcılarla garip sonuçlar verdiğini anlamak için biraz zaman kazandırabilir. prettier .

Gerçekten de, aslında kabul edilen cevapta (alıntı yapılan belgelerin son satırında) ama gözden kaçırması kolay, özellikle de bir örnek görmeden!


2
Evet. İnsanların noktalı virgül kullanması için bir neden!
jfriend00

2

İşte başka bir yol:

let {} = {a, b} = objectReturningFunction()

Artıları:

  • Paranteze gerek yok
  • Noktalı virgül gerekmez
  • Ekstra görev garantili bir işlemsizdir (tuhaf şeyler olmadığı sürece)

Eksileri:

  • Bence IIFE'den daha tuhaf olmamasına rağmen biraz tuhaf görünüyor!(){...}() .
  • Neden orada olduğu konusunda kafa karıştırıcı olabilir. İnsanları ilk karşılaşmada kovmak garantilidir, bu yüzden tek seferlik olarak kullanılmamasını tavsiye ederim.

Tür hayattan yılların gibi hisseden daha karşılaştırılabilir ;({ a, b })daha let {} = { ... }. Yine de güzel numara. :)
shuckster

@ proto-n, +1, çok akıllıca bir fikir. Bununla nasıl karşılaştınız?
Pacerier
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.