परिचालन का क्रम स्पष्ट होता है जब आप कोमा संचालक के अंदर कॉमा संचालक का शोषण करते हैं यह देखने के लिए कि कौन से हिस्से कब निष्पादित किए जाते हैं:
var a = {}
var b = {}
try{
// Uncaught TypeError: Cannot set property 'y' of undefined
a
[console.log('x'), 'x']
[console.log('y'), 'y']
= (console.log('right hand side'), b.e = 1);
} catch(err) {
console.error(err);
}
console.log(b.e) // 1
var a = {}
var b = {}
try {
// Uncaught TypeError: Cannot read property 'y' of undefined
a
[console.log('x'), 'x']
[console.log('y'), 'y']
[console.log('z'), 'z']
= (console.log('right hand side'), b.e = 1);
} catch(err) {
console.error(err);
}
console.log(b.e) // undefined
युक्ति को देखते हुए :
उत्पादन AssignmentExpression : LeftHandSideExpression = AssignmentExpression
का मूल्यांकन निम्नानुसार किया जाता है:
बता दें कि Lref, LeftHandSideExpression के मूल्यांकन का परिणाम है।
मान लें कि असाइनमेंट असाइनमेंट के मूल्यांकन का परिणाम है।
रवल होने दो GetValue(rref)
।
एक सिंटेक्सऑयर अपवाद को फेंक दें यदि ... (अप्रासंगिक)
पुकारते हैं PutValue(lref, rval)
।
PutValue
क्या है TypeError
:
हे होने दो ToObject(base)
।
यदि कॉल करने का परिणाम है [[CanPut]]
तर्क P के साथ O आंतरिक विधि गलत है, तो
ए। यदि थ्रो सत्य है, तो एक टाइपर अपवाद को फेंक दें।
कुछ भी नहीं दिया जा सकता है undefined
- की [[CanPut]]
आंतरिक विधि undefined
हमेशा वापस आ जाएगीfalse
।
दूसरे शब्दों में: दुभाषिया बाएं हाथ की तरफ, फिर दाएं हाथ की तरफ पार्स करता है, फिर एक त्रुटि फेंकता है यदि बाईं ओर की संपत्ति को सौंपा नहीं जा सकता है।
जब तुम करोगे
a.x.y = b.e = 1
बाएं हाथ की ओर सफलतापूर्वकPutValue
बुलाया गया है जब तक ; तथ्य यह है कि .x
संपत्ति का मूल्यांकन undefined
तब तक नहीं माना जाता है जब तक कि दाएं हाथ की ओर पार्स नहीं किया जाता है। दुभाषिया इसे "अपरिभाषित की" y "संपत्ति के लिए कुछ मूल्य निर्दिष्ट करता है, और undefined
केवल अंदर फेंकता की संपत्ति के रूप में देखता है PutValue
।
इसके विपरीत:
a.x.y.z = b.e = 1
दुभाषिया कभी उस बिंदु पर नहीं जाता है जहां वह z
संपत्ति को सौंपने की कोशिश करता है , क्योंकि इसे पहले a.x.y
एक मूल्य पर हल करना होगा । यदि a.x.y
एक मान (यहां तक कि undefined
) के लिए हल किया जाता है , तो यह ठीक होगा - PutValue
ऊपर की तरह एक त्रुटि अंदर फेंक दी जाएगी । लेकिन एक्सेस करने में a.x.y
त्रुटि होती है, क्योंकि प्रॉपर्टी y
को एक्सेस नहीं किया जा सकता है undefined
।
b.z = 1
औरb.e = 1
पहले निष्पादित करूंगा (सही-सह-समरूपता को देखते हुए=
), फिरa.x.y.z = ...
निष्पादित और असफल;b
एक मामले में असाइनमेंट पास क्यों होता है लेकिन दूसरे में नहीं?