式文
式文は、文を記述すべき場所で使用する式です。式は評価され、その結果は捨てられます。したがって、関数の実行や変数の更新など、副次的な効果のある式にのみ意味があります。
構文
js
expression;
解説
文専用の構文とは別に、ほとんどすべての式をそれ自体で文として使用することもできます。式の構文では、終わりにセミコロンが必要ですが、セミコロンがないために構文が不正になる場合は、自動セミコロン挿入で挿入されることがあります。
式は発生した後に破棄されるため、式の結果は利用できません。したがって、式が有益なものとなるためには、式に何か副次的な効果がある必要があります。式文は一般的に次のものです。
- 関数呼び出し (
console.log("Hello");
,[1, 2, 3].forEach((i) => console.log(i));
) - タグ付きテンプレートリテラル
- 代入式(複合演算子を含む)
- インクリメント/デクリメント演算子
delete
import()
yield
およびyield*
禁止されている式
式を文として使用するためには、他の文の構文とあいまいであってはいけません。したがって、式は以下のいずれかのトークンで始めてはいけません。
function
:function
宣言またはfunction*
宣言となり、function
式またはfunction*
式とはならない。async function
:async function
宣言またはasync function*
宣言となり、async function
式またはasync function*
式とはならない。class
:class
宣言となり、class
式にはならない。let[
:let
宣言 の配列の分割代入となり、let
上のプロパティアクセサーにはならない(let
は厳格モード以外でのみ識別子になる){
: ブロック文となり、オブジェクトリテラルにはなりません。
従って、以下のものは全て不正です。
js
function foo() {
console.log("foo");
}(); // SyntaxError: Unexpected token '('
// 何らか理由で、`let` という変数を作った
var let = [1, 2, 3];
let[0] = 4; // SyntaxError: Invalid destructuring assignment target
{
foo: 1,
bar: 2, // SyntaxError: Unexpected token ':'
};
さらに危険なことに、たまたま有効な構文であったとしても、意図しないコードになってしまうこともあります。
js
// 何らか理由で、`let` という変数を作った
var let = [1, 2, 3];
function setIndex(index, value) {
if (index >= 0) {
// 配列 `let` に割り当てるつもりが、余計な変数を作成してしまう!
let[index] = value;
}
}
setIndex(0, [1, 2]);
console.log(let); // [1, 2, 3]
// これはオブジェクトリテラルではなくブロック文となり、
// `foo` はラベル、`1` は式文になる
// コンソールで起こることが多い
{ foo: 1 };
このような問題を避けるために、括弧を使用することで、一義的に式文となるようにすることができます。
js
(function foo() {
console.log("foo");
})();
例
制御フロー文の回避
制御フロー文の使用は、式文を使ってほとんど避けることができます。例えば、if...else
は三項演算子や論理演算子に置き換えることができます。for
や for...of
のような反復処理文は、配列メソッドに置き換えることができます。
js
// 制御フロー文の使用
function range(start, end) {
if (start > end) {
[start, end] = [end, start];
}
const result = [];
for (let i = start; i < end; i++) {
result.push(i);
}
return result;
}
// 式文の使用
function range2(start, end) {
start > end && ([start, end] = [end, start]);
return Array.from({ length: end - start }, (_, i) => start + i);
}
警告: これは、言語の能力の一端を示すに過ぎません。制御フロー文の代用として式文を過剰に使用すると、コードの可読性が大幅に低下する可能性があります。
仕様書
Specification |
---|
ECMAScript Language Specification # sec-expression-statement |