2012-09-13 4 views
3

다음 줄의 목적과 결과는 무엇입니까?Javascript 배열 리터럴 연산 :이 코드 행은 무엇을합니까?

var arr = arr || []; 
+0

var arr = foo || []; foo가 정의되지 않은 경우 오류가 발생할 수 있습니다. 두 문장은 다른면에서 동일합니다. – AlexMA

+0

"아마도 ..."라는 의미는 무엇입니까? 어떤 상황에서 오류가 발생합니까? –

+0

foo가 정의되지 않으면 * 항상 * 오류가 발생합니다. 나는 그 문장을 다시 쓰고 그 말을 바꾸지 않았다. – AlexMA

답변

7

그것은 변수 "도착"을 선언하고 변수가있는 경우에는 "도착"는 "truthy"하지 않는 한, 이미 (아마도 약간 외측 범위) 실존 다른 변수의 수 해당 값을 설정 새로운 빈 배열을 참조하도록 설정합니다. 이미 현존하는 "도착"가 값 null, 0, false 또는 ""가 있거나 undefined 다음 로컬 ", 언"것이다 빈 배열 따라서 경우

. 그렇지 않으면 외부 "arr"과 동일한 값을 갖습니다.

당신은 일반적으로 이런 상황에서 것을 볼 것입니다 :

var arr; 

function whatever() { 
    var arr = arr || []; 
    ... 
} 

때때로 사람들은 이렇게 :이 경우

function questionable(arr) { 
    var arr = arr || []; 

에서, var이 필요하지 않습니다.

JavaScript의 || 연산자가 다른 C 유사 언어의 사촌과 분명히 다르기 때문에 모든 방법이 효과적입니다. JavaScript에서 || 표현식의 값은 이 아니며 부울이되도록이되어야합니다. 대신 왼쪽 피연산자 또는 오른쪽 피연산자의 값입니다. 이 "truey"인지 여부를 확인하기 위해 값을 검사하지만 부울 값은 내부 값입니다. 왼쪽이 "truthy"이면 || 표현식의 값은 해당 값입니다. 그렇지 않으면 오른쪽의 값입니다. 왼편이 "진실"일 때 우변은 전혀 평가되지 않습니다.

3

falsy이다 Arrayarr 경우의 new 인스턴스를 인스턴스.


이 패턴을 "널 병합 작업"이라고합니다. 당신은 C#을 잘 알고 있다면 당신은 다음과 같이 뭔가를 할 거라고 :

string foo = bar ?? String.Empty 

가 여기 thorough post on the topic입니다.

2

기본적으로 Javascript 및 다른 언어 (예 : Perl)에서는 ||이 단락 회로 연산자로 사용되는 경우가 많습니다. 이 b을 평가합니다

a = b || c || d || e || f; 

: 먼저 정의 중 5 개 다른 변수 중 하나의 값을 할당해야 할 변수가있는 경우, 당신은 뭔가를 시도 할 수 있습니다. 값이 true 인 경우 ab이 할당되며 그게 전부입니다. bfalse 인 경우 검색은 c으로 전파됩니다. 새로운 값을 할당할지 여부를 확인하기 위해 종종 변수를 자체와 비교해야합니다. 이것이 a = a || b의 기능입니다. Perl이라면 a ||= b으로 줄일 수있었습니다.

+0

실제로 "a | = b"이지만 "a || = b"와 같은 구문도 C에 있습니다. 그럼에도 불구하고, 정보 주셔서 감사합니다, 그것은 매우 도움이됩니다. –

+0

언제든지, 친구. 코딩을 계속하십시오! – SexyBeast