다음과 같은 경우 실행되는 부분을 확인하기 위해 대괄호 표기법 내부의 쉼표 연산자를 이용하면 작업 순서가 더 명확 해집니다.
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을 평가 한 결과라고합시다.
rref가 AssignmentExpression을 평가 한 결과라고합시다.
rval을 GetValue(rref)
.
다음과 같은 경우 SyntaxError 예외 발생 (관련 없음)
에게 전화하십시오 PutValue(lref, rval)
.
PutValue
던지는 것입니다 TypeError
:
O를하자 ToObject(base)
.
[[CanPut]]
인수 P를 사용하여 O 의 내부 메서드 를 호출 한 결과 가 거짓이면
ㅏ. Throw가 true이면 TypeError 예외가 발생합니다.
의 속성에 할당 할 수있는 것은 없습니다 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
할당이 한 경우에는 통과하지만 다른 경우에는 통과 하지 않는 이유는 무엇입니까?