2015-03-22 8 views
7

वस्तुओं की प्रोटोटाइप श्रृंखलाओं (क्रोम में) का निरीक्षण करने के लिए उपयोगिता फ़ंक्शन को परिभाषित करना, मुझे यह सरणी के लिए मिलता है।[] .__ proto__ === Array.prototype // === [प्रतीक (Symbol.unscopables): ऑब्जेक्ट]?

array prototype chain

तो यह लगता है कि

[].__proto__ === Array.prototype // === [Symbol(Symbol.unscopables): Object] 

मैं पहली समानता को समझते हैं। मुझे नहीं पता कि तीसरा शब्द क्या है, हालांकि मैंने सुना है कि ईएस 6 के प्रतीक होंगे।

क्या यह चीज Array.prototype जैसा ही है? यह इस तरह प्रिंट क्यों करता है?

संपादित करें: chrome: // संस्करण जानकारी:

Google Chrome 40.0.2214.111 (Official Build) 
Revision 6f7d3278c39ba2de437c55ae7e380c6b3641e94e-refs/branch-heads/[email protected]{#480} 
OS Linux 
Blink 537.36 (@189455) 
JavaScript V8 3.30.33.16 
+1

का परीक्षण करना कठिन है 'न्यूनतम उदाहरण' console.log ([] .__ proto __) 'जो आपको बताता है कि आप जिस ब्राउज़र का उपयोग कर रहे हैं, जो शायद क्रोम है, अब आंतरिक रूप से नए प्रतीक प्रकार के साथ' ऐरे .__ proto__' को परिभाषित करता है। – adeneo

+0

सच है। मुझे याद आया क्योंकि मैंने अभी '[] .__ proto__' इनपुट किया है जो [] के रूप में प्रिंट करता है। मैं जानता हूं कि कंसोल कंसोल नहीं करता है। इसके परिणाम लॉग करें। – spelufo

+0

उस नोट पर, यह अजीब बात है कि कंसोल प्रिंट 'अपरिभाषित' में '{}' दर्ज करना और '{x: 3} 'आउटपुट' 3' दर्ज करना। – spelufo

उत्तर

2

टिप्पणी पर 2014-04-14

यह यहाँ लगता Chrome की console.log प्रिंट सभी प्रतीक-प्रकार-चाबियाँ, एक उदाहरण है:

var o = {}; 
o[Symbol.iterator] = function() {}; 
o[Symbol.unscopables] = {}; 
var s = Symbol('s'); 
o[s] = 3; 
console.log(o); 

प्रिंट जो:

वस्तु {प्रतीक (Symbol.unscopables): ऑब्जेक्ट, प्रतीक (Symbol.iterator): समारोह, प्रतीक (ओं): 3}

मैं नहीं चाहता कि क्यों क्रोम इस तरह से व्यवहार करती है, यह डिबगिंग या कुछ और के लिए है अन्य?

कुल मिलाकर यह toString() परिणाम को प्रभावित नहीं करता है, इसलिए सभी कोड सुरक्षित हैं।

var o = {}; 
o[Symbol.unscopables] = {}; 
console.log(o); 

जो आउटपुट:


ऐसा लगता है console.log विशेष रूप से कंसोल में Symbol.unscopable कुंजी मुद्रित होगा, हम इस तरह प्रदर्शन करने के लिए एक सादे वस्तु हो सकता है प्रतीक

वस्तु {(Symbol.unscopables): ऑब्जेक्ट}

Symbol.unscopables प्रतीक एक विशेष प्रतीक @@unscopables रूप ES6 में परिभाषित किया गया है जो जब इस वस्तु एक with वातावरण में काम करता है कुछ गुण को छोड़कर के लिए इस्तेमाल किया जाता है, आधिकारिक विवरण है:

एक वस्तु मूल्यवान संपत्ति जिनकी संपत्ति के नाम संपत्ति हैं नाम जो संबंधित वस्तु के पर्यावरण बाइंडिंग के साथ बाहर रखा गया है।

एक साधारण उदाहरण:

var o = {x: 1, y: 2}; 
o[Symbol.unscopables] = { 
    y: true 
}; 

console.log(o.x); // 1 
console.log(o.y); // 2 

with(o) { 
    console.log(x); // 1 
    console.log(y); // ReferenceError: y is not defined 
} 

आप Array.prototype[Symbol.unscopables] उपयोग कर सकते हैं सभी कुंजियों जो with वातावरण में नहीं किया जा सकता को खोजने के लिए

हालांकि अभी भी एक Array.prototype के उत्पादन में नहीं बिल्कुल के रूप में एक ही है Symbol.unscopables कुंजी के साथ एक सादा वस्तु, यह [Symbol(Symbol.unscopables): Object] आउटपुट करता है, जो एक सरणी

नहीं कर सकता है बिल्कुल बताएं कि यह Symbol.toStringTag से संबंधित हो सकता है जो नियंत्रित करता है कि स्ट्रिंग के लिए ऑब्जेक्ट को कैसे स्वरूपित किया जाना चाहिए, लेकिन क्रोम वर्तमान में इस प्रतीक को निर्यात नहीं करता है, इसलिए

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