2011-09-07 5 views
5

fg을 두 가지 기능으로 설정하십시오. 그런 다음 f() || g() 먼저 f을 평가합니다. f의 반환 값이 falsy이면 g을 평가하고 g의 반환 값을 반환합니다.논리 OR 확장 || 빈 배열의 구문

깔끔하고 간결한 구문이 좋지만 이 빈 배열 []을 반환하는 경우는 포함되지 않습니다.이 배열은 "거짓"이라고 생각합니다.

전통적인 위조 된 값 대신 []에 대해이 구문을 사용하는 것이 깨끗한가?

+1

'[]'은 빈 배열이고'{}'는 빈 객체입니다. 어느 쪽을 위증이라고 생각하니? 또는 둘 다입니까? – Paulpro

+0

미안합니다, 빈 배열'[]'. 내 질문을 수정하겠습니다. – Randomblue

+0

f 함수에 대한 더 많은 정보가 유용 할 것입니다. 예를 들어, 항상 배열을 반환한다면'f(). length || g()'. 배열의 길이가 거짓 일 경우 g를 실행합니다 (0 요소) – Paulpro

답변

5

빈 배열을 실제 위조 값으로 변환하는 함수를 작성할 수 있습니까?

function e(a) { return a instanceof Array ? (a.length ? a : false) : a; } 

var result = e(f()) || g(); 
+1

+1 좋은 해결책입니다 – Paulpro

+0

'e' 함수를 변경해야한다는 것을 제외하고 사실이 아닌 배열 (또는 길이 속성이없는 것)에 대해서는 거짓을 반환합니다. 그것을 다음과 같이 변경하십시오 :'function e (a) {return typeof a.length === 'number'&&! a.length? 거짓 : a; }' – Paulpro

+0

+1 매우 영리합니다. – jondavidjohn

0

f()에서 단순히 길이 검사를하지 않으시겠습니까?

function f(){ 
    var returned_array = new Array(); 
    ... 
    if(!returned_array.length) 
    return false; 
} 
1

제시된 다른 해결책의 문제점은 단락이 작동하는 방법을 정확히 나타내지 않는다는 것입니다. 예를 들어, f()의 값을 || 연산자 이전의 truthy 값으로 변환하면 결과는 f()이됩니다. 그래서 여기 내 선호하는 솔루션 : || 연산자처럼 동작하는 함수를 작성하십시오.

// let's call the function "either" so that we can read it as "either f or g" 
function either() { 
    var item; 
    // return the first non-empty truthy value or continue: 
    for (var i=0;i<arguments.length;i++) { 
     item = arguments[i]; 
     if (item.length === 0 || !item) continue 
     return item; 
    } 
    return false; 
} 

우리는 지금 같은 either() 기능을 사용할 수있는 방법을 우리 것 || 운영자 :

either(f(), g()); 
0

가 실제로 과부하에 대해 이야기하는 경우 || 연산자에서 JavaScript로 처리 할 수는 없습니다 (proposed back in ECMAScript 4이지만 거부되었습니다). JavaScript에서 연산자 오버로딩을 실제로 수행하려면 JavaScript Shaper과 같은 것을 사용해야합니다. 이는 "JavaScript 구문 트리 형성을위한 확장 가능한 프레임 워크"입니다. 실제로는 use this to overload operators 일 수 있습니다.

관련 문제