Почему эти фрагменты JavaScript ведут себя по-разному, хотя они оба сталкиваются с ошибкой?
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
Ответ 1
На самом деле, если вы правильно прочитали сообщение об ошибке, случай 1 и случай 2 выдают разные ошибки.
Case axy:
Невозможно установить свойство 'y' из неопределенного
Дело axyz:
Невозможно прочитать свойство 'y' из неопределенного
Думаю, лучше всего описать это пошаговым исполнением на простом английском языке.
Случай 1
// 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
Порядок операций более понятен, когда вы используете оператор запятой внутри скобки, чтобы увидеть, какие части выполняются, когда:
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
Ответ 3
Рассмотрим следующий код:
var a = {};
a.x.y = console.log("evaluating right hand side"), 1;