2017-06-26 10 views
0

私は実際にどのようにこれが可能であるかを実際に説明することができない状況に遭遇しました。_DEFAULT定数変数が更新されるのはなぜですか?

デモ用にplunkerを作成しました。

CODE:

angular.module('test', []).controller('TestController', function($scope) { 

/* 
    DEFAULT CONST VARIABLE 
*/ 
const _DEFAULT = { 
    items: [], 
    name: 'Test', 
    selected: null 
}; 

/* 
    TEST_CASE SCOPE VARIABLE 
*/ 
$scope.test_case = _DEFAULT; 

console.log('ON INIT DEFAULT: ', _DEFAULT); 

/* 
    FUNCTION 
*/ 
$scope.clicked =() => { 
    // SET TEST_CASE.SELECTED = 1 
    $scope.test_case.selected = 1; 

    // SHOW UPDATED TEST_CASE AND _DEFAULT VARIABLE 
    console.log($scope.test_case, _DEFAULT); 
}; 

})。

ボタンがクリックされた(check demo)私たちははそれが_DEFAULTは触れていないか、変更されたことがないときのconst変数_DEFAULT$scope.test_caseと同じデータを持っている可能性があるどのようにだけ$scope.test_case内のデータを変更できますか?

これは不可能か、何か不足していますか?

+0

'$ scope.test_case'は*が' _DEFAULT'と同じ*ですか? – Bergi

+0

どのように同じですか?それが同じ場合、どのように更新されずに割り当てられる変数を作ることができますか? _DEFAULTと同じように、私は更新されません。私は$ scope.test_caseを更新したかった。どちらも代わりに更新されました。 – Vizjerei

+1

「両方のオブジェクト」はありません。2回参照されるオブジェクトは1つだけです。独立した第2のものが必要な場合は、明示的に複製する必要があります。複製を参照してください。 – Bergi

答えて

1

これは仕様によるもの:

CONST宣言値に読み取り専用の参照を作成します。保持している値が不変であることを意味するものではなく、変数識別子を再割り当てできないということだけではありません。例えば、コンテンツがオブジェクトである場合、これは、オブジェクトのコンテンツ(例えば、そのパラメータ)が変更可能であることを意味する。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

この文脈でconstキーワードは、新しい値を割り当てられているから、変数、_DEFAULTを防ぐことができますが、それは変化するから、その変数の値を防ぐことはできません。

+0

しかし、私は_DEFAULTデータを変更していません。私が更新することができない唯一の変数は$ scope.test_caseです。 – Vizjerei

+1

@Vizjerei '_DEFAULT'と' $ scope.test_case'の両方が同じオブジェクトを指しています。このオブジェクトを更新しているので、変更は両方の参照に反映されます。 – maddockst

+1

'$ scope.test_case'を' _DEFAULT'に代入すると、値ではなく参照として割り当てられます。デフォルトのコピーが必要な場合は、 'angular.copy(_DEFAULT)'を使ってオブジェクトの新しいインスタンスを取得します。 –

関連する問題