50

letES6constの違いは何だろうと思っています。次のコードの例のように、どちらもブロック スコープです。

const PI = 3.14;
console.log(PI);

PI = 3;
console.log(PI);

const PI = 4;
console.log(PI);

var PI = 5;
console.log(PI);

ES5 では、出力は次のようになります。

3.14
3.14
3.14
3.14

しかし、ES6 では次のようになります。

3.14
3
4
5

なぜES6で値の変更が許可されているのか疑問に思っていconstます。問題は、なぜ「const」を使用する必要があるのか​​ということです。代わりに「let」を使用できますか?

: jsbinはテストに使用できます。JavaScript を選択してES5コードを実行し、 Traceurを選択してES6機能で実行します。

4

10 に答える 10

64

との違いはletconstを使用して値/オブジェクトを変数にバインドすると、constその変数に再割り当てできないことです。つまり、例:

const something = {};
something = 10; // Error.

let somethingElse = {};
somethingElse = 1000; // This is fine.

質問の詳細は、これが ES5 からの変更であると主張しています — これは実際には誤解です。constECMAScript 5 のみをサポートするブラウザーで使用すると、常にエラーがスローされます。このconstステートメントは ECMAScript 5 には存在しませんでした。 の動作は、実行されている JavaScript のタイプに関して JS Bin が誤解を招くか、ブラウザのバグです。

実際には、ブラウザーは ECMAScript 2015 (ECMAScript 6) の 0% のサポートから 100% に一気に移行したわけではありません。ブラウザーが完全に準拠するまで、機能が少しずつ追加されます。JS Bin が「JavaScript」と呼んでいるものは、ブラウザーが現在サポートしている ECMAScript 機能を意味するだけであり、「ES5」や「ES6」などを意味するものではありません。多くのブラウザーはES6 を完全にサポートする前にサポートconstしていましたが、一部 (Firefox など) はしばらくの間同様にlet扱われました。質問者のブラウザがそれらをサポートしていたが、正しく実装していなかった可能性があります。constletletconst

次に、Babel や Traceur などのツールは、ES6 を古いブラウザーで「実行」しません。代わりに、ES6 コードをほぼ同じことを行う ES5 に変換します。Traceur はconstステートメントをステートメントに変換している可能性がありますが、ステートメントのセマンティクスが ES5 で正確に複製されるvarことを常に強制しているとは思えません。constJS Bin を使用して Traceur を使用して ES6 を実行しても、完全に ES6 仕様に準拠したブラウザーで ES6 を実行した場合とまったく同じ結果は得られません。


constが値またはオブジェクトを不変にしないことに注意することが重要です。

const myArray = [];
myArray.push(1); // Works fine.
myArray[1] = 2; // Also works fine.
console.log(myArray); // [1, 2]
myArray = [1, 2, 3] // This will throw.

おそらく現時点でオブジェクトを (浅く) 不変にする最良の方法は、 on を使用Object.freeze()することです。ただし、これはオブジェクト自体を読み取り専用にするだけです。オブジェクトのプロパティの値は変更できます。

于 2015-08-09T03:49:15.847 に答える
9

させて

  • プログラミングでブロック スコープを使用します。
  • ブロックごとに、そのブロックの外ではアクセスできない独自の新しいスコープを作成しましょう。
  • 値は何度でも変更できます。
  • let は、ほとんどのコードで非常に便利です。これにより、コードの可読性が大幅に向上し、プログラミング エラーの可能性が減少します。

    let abc = 0;
    
    if(true)
     abc = 5 //fine
    
    if(true){
      let def = 5
    }
    console.log(def)
    

定数

  • これにより、変数を不変にすることができます。
  • const は可読性と保守性の両方に優れた方法であり、魔法のリテラルの使用を避けます。

    // Low readability
    if (x > 10) {
    }
    
    //Better!
    const maxRows = 10;
    if (x > maxRows) {
     }
    
  • const 宣言は初期化する必要があります

     const foo; // ERROR: const declarations must be initialized
    
  • const は、let:+ で見たようにブロック スコープです。
const foo = 123;
if (true) {
    const foo = 456; // Allowed as its a new variable limited to this `if` block
}
于 2017-05-16T06:58:16.000 に答える