2017-06-07 18 views
7

BiorącPodczas korzystania z funkcji destrukturyzacji obiektu, dlaczego właściwość "nazwa" jest rzutowana na ciąg znaków?

let obj = {name: 1}; 
 
console.log(typeof obj.name, obj.name); // `"number"`, `1`

Dlaczego name Identyfikator oddanych na ciąg przy użyciu var w obiekcie destructuring assignment?

let obj = {name: 1}; 
 
var {name} = obj; 
 
console.log(name, typeof name); // `1` `string`

Ale nie używając let lub const?

let obj = {name: 1}; 
 
let {name} = obj; 
 
console.log(name, typeof name);

Możemy uniknąć tego nieoczekiwany rezultat definiując inny identyfikator

let obj = {name: 1}; 
 
var {name:_name} = obj; 
 
console.log(_name, typeof _name);

choć ciekawy co do znaczenia var powrocie różne wyniki niż let lub const dla identyfikatora name w środowisku przeglądarki?

+0

Czy to zachowanie zgodne we wszystkich silnikach? –

+0

@torazaburo Tak. chromium 58 i firefox 53 w * nix, 32-bitowy, dają taki sam wynik. Nie próbowałem na safari na Mac lub krawędzi na * indows. – guest271314

+1

@torazaburo Zastępuje powiązany z 'window.name'. Dlaczego jednak inne wyniki dla 'var' i' let', 'const'? – guest271314

Odpowiedz

5

To zachowanie jest zdefiniowane przez zakres, w którym kod jest wykonywany.

name dotyczy window.name nieruchomości, która deskryptor ma setter to convert it to string gdy jest przypisany jako window.name = 1:

Poprawna nazwa kontekst przeglądanie jest dowolny ciąg co najmniej jednego znaku, który nie zaczyna się od U + 005F Charakter LOW LINE. (Nazwy zaczynające się od znaku podkreślenia są zarezerwowane dla specjalnych słów kluczowych.)

Kiedy wykonywane w zakresie globalnym, var name = ... przypisuje wartość do window.name. Podczas gdy let i const deklarują zmienne o bloku blokowym.

Kiedy wykonywane w zakresie lokalnym, name będzie odnosić się do zmiennej lokalnej w obu przypadkach:

(() => { 
var obj = {name: 1}; 
var {name} = obj; 
console.log(typeof name); // 'number' 
})(); 
+0

Rozwiązaniem jest użycie zakresu blokowego i '" use strict "', aby uniknąć nieoczekiwanych rezultatów? – guest271314

+1

@ guest271314 Tak. Zakres funkcji jest wystarczający. Z tego powodu używaliśmy wszędzie tych wszystkich IIFE - aby nie kolidować z zasięgiem globalnym. Usunąłem "use strict" z urywka dla jasności. Jest to pożądane domyślnie, ale nie ma wpływu na wynik, więc nie ma tu znaczenia. – estus

+0

Czy to zachowanie 'var', które jest, jeden z powodów' let' i 'const' zostały opracowane i wdrożone? I powód, aby unikać używania 'var' teraz, gdy te pierwsze są teraz dostępne do użycia w środowiskach przeglądarkowych? – guest271314