javascript - जावास्क्रिप्ट के ये स्निपेट अलग-अलग तरीके से व्यवहार करते हैं, भले ही वे दोनों एक त्रुटि का सामना करते हों?




operators order-of-execution (2)

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


दरअसल, यदि आप त्रुटि संदेश को ठीक से पढ़ते हैं, तो केस 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 = {};
a.x.y = console.log("evaluating right hand side"), 1;

कोड को निष्पादित करने के लिए आवश्यक चरणों की लगभग रूपरेखा निम्नानुसार है:

  1. बाएं हाथ का मूल्यांकन करें। दो बातों का ध्यान रखें:
    • अभिव्यक्ति का मूल्यांकन करना अभिव्यक्ति के मूल्य प्राप्त करने के समान नहीं है।
    • संपत्ति axy ref मूल्यांकन करना जैसे कि axy एक संदर्भ ref जिसमें आधार मूल्य ax (अपरिभाषित) और संदर्भित नाम ( y ) शामिल है।
  2. दाहिने हाथ की ओर का मूल्यांकन करें।
  3. चरण 2 में प्राप्त परिणाम का मूल्य प्राप्त करें।
  4. चरण 1 में प्राप्त संदर्भ के मूल्य को चरण 3 में प्राप्त मान पर सेट करें अर्थात मान के लिए अपरिभाषित की संपत्ति y सेट करें। यह एक TypeError अपवाद ref फेंकना चाहिए।




order-of-execution