परिचालन का क्रम स्पष्ट होता है जब आप कोमा संचालक के अंदर कॉमा संचालक का शोषण करते हैं यह देखने के लिए कि कौन से हिस्से कब निष्पादित किए जाते हैं:
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एक मामले में असाइनमेंट पास क्यों होता है लेकिन दूसरे में नहीं?