javascript - जावास्क्रिप्ट के ये स्निपेट अलग-अलग तरीके से व्यवहार करते हैं, भले ही वे दोनों एक त्रुटि का सामना करते हों?
operators order-of-execution (2)
दरअसल, यदि आप त्रुटि संदेश को ठीक से पढ़ते हैं, तो केस 1 और केस 2 अलग-अलग त्रुटियां हैं।
केस
axy
:
अपरिभाषित की संपत्ति 'y' निर्धारित नहीं कर सकते
केस
axyz
:
अपरिभाषित की संपत्ति 'y' नहीं पढ़ सकते हैं
मुझे लगता है कि इसे आसान अंग्रेजी में चरण-दर-चरण निष्पादन द्वारा वर्णित करना सबसे अच्छा है।
मामला एक
// 1. Declare variable `a`
// 2. Define variable `a` as {}
var a = {}
// 1. Declare variable `b`
// 2. Define variable `b` as {}
var b = {}
try {
/**
* 1. Read `a`, gets {}
* 2. Read `a.x`, gets undefined
* 3. Read `b`, gets {}
* 4. Set `b.z` to 1, returns 1
* 5. Set `a.x.y` to return value of `b.z = 1`
* 6. Throws "Cannot **set** property 'y' of undefined"
*/
a.x.y = b.z = 1
} catch(e){
console.error(e.message)
} finally {
console.log(b.z)
}
केस 2
// 1. Declare variable `a`
// 2. Define variable `a` as {}
var a = {}
// 1. Declare variable `b`
// 2. Define variable `b` as {}
var b = {}
try {
/**
* 1. Read `a`, gets {}
* 2. Read `a.x`, gets undefined
* 3. Read `a.x.y`, throws "Cannot **read** property 'y' of undefined".
*/
a.x.y.z = b.z = 1
} catch(e){
console.error(e.message)
} finally {
console.log(b.z)
}
टिप्पणियों में, सोलोमन टैम ने ecma-international.org/ecma-262/5.1/#sec-11.13 पाया।
var a = {}
var b = {}
try{
a.x.y = b.e = 1 // Uncaught TypeError: Cannot set property 'y' of undefined
} catch(err) {
console.error(err);
}
console.log(b.e) // 1
var a = {}
var b = {}
try {
a.x.y.z = b.e = 1 // Uncaught TypeError: Cannot read property 'y' of undefined
} catch(err) {
console.error(err);
}
console.log(b.e) // undefined
निम्नलिखित कोड पर विचार करें:
var a = {};
a.x.y = console.log("evaluating right hand side"), 1;
कोड को निष्पादित करने के लिए आवश्यक चरणों की लगभग रूपरेखा निम्नानुसार है:
- बाएं हाथ का मूल्यांकन करें। दो बातों का ध्यान रखें:
- दाहिने हाथ की ओर का मूल्यांकन करें।
- चरण 2 में प्राप्त परिणाम का मूल्य प्राप्त करें।
-
चरण 1 में प्राप्त संदर्भ के मूल्य को चरण 3 में प्राप्त मान पर सेट करें अर्थात मान के लिए अपरिभाषित की संपत्ति
y
सेट करें। यह एक TypeError अपवाद ref फेंकना चाहिए।