2017-06-07 4 views
7

क्यों स्ट्रिंग के लिए name पहचानकर्ता डाली जब वस्तु पर var उपयोग कर रहा है काम destructuringवस्तु विनाशकारी असाइनमेंट का उपयोग करते समय, संपत्ति "नाम" स्ट्रिंग करने के लिए क्यों डाली जाती है?

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

को देखते हुए?

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

लेकिन let या const का उपयोग नहीं?

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

हमकी तुलना में अलग परिणाम देने var के महत्व के रूप में एक अलग पहचानकर्ता

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

हालांकि उत्सुक को परिभाषित करते हुए इस अप्रत्याशित परिणाम से बच सकते हैं name ब्राउज़र वातावरण पर पहचानकर्ता के लिए 210 या const?

+0

इस व्यवहार इंजन पर एक जैसी है? –

+0

@torazaburo हां। क्रोमियम 58 और फायरफॉक्स 53 * निक्स, 32 बिट पर, एक ही परिणाम उत्पन्न करते हैं। मैक या किनारे पर सफारी में * इंडो पर कोशिश नहीं की है। – guest271314

+1

@torazaburo 'window.name' से संबंधित है। हालांकि 'var' और' let', 'const' के लिए अलग-अलग परिणाम क्यों हैं? – guest271314

उत्तर

5

यह व्यवहार उस दायरे से परिभाषित किया गया है जिसमें कोड निष्पादित किया जा रहा है।

एक वैध ब्राउज़िंग संदर्भ नाम कम से कम एक चरित्र के साथ किसी भी स्ट्रिंग है कि एक U + 005F साथ शुरू नहीं करता है:

namewindow.name संपत्ति है, जो वर्णनकर्ता एक सेटर to convert it to string जब window.name = 1 के रूप में नियुक्त किया जा रहा है को संदर्भित करता है कम लाइन चरित्र। (एक अंडरस्कोर से प्रारंभ हो रहे नाम विशेष कीवर्ड के लिए आरक्षित हैं।)

वैश्विक क्षेत्र में क्रियान्वित किया जा रहा है, var name = ...window.name के लिए एक मूल्य प्रदान करती है। जबकि let और const ब्लॉक-स्कोप्ड चर घोषित करते हैं।

जब स्थानीय दायरे में निष्पादित किया जा रहा, name दोनों ही मामलों में स्थानीय चर का उल्लेख होगा:

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

समाधान अप्रत्याशित परिणामों से बचने के लिए ब्लॉक स्कोप का उपयोग करना और सख्त उपयोग करना है? – guest271314

+1

@ guest271314 हां। फंक्शन स्कोप पर्याप्त है। यही कारण है कि हम इन सभी आईआईएफई का उपयोग हर जगह करते थे - वैश्विक दायरे से संघर्ष नहीं करते थे। मैंने स्पष्टता के लिए स्निपेट से 'सख्त उपयोग' हटा दिया। यह डिफ़ॉल्ट रूप से वांछनीय है लेकिन परिणाम को प्रभावित नहीं करेगा, इसलिए यह यहां प्रासंगिक नहीं है। – estus

+0

क्या यह व्यवहार 'var' है,' कारण 'और' const' के कारणों में से एक विकसित और कार्यान्वित किया गया था? और अब 'var' का उपयोग करने से बचने का एक कारण है कि अब ब्राउज़र ब्राउज़र पर उपयोग के लिए उपलब्ध हैं? – guest271314

संबंधित मुद्दे

 संबंधित मुद्दे