2012-09-23 7 views
10

Firefoxが*something* if *expression*;の行に沿って何らかのJavaScript構文をサポートしていることを示すいくつかの例を見てきました。次の例が含まれている私が話しているかの一例として、*何か* if * expression * syntax in JavaScript(FF)

this MDN articleを参照してください:

var evens = [i for each (i in range(0, 21)) if (i % 2 == 0)]; 

私の質問は以下のとおりです。

のこの種を記述するために与えられるであろうどのような名前構文?私は主にこれを知りたいので、私はそれをGoogleに読んでそれについてもっと詳しく読むことができます。私は私が思いつくことができる最高のグーグルを試みたが、適切な結果を得るために適切な用語を一緒に置くことができなかった。

この構文は配列の理解の範囲外の他の場所にも存在しますか?配列の外側で(例えば上の例のように)使用されている他の例を見たような気がしますが、わかりません。

ここで、この構文について詳しく読むことができますか?

Firefox以外にも他のブラウザでもサポートしていますか?

この機能はES5にありますか、またはESハーモニー用ですか?

+0

_この種の構文を説明するのにどのような名前が付けられますか?_ - あなたがリンクした記事は「配列の理解」と呼ばれています。 – nnnnnn

+0

私は間違っているかもしれませんが、私はその言葉が配列部分の中の 'for each 'を指していたと思います。私は、配列の外側で使用されるこの異なる 'if'構文を見てきましたが、わかりません。 ? –

+0

_配列の理解度ははるかにコンパクトではありませんが、実際に読むのが簡単です** **概念に精通していれば**。私は誰もが構文を知っていると確信しています。メンテナーは暴力的な精神病者であり、すべて... – Laoujin

答えて

4

が指摘している、これは「配列内包」と呼ばれ、それが多くの一つだ、多くの機能は、ECMAScriptのハーモニーのための提案:

http://wiki.ecmascript.org/doku.php?id=harmony:array_comprehensions

しかし、ほとんどすべてのハーモニー「機能」を持つよう私は最終的なリリースに実際に含まれるかどうかという本当の考えはないと思います。 「JavaScript 1.7」(「標準」仕様のは実際にはがMozillaベースのものにのみ適用されます)の一部としてFirefoxで使用できます。ただし、特に別のブラウザで構文エラーが発生する場合は、FF固有の構文を避ける方がよいでしょう。

「Array Comprehensions」のGoogle検索で詳しく読むことができますが、前述したように、Mozilla固有の性質のため、非常に便利なツールではありません。

あなたは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()関数を作成しなければなりませんでした)。しかし、これは比較的コンパクトなソリューションであり、多くの「セットアップ」を必要とせず、主に問題の解決に固執しています。つまり、あるアレイの要素をフィルタリングして2番目のアレイを形成します。

私はそれを1ライナーに減らすことができましたが、維持するのが少し不安になるので、代わりに2行バージョンを提案することにしました。1つのライナーに興味がある場合は、

//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()のサポートを提供するシムを用意する必要があります。 MDNは、ここに一つを有する:

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

UPDATE:

私はfilter()代わりのreduce()を使用している必要がありますように見えます。コードをもっときれいにします。それを提案するOPのおかげで!

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

2

このタイプのステートメントは、list comprehensionとして知られています。 Pythonには非常によく似た構文の良い例があります。他の人のよう

+0

plus 1、ありがとう! –