this の質問を以前に聞いて、トピックについてさらに考えた後、「ステートメント」と「表現」という用語の意味のあいまいな境界がどこにあるのだろうと思い始めました。すべてのステートメントも式ですか? REPLコンソールの戻り値はどこから来ますか?それらは常に直感的な意味をなさないようです。もちろん、_1+1
_と入力すると、_2
_、ただし、ロジックが何であるかが明確でない場合もあります。
REPL=someの値を入力すると、JSソースコードで次のように使用できることを意味します。式とスタンドアロンステートメントの両方?
次のスニペットで__X_
_に使用できるコードの文字列を__Y_
_にも使用できますか? if(_X_) _Y_
すべてのステートメントも式ですか?
「JavaScriptがステートメントを要求する場合は常に、式を記述することもできます。このようなステートメントは、式ステートメントと呼ばれます。その逆は成り立ちません。JavaScriptが式を予期する場所にステートメントを書くことはできません。たとえば、ifステートメントは関数の引数になることはできません。」
これは、このトピックに関するAxel Rauschmayerによる最近の投稿から来ています。 JavaScriptの式とステートメント
それが役に立てば幸い。
[〜#〜] mdn [〜#〜] によると:
式は、値に解決される有効なコード単位です。
そのため、右辺値として使用できるものはすべて式です。
基準は、副作用が存在するかどうかnotです。式には間違いなく副作用があります。例えば。 _a=2
_は値(2)を持つ式であり、変数に値を割り当てます。次のようなことができるのはそのためです。
_let a;
let b = 1 + (a = 2); // a is now 2 and b is 3
_
同じ(テキスト)コードブロックを、コンテキストに応じて式とステートメントの両方と見なすことができます。例えば。テキストスニペットfunction f(){}
は、次のコードの1行目の式と2行目のステートメントです。
_let g = function f() {};
function f() {};
_
したがって、何かが式であるか文であるかは、(一般的な場合)文脈から外れたコードのテキスト部分を見ても判断できません。むしろ、構文ツリー内のノードのプロパティであり、コードが(精神的または実際に)解析された後にのみ決定できます。
また、おそらくより重要なことは、関数f
内の関数ステートメント(関数宣言)は、関数f
が呼び出されたときに作成される実行コンテキストの一部を形成します。ただし、関数式は、その実行コンテキストの一部を形成しますnot。
しばしば引用される効果の1つは、関数の宣言は「ホイスト」されるのに対し、関数の式はそうではないということです。
関数ステートメントが実行コンテキストでスペースを占有するのに対し、関数式ではスペースを占有しないことを考えると、深い再帰ではより微妙な効果も実験的に観察できます。例えば。以下のコードは、関数f
の無限再帰を使用しています。関数f
は、最初のケースではその中に関数式を含み、2番目のケースでは同等の関数宣言を含みます:
_// Function Expression
{
let i = 0;
try {
function f () {
i++;
(function g() {})(); // this is an expression
f();
}
f();
} catch (err) {
console.log(`Function Expressions case: depth of ${i} reached. Error: ${err.name}`);
}
}
// Function Declaration
{
let i = 0;
try {
function f () {
i++;
function g() {}; // this is a statement
g();
f();
}
f();
} catch (err) {
console.log(`Functions Declarations case: depth of ${i} reached. Error: ${err.name}`);
}
}
_
私のマシンでは、一貫して以下を取得します(node.jsで):
_Function Expressions case: depth of 17687 reached. Error: RangeError
Functions Declarations case: depth of 15476 reached. Error: RangeError
_
…これは、関数宣言が実行コンテキストを保持するために必要なスペースの量を増やすため、スタックスペースを少し速く消費し、最大再帰深度をわずかに減らすという事実と一致しています。
式は何らかの値を生成または評価します。
式の例:new Date()
は、副作用のない新しいDateオブジェクトを生成します。 _[1,2,3]
_は、副作用のない新しい配列を生成します。 _5+6
_は新しい値を生成します11.それは副作用なしで新しい値を生成するだけです。
ステートメントは何らかの動作を引き起こすか、何かを行いますが、副作用もあります。副作用に基づいて、ステートメントを分類できます。
_x=5;
_はステートメントであり、ここでの副作用はxの割り当てまたは変更です。
setTimeout()
-タイマーの開始は副作用です。
通常、ステートメントはセミコロンで区切られます。
式ステートメントは、何らかの副作用がある式、または単に「副作用のある式」です。
式ステートメントの例:
_x+=6;
_は、副作用である割り当てを行っている複雑な式(一次式のグループ)です。いわゆる式ステートメントです。
_delete a[2];
_
最も単純な用語では、expressionsはと評価されて値を生成します。一方、statementsが実行されて何かが起こります。
Expression:値として解決されるコードの単位。たとえば、literals&operators。式の例:
> 3
> 1 + 2
> "expression"
> fn()
> []
> {}
Statement:1つ以上の命令を表すコードの単位。通常、言語で予約されたキーワードで始まり、explicitlyまたはimplicitly、ステートメント終了記号付き。ステートメントの例:
> 3;
> let x = 3;
> if () {}
> for () {}
> while () {}
JavaScriptのすべてのプログラムはステートメントで構成され、ゼロ個以上のステートメントをグループ化するために使用されるブロックステートメントを除き、セミコロンで終わります。 Statementsはいくつかのアクションを実行するだけですが、値や出力は生成しませんが、expressions値を返します。インタプリタは式を見ると、その値を取得し、式を新しい値に置き換えます。ステートメントは、これらの式を操作するために使用されます。ここで式またはステートメントであるかどうかを確認できます: JavaScript Parser
アクセル・ラウシュマイヤー博士の包括的なブログ投稿を読むことを強くお勧めします
JavaScriptの式とステートメント
上記の@ ZER0の受け入れられた回答に記載されているとおり。
しかし、私のお気に入りのメモリショートカットは次のとおりです。
式:
e
はE
qualをExpression
に設定できます
..またはExpressed
を印刷します。
ステートメント:
..他に何か。
次はから変更されます
Anders KaseorgのQuoraの回答 。
ステートメントは、何らかのアクションを実行する完全なコード行です。
E
very E
xpressionをステートメントとして使用できます
(その効果は式を評価することであり、 ignore 結果の値)。
ただし、E
xpressionは、e
valuatesからvalu e
に変換されるコードのセクションです。
式は、演算子を使用して「水平」に組み合わせてより大きな式にすることができます。
E
の上部は水平方向に平らです
ほとんどのステートメントは式として使用できません。
ステートメントは、次々に記述するか、ブロック構造を使用して「垂直」にのみ結合できます。
S
は比較して垂直に実行されます。
一般的な経験則は次のとおりです。印刷または変数に割り当てることができる場合、それは式です。できない場合は、声明です。
式の例を次に示します。
2 + 2
3 * 7
1 + 2 + 3 * (8 ** 9) - sqrt(4.0)
min(2, 22)
max(3, 94)
round(81.5)
"foo"
"bar"
"foo" + "bar"
None
True
False
2
3
4.0
上記のすべてを印刷するか、変数に割り当てることができます。
ステートメントの例を次に示します。
if CONDITION:
Elif CONDITION:
else:
for VARIABLE in SEQUENCE:
while CONDITION:
try:
except EXCEPTION as e:
class MYCLASS:
def MYFUNCTION():
return SOMETHING
raise SOMETHING
with SOMETHING:
上記の構成はどれも変数に割り当てることができません。それらは目的に役立つ構文要素ですが、それ自体に本質的な「価値」はありません。つまり、これらの構成要素は何に対しても「評価」されません。たとえば、次のいずれかを実行しようとするのは馬鹿げており、単に機能しません。
x = if CONDITION:
y = while CONDITION:
z = return 42
foo = for i in range(10):