2012-09-23 3 views
10

Firefox가 *something* if *expression*; 행에 따라 일종의 JavaScript 구문을 지원함을 보여주는 몇 가지 예를 보았습니다. 내가 무슨 말의 예로서 * something * if * expression * syntax in JavaScript (FF)

, 다음과 같은 예를 포함 this MDN article, 참조 :
var evens = [i for each (i in range(0, 21)) if (i % 2 == 0)]; 

내 질문

은을 :

주어질 것입니다 무슨 이름

는 이런 종류의를 설명하기 위해 통사론? 나는 주로 이것을 알고 싶어서 내가 구글에서 더 많이 읽을 수 있도록하고 싶다. 나는 내가 할 수있는 최선의 인터넷 검색을 시도했지만 도움이되는 결과를 얻기 위해 올바른 용어를 조합 할 수 없었습니다.

이 구문은 배열 이해 밖의 다른 위치에 있습니까? 배열의 외부에서 (예를 들어 위의 예제와 같이) 다른 예제가 사용 된 것처럼 느껴졌지만 확실하지 않습니다.

어디에서이 구문에 대해 더 자세히 읽을 수 있습니까?

Firefox 이외에도 다른 브라우저에서 지원합니까?

이 기능은 ES5에 있습니까? 아니면 ES 하모니 용입니까?

+0

_ "이런 종류의 구문을 설명하기 위해 어떤 이름이 주어 집니까?"_ 링크 된 기사는 "배열 이해"라고합니다. – nnnnnn

+0

내가 틀렸을 수도 있지만, 그 용어는 배열 부분 내부의 'for each'를 가리키고 있다고 생각합니다. 나는 배열의 밖에서 사용 된이 다른'if' 문법을 보았다고 생각하지만 확실하지 않습니다. ? –

+0

_ 단지 배열의 이해가 훨씬 더 간단하지만, 실제로는 더 쉽게 읽을 수 있습니다. ** 일단 개념에 익숙해지면 **. 나는 모든 사람들이 구문을 알고 있다는 것을 확신하면 그것을 감히 쓸모가 있습니다. 유지 관리자가 폭력적인 정신병자이고 모두 ... – Laoujin

답변

4

이 "이 배열 함축"라고하고 많은 중 하나입니다, 많은 기능이 ECMAScript를 하모니를위한 제안 , 나는 그것이 최종 릴리즈에 실제로 포함될 것인지에 대한 어떠한 실질적인 생각도 없다고 생각합니다. "JavaScript 1.7"(애매한 "표준" 사양의 일부로 Firefox에서 은 실제로이 모질라 기반 항목에만 적용됨)으로 Firefox에서 사용할 수 있습니다. 그러나 특히 다른 브라우저에서 구문 오류가 발생할 때 FF 고유 구문을 피하는 것이 좋습니다.

"Array Comprehensions"에 대한 Google 검색을 통해 자세한 내용을 읽을 수 있지만 앞서 언급했듯이 모질라 특성으로 인해 매우 유용한 도구는 아닙니다.

당신은 ES5에 소개 된 reduce() 배열 방법을 사용하여 훨씬 더 코드없이 유사한 효과를 얻을 수 있습니다

//JavaScript has no "range" function, so let's make one 
var range = function (begin, length) { 
    var i, ret = []; 
    for (i = begin; i < begin + length; i++) { 
     ret.push(i); 
    } 
    return ret; 
}; 

var evens = range(0, 21).reduce(function (arr, cur) { 
    if (cur % 2 === 0) arr.push(cur); 
    return arr; 
}, []); 

수 있습니다 약간의 자세한 비교 무엇을 당신도 염두에두고 (찾고 있던 것을 우리 range() 함수를 만들어야했습니다.) 그러나 이것은 많은 "설정"을 필요로하지 않는 비교적 컴팩트 한 솔루션이며 문제 해결에 주로 집중합니다. 한 어레이의 요소를 필터링하여 두 번째 어레이를 형성합니다.

필자는 한 줄로 줄일 수 있었지만 유지 관리가 조금은 어색해 졌기 때문에 대신 두 줄 버전을 제안하기로 결정했습니다.경우에 당신은 한 줄에 관심이, 여기있다 :

//Don't forget to define "range()" 
var evens = range(0, 21).reduce(function (arr, cur) { 
    return (cur % 2 === 0) ? (arr.push(cur) && arr) : arr; 
}, []); 

는 다시,이 ES5 코드입니다. 구형 브라우저에서 작동 시키려면 Array.reduce()에 대한 지원을 제공하는 shim이 필요합니다. MDN은 여기에서있다 :

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce

UPDATE :

내가 filter() 대신 reduce()을 사용해야처럼 보인다. 코드를 훨씬 깔끔하게 만듭니다. 그것을 제안을위한 OP 덕분에! 당신이 오래된 브라우저에서 제대로 작동 할 수 있도록하기 위해 심 (shim)이 필요합니다, 그래서

var evens = range(0,21).filter(function (cur) { return cur % 2 === 0; }); 

다시 filter()은 ES5이다.

+1

+1이지만 "JavaScript 1.7"은 어떤 종류의 표준도 아닙니다. JavaScript는 브라우저에서 사용하기위한 Mozilla의 독점적 인 ECMAScript 구현입니다. 거기에 대한 사양조차 없다, 가까이에 오는 유일한 문서는 [온라인 참조] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference)이며, 커뮤니티 위키. – RobG

+0

+1, 모든 정보를 제공해 주셔서 감사합니다! 나는 ES5 변형에 대해'reduce' 대신'filter'를 사용할 것입니다. 그러나 FF로만 작업해도 괜찮다면 JS1.7 기능을 사용해도 괜찮습니다. –

+0

@RobG 감사합니다. 업데이트 됨. – Pete