为什么这些JavaScript代码片段即使都遇到错误,行为也会有所不同?

为什么这些JavaScript代码片段即使都遇到错误,行为也会有所不同?,javascript,operators,order-of-execution,Javascript,Operators,Order Of Execution,var a={} 变量b={} 试一试{ a、 x.y=b.e=1//未捕获类型错误:无法设置未定义的属性“y” }捕捉(错误){ 控制台错误(err); } console.log(b.e)//1实际上,如果您正确地阅读了错误消息,那么案例1和案例2会抛出不同的错误 案例a.x.y: 无法设置未定义的属性“y” 案例a.x.y.z: 无法读取未定义的属性“y” 我想最好用简单的英语一步一步地描述它 案例1 //1。声明变量'a` // 2. 将变量'a'定义为{} 变量a={} // 1.

var a={}
变量b={}
试一试{
a、 x.y=b.e=1//未捕获类型错误:无法设置未定义的属性“y”
}捕捉(错误){
控制台错误(err);
}

console.log(b.e)//1实际上,如果您正确地阅读了错误消息,那么案例1和案例2会抛出不同的错误

案例
a.x.y

无法设置未定义的属性“y”

案例
a.x.y.z

无法读取未定义的属性“y”

我想最好用简单的英语一步一步地描述它

案例1

//1。声明变量'a`
// 2. 将变量'a'定义为{}
变量a={}
// 1. 声明变量'b`
// 2. 将变量'b'定义为{}
变量b={}
试一试{
/**
*1.读取'a',获取{}
*2.读取'a.x',未定义
*3.读取'b',获取{}
*4.将'b.z'设置为1,返回1
*5.将'a.x.y'设置为返回'b.z=1'的值`
*6.抛出“无法**设置**未定义的属性“y”
*/
a、 x.y=b.z=1
}捕获(e){
控制台错误(e.message)
}最后{
console.log(b.z)

}
当您利用括号内的逗号运算符来查看在以下情况下执行哪些部分时,操作顺序更清晰:

var a={}
变量b={}
试一试{
//未捕获的TypeError:无法设置未定义的属性“y”
A.
[console.log('x'),'x']
[console.log('y'),'y']
=(console.log(“右侧”),b.e=1;
}捕捉(错误){
控制台错误(err);
}

console.log(b.e)//1考虑以下代码:

var a={};

a、 x.y=控制台日志(“评估右侧”),1@NinaScholz:我不明白。没有语法错误;因此,我假设
b.z=1
b.e=1
首先执行(给定
=
上的正确关联性),然后
a.x.y.z=…
执行并失败;为什么
b
赋值在一种情况下通过,而在另一种情况下不通过?@NinaScholz我们同意
a.x
上不存在属性
y
;但这两种情况都是如此。为什么它在第二种情况下阻止右侧赋值,而在第一种情况下不阻止右侧赋值?执行顺序有什么不同?(我提到了语法错误,因为语法错误的计时与运行时错误的计时非常不同。)@Amadan运行代码后,您将得到错误,然后再次使用than类型变量名查看valueFound这描述了Javascript如何进行赋值操作。从理论角度看,这很有趣,但这绝对属于“这就是为什么你不写那样的代码”这类意外行为。很好的逗号运算符技巧——从来没有想过这样使用它(当然,仅用于调试)!s/parse/evaluate/