33-js-conceptsの10.表現と語句

6660 ワード

まず栗を見に来ます.
function(){} // Uncaught SyntaxError: Unexpected token (
(function(){}) // ƒ (){}
function f(x){ return x + 1 }() // Uncaught SyntaxError: Unexpected token )
function f(x){ return x + 1 }(1) // 1
説明:最初の行のコード:JavaScriptは関数宣言文の始まりとして機能宣言文のキーワードを使用しているため、関数宣言文functionのキーワードの後は関数名であるべきです.ここの後と括弧は当然間違えます.
第二行コード:ペアの括弧を加えると、解像器は()の表現を表現式として解析します.ここでは匿名関数式として解析しますので、エラーが発生しません.
第三行コード:一つの文の後に()を加えると、パケットオペレータとして扱われます.グループのオペレータには式が必要です.ここでエラーが発生します.
第四行コード:関数ステートメントの後に(1)を加えると、ステートメントの後に無関係な表現が追加されます.以下のコードと同じです.
function f(x){ return x + 1 }
(1) // 1
式:
jsの中の一つのフレーズは、jsインタプリタがその結果を計算します.プログラムの定数は最も単純な表現です.
変数名も簡単な表現です.その値は変数に割り当てられた値です.複雑な表現は簡単な表現で構成されています.
たとえば、データアクセス式は、配列を表す表式、左括弧、整数表式、右括弧から構成されます.それらが構成する新しい表現の演算結果は、配列の特定の位置の要素値です.
同様に、関数呼び出し式は、関数オブジェクトを表す表式と、0つ以上のパラメータ表式から構成されます.
単純表現を複雑な表現に組み合わせる最も一般的な方法は演算子を使うことです.演算子は、特定の演算規則に従って演算数(通常は2つ)を演算し、新しい値を計算します.
乗算演算子「」は比較的簡単な例です.式x yは、2つの変数式xとyを演算して結果を得ます.ときには、演算子は「計算」よりも値を返したと言いたいです.
ステートメント:
js全文または命令.js文はセミコロンで終わります.表式は値を計算しますが、文は自分で何かを発生させるために使います.「ある事柄を発生させる」という方法の一つは、副作用を持つ表現を計算することです.
これらの副作用のある表現を、賦値や関数で呼び出すなど、個々の語句として用いることができ、このような表現を語句として用いることも、表現文(expression statement)と呼ばれる.同様のステートメントには、新しい変数を宣言したり、新しい関数を定義したりするステートメントがあります.
Axelの表現と語句に関する文章を翻訳してください.
1.語句と表現
Javascriptは表現と語句を区別します.一つの表式は値を生成し、例えば関数として呼び出されるパラメータのような値が必要な場所に置くことができる.下の各行には表現が含まれています.
myvar
3 + x
myfunc("a", "b")
大体において、一つの文は一つの動作を実行します.サイクルとif文は例です.プログラムは基本的にステートメントのシーケンスです.JavaScriptはステートメントを期待するたびに、表現を書くこともできます.このような表現を表現文と呼びます.逆にしてはいけません.JavaScriptには表現が必要なところに文を書いてはいけません.例えば、if文は一つの関数のパラメータにはなりません.
2.類似の語句と表現
この二つの構文タイプの類似メンバーを観察すると、両者の違いはより明確になる.
2.1 If文vs条件演算子
次はif文の栗です.
    if (y >= 0) {
        x = y;
    } else {
        x = -y;
    }
表式には同様の条件演算子があります.上の文は以下の文に相当します.
var x=(y>=0?y:-y);
=と;のコードは表式です.括弧は必須ではありませんが、このような条件で操作すると読みやすいです.
2.2セミコロンvsコンマ操作子
JavaScriptでは、セミコロンto chain statemensをセミコロンで区切って文を接続します.
foo()bar()
表式には、有名ではないカンマ演算子があります.
foo(),bar()
この演算子は2つの表式を計算し、2番目の表式の結果を返します.くり:
   > "a", "b"
    'b'

    > var x = ("a", "b");
    > x
    'b'

    > console.log(("a", "b"));
    b
