2014-02-20 1 views
4

다음 JavaScript 코드를 실행하면 브라우저에서 "undefinedabc"로 경고합니다.javacript의 변수가 정의 된 경우에도 "정의되지 않은"값을 유지하는 이유는 무엇입니까?

var x; 
x += "abc"; 
alert(x); 

변수 x를 정의한 것처럼 보였습니다. 그렇다면 왜 정의되지 않은 것처럼 보입니까?

+2

선언과 정의를 혼동하지 마십시오. – Eric

+0

값을 지정하지 않는 한 그 값은 "정의되지 않음"입니다. 문자열에'+ ='를 사용하면 항상'old' 문자열 값을 받아서 새로운 문자열 값을 추가합니다. 하지만 'old'문자열 값은 "undefined"입니다. – devnull69

+0

에릭에게 감사드립니다. 나는 그 실수를 저질렀습니다. – Tom

답변

5

undefined은 값이 할당되지 않은 변수의 기본값입니다. 따라서 var x;a = undefined을 의미합니다. "abc"을 추가하면 실제로는 undefined + "abc"이됩니다. 마지막으로 undefined"undefined"으로 문자열이 표시되고 "abc"으로 연결되고 "undefinedabc"이됩니다.

var x = ''; 
x += "abc"; 
alert(x); // "abc" 

This MDN article이 동작을 설명

var에 x를 초기화 CONCAT하기 위해, 당신은 그것에 빈 문자열을 (자바 스크립트 dinamically-입력했는지 기억) 할당해야합니다.

+0

당신이 나에게 지적했기 때문에이 대답을 받아 들일 것입니다. 변수의 기본값은 undefined입니다. – Tom

+0

도와 드리겠습니다. 감사 :) –

5
var x = ""; 
x += "abc"; 
alert(x); 

시도해보십시오. 'abc'undefined을 추가하려고하면 undefinedabc이됩니다.

1

먼저 즉, Variable Statement의 동작을 검사 :

"Variables are initialised to undefined when created." 

그 다음 addition operator 동작 검사 (compound assignment= 앞에 것에 대응 연산자의 동작을 적용한다).

구체적 점 7 : "abc" 문자열이기 때문에

"If Type(lprim) is String or Type(rprim) is String, then 
Return the String that is the result of concatenating ToString(lprim) followed by ToString(rprim)" 

따라서, x는 ToString에 따른 문자열로 변환한다. 위에서 알 수 있듯이 x는 정의되지 않습니다.

마지막으로 추상 작업 ToString의 동작, 즉 정의되지 않은 인수가 "정의되지 않은"문자열이라는 결과를 확인하십시오.

관련 문제