172

ES6 がまだ標準化されていないことは承知していますが、現在多くのブラウザー constが JS のキーワードをサポートしています。

仕様では、次のように書かれています。

定数の値は再代入によって変更できず、定数を再宣言することはできません。このため、定数を初期化せずに宣言することはできますが、そうしても無駄です。

そして、私がこのようなことをすると:

const xxx = 6;
xxx = 999;
xxx++;
const yyy = [];
yyy = 'string';
yyy = [15, 'a'];

私はすべてが大丈夫だxxx6思いyyyます[].

しかし、そうするとyyy.push(6); yyy.push(1);、定数配列が変更されました。今[6, 1]のところ、まだ変更できませんyyy = 1;

これはバグですか、それとも何か不足していますか? 最新のクロームとFF29でやってみた

4

11 に答える 11

71

これは、定数が実際に配列への参照を格納しているために発生します。配列に何かを結合すると、定数値は変更されませんが、それが指す配列が変更されます。オブジェクトを定数に割り当て、そのプロパティを変更しようとすると、同じことが起こります。

配列またはオブジェクトを固定して変更できないようにする場合はObject.freeze、ECMAScript 5 の一部である メソッドを使用できます。

const x = Object.freeze(['a'])
x.push('b')
console.log(x) // ["a"]
于 2014-05-02T20:42:24.177 に答える
16

これは、私が考えることができるすべてのプログラミング言語で一貫した動作です。

C を考えてみましょう - 配列はただの美化されたポインターです。定数配列は、ポインターの値が変更されないことを意味するだけですが、実際には、そのアドレスに含まれるデータは自由です。

JavaScript では、定数オブジェクトのメソッドを呼び出すことができます (もちろん、そうしないと、定数オブジェクトはあまり役に立ちません!) これらのメソッドには、オブジェクトを変更するという副作用があります。JavaScript の配列はオブジェクトであるため、この動作はそれらにも当てはまります。

確実なのは、定数が常に同じオブジェクトを指しているということだけです。オブジェクト自体のプロパティは自由に変更できます。

于 2014-05-02T20:55:07.170 に答える
16

オブジェクトを として定義した後でもオブジェクトを更新できた理由を検索しているときに、この記事にたどり着きましたconst。したがって、ここでのポイントは、直接オブジェクトではなく、オブジェクトに含まれる更新可能な属性であるということです。

たとえば、私のオブジェクトは次のようになります。

const number = {
    id:5,
    name:'Bob'
};

上記の回答は、オブジェクトが const であり、その属性ではないことを正しく指摘しています。したがって、次のようにしてIDまたは名前を更新できます。

number.name = 'John';

ただし、次のようにオブジェクト自体を更新することはできません。

number = {
    id:5,
    name:'John'
  };

TypeError: Assignment to constant variable.
于 2019-06-17T17:15:22.640 に答える