3.語句のように見える表現
Some expressions look like statemens.We’ll exmine why that is a problem at the end of this section.
3.1対象字面量vsブロック
以下はオブジェクトの字面量object lieralで、オブジェクトを生成する表現式です.
{
  foo: bar(3, 5)
}
しかし、これも完璧に規則に合致する語句であり、これらの構成要素を持っている.
  • ブロック:かっこで囲まれたステートメントシーケンス.
  • タグlabel:任意の文の前にラベルプレフィックスを付けることができます.ここでラベルはfooです.
  • ステートメント:表現ステートメントbar(3,5).
  • {}ブロックまたはオブジェクトとしての字面量は、次のWATルールに依存します.
    > [] + {}
    "[object Object]"
    
    > {} + []
    0
    
    +演算子は互換性があります.この2つの語句は同じ結果を返すべきではないですか?いいえ、第二の文は+後のコードブロックに等しいからです.
    > +[]
    0
    
    //  [].toString()  "", {}.toString()  [object Object],             。
    
    ここの細部と他の規則についてはWhat is{}+{}in JavaScriptを参照してください.
    JavaScriptは別のブロックがありますか?JavaScriptには単独で存在するコードブロック(ループまたはif文の一部とは反対)があります.これに対しては驚きを感じるかもしれません.下のコードはこのブロックの使用例を示しています.それらにラベルを付けて、それらの中からbreakを出してもいいです.
    function test(printTwo) {
        printing: {
            console.log("One");
            if (!printTwo) break printing;
            console.log("Two");
        }
        console.log("Three");
    }
    
    インタラクション:
    > test(false)
    One
    Three
    
    > test(true)
    One
    Two
    Three
    
    3.2関数式vs.関数宣言
    以下は関数式です.(直接ステートメントとしては合法的ではないので、JavaScriptは関数宣言として認識します.ステートメントには関数名が必要です.)
    function(){}
    関数式の名前を与えてもいいです.ネーミング関数式named function expressionに変えます.
    function foo(){}
    関数名fooは関数の内部にのみ存在します.例えば、自己再帰に使用できます.
    > var fac = function me(x) { return x <= 1 ? 1 : x * me(x-1) }
    > fac(10)
    3628800
    > console.log(me)
    Uncaught ReferenceError: me is not defined
    
    ネーミング関数の表現は、関数宣言(大体ステートメントとも言える)と区別できません.しかし、それらの影響は違っています.一つの関数式は一つの値(一つの関数)を生成し、一つの関数宣言は一つの挙動を実行します.一つの変数を作成し、変数の値はこの関数です.これ以外にも、関数式だけをすぐに実行(呼び出し)できます.関数宣言はできません.
    4.オブジェクトの字面量と関数式を文として使う
    いくつかの表現は語句と区別できないことが分かりました.同じコードが、表現の文脈と文脈で実行されると異なる効果があることを意味します.一般的にこの二つの文脈ははっきり区別されています.しかし、表現文には重複overlapがあります.文脈には表現があります.曖昧さを避けるために、JavaScript文法禁止表現文は括弧またはfunctionで始まる:
    ExpressitionStation:[lookahead∉{}、「{」、「function]」Expression;
    この二つの方法で始めたい場合は、どうすればいいですか?括弧に入れてもいいです.動作の結果は変えられませんが、式-onlyの文脈に存在することを確認できます.二つの例を見てみます.evalとすぐに関数式を実行します.
    4.1 eval
    evalは文の文脈でパラメータを解析します.evalをオブジェクトに戻したい場合は、括弧でオブジェクトの字面量をくるむ必要があります.
      > eval("{ foo: 123 }")
        123
      > eval("({ foo: 123 })")
        { foo: 123 }
      > eval({ foo: 123 })
        { foo: 123 }
    
    4.2直ちに関数式Immediately invoked function expressionsを実行します.
    下記のコードはすぐに関数式を実行します.
    > (function () { return "abc" }())
    'abc'
    
    外の括弧を無視すると、構文エラーが報告されます.
     > function () { return "abc" }()
        SyntaxError: function statement requires a name
              : Uncaught SyntaxError: Unexpected token (
    
    functionと括弧の間に関数名を追加するか、それとも文法エラーを報告しますか?
     > function foo() { return "abc" }()
        SyntaxError: syntax error
               :Uncaught SyntaxError: Unexpected token )
    
    また、式の文脈で解析される表現を保証する方法として、1元の演算子、例えば+または!!!があります.しかし、括弧とは反対に、これらの演算子は式の結果に影響を与えます.多くの結果が必要でない場合は、海星も計算されます.
     > +function () { console.log("hello") }()
        hello
        NaN
     > !function () { console.log("hello") }()
        hello
        true
     > !!function () { console.log("hello") }()
        hello
        false
    
    NaNはundefined、すなわち関数の戻り値を+演算した結果です.Brandon Benvieは、もう一つの利用可能な要素演算子voidを提示しました.
    > void function () { console.log("hello") }()
        hello
        undefined
    
    4.3直ちに関数式の直列を実行します.
    直列してすぐに関数を実行するときは、セミコロンを忘れないように注意してください.
    >  (function () {}())
        (function () {}())
        Uncaught TypeError: (intermediate value)(...) is not a function
    
    このコードはJavaScriptが2行目が関数として呼び出された最初の行の結果だと考えているため、エラーが発生しました.セミコロンを追加すればいいです.
     (function () {}());
     (function () {}())
     // undefined
    
    1元の演算子(+1元でも2元でも)に対しては、スコアを無視できます.JavaScriptは自動的にセミコロンを挿入します.
    void function () {}()
    void function () {}()
    // undefined
    
    JavaScriptは最初の行の後にセミコロンを挿入します.voidは有効な継続文の方式ではないからです.
    Related posts
  • What is{}in JavaScript?
  • The void operator in JavaScript
  • Automatic semicolon insertion in JavaScript
  • 参考文献:js表現と文Expressions versus statements in JavaScript