との違いはlet
、const
を使用して値/オブジェクトを変数にバインドすると、const
その変数に再割り当てできないことです。つまり、例:
const something = {};
something = 10; // Error.
let somethingElse = {};
somethingElse = 1000; // This is fine.
質問の詳細は、これが ES5 からの変更であると主張しています — これは実際には誤解です。const
ECMAScript 5 のみをサポートするブラウザーで使用すると、常にエラーがスローされます。このconst
ステートメントは ECMAScript 5 には存在しませんでした。 の動作は、実行されている JavaScript のタイプに関して JS Bin が誤解を招くか、ブラウザのバグです。
実際には、ブラウザーは ECMAScript 2015 (ECMAScript 6) の 0% のサポートから 100% に一気に移行したわけではありません。ブラウザーが完全に準拠するまで、機能が少しずつ追加されます。JS Bin が「JavaScript」と呼んでいるものは、ブラウザーが現在サポートしている ECMAScript 機能を意味するだけであり、「ES5」や「ES6」などを意味するものではありません。多くのブラウザーはES6 を完全にサポートする前にサポートconst
していましたが、一部 (Firefox など) はしばらくの間同様にlet
扱われました。質問者のブラウザがそれらをサポートしていたが、正しく実装していなかった可能性があります。const
let
let
const
次に、Babel や Traceur などのツールは、ES6 を古いブラウザーで「実行」しません。代わりに、ES6 コードをほぼ同じことを行う ES5 に変換します。Traceur はconst
ステートメントをステートメントに変換している可能性がありますが、ステートメントのセマンティクスが ES5 で正確に複製されるvar
ことを常に強制しているとは思えません。const
JS 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()
することです。ただし、これはオブジェクト自体を読み取り専用にするだけです。オブジェクトのプロパティの値は変更できます。