2013-06-07 4 views
0

내가 조건부 연산자의 진정한 조항에 정의되지 않은 속성이 예기치 않은 동작을 얻고있다 던졌습니다자바 스크립트 조건 연산자 연산자는 오류

예기치 않은 동작으로 인해 이라는 로그 항목이 "정의되지 않았으므로 오류가 발생합니다 : SCRIPT5007: Unable to get value of the property 'Name': object is null or undefined :이 개체를 검사 할 수있는 방법 htis coe 경로를 결코 실행해서는 안됩니다. 동작하는 예제는 다음과 같습니다

var obj = undefined; 

console.log("hello world" + ((obj) ? obj.Name.toString(): "Object not defined")); 

Fiddle

+3

그냥 명확히하기 위해 -이 연산자 우선 순위 질문입니까? –

+2

나는 또한 질문이 무엇인지 궁금해하고있다. (왜 첫 번째 코드에서 obj를 둘러싼 괄호가 있는지 궁금하다.) –

답변

1

그룹화의 문제가 여기에 - 당신의 라인은 다음과 동일합니다 :

("hello world" + obj) ? obj.Name.toString(): "Object not defined" 

("hello world" + obj)true 강요되는 "hello worldundefined", 동일 브라우저에서 부울을 검색하므로 브라우저는 존재하지 않는 obj.Name.toString() 함수를 찾아서 실행하려고 시도합니다.

또한 수동으로 설정하지 않으면 대부분의 개체에 Name 속성이없는 것이 확실합니다. 정의되지 않은 값은 Name 속성을 갖지 않습니다. 객체가 아니므로 변환 할 수 없으므로 오류가 발생합니다. 대신 특정 속성에 대해 확인하려면

, 당신은 뭔가를해야 할 것 다음 :

var obj = undefined; 
console.log("hello world" + (typeof obj === 'object' && obj.Name != null ? obj.Name.toString(): " Object not defined")); 
2

이 조건을 시도해보십시오

console.log("hello world" + ((obj || {}).Name) ? ...); 

나 또한

console.log("hello world" + ((obj || 0).Name) ? ...); 

이므로 objobj.Name을 모두 확인하십시오.
사실은, 조건은 당신이 obj에 대해서만 검사를 정의하지만 obj.Name

을 위해 당신은 당신이 대신해야 ajaxian

0

에 조건의 종류에 대한 설명을 읽을 수 있습니다 : (obj && obj.Name) ? obj.Name.toString(): "Object not defined"

당신의 상태

(obj) ? obj.Name.toString(): "Object not defined" 

obj이 정의되어 있는지 확인하고 obj.Name.toString()을 호출하기 전에 정의됩니다.