Javascript
 Computer >> コンピューター >  >> プログラミング >> Javascript

JavaScriptでプリミティブ値が不変であるとはどういう意味ですか?

JavaScriptでは、プリミティブ値は不変であるとよく耳にしますが、非プリミティブ値は 変更可能。これらの値型(データ型とも呼ばれます)の違いを理解することが重要です。 )これにより、将来の頭痛の種を大幅に減らすことができます。

プリミティブ値は次のようなものです:

  • 数字
  • 文字列
  • ブール値

非プリミティブ値は次のとおりです。

  • オブジェクト
  • 機能

可変とは、できることを意味します 変更されます。

不変とは、できないことを意味します 変更されます。

非プリミティブ値は変更可能です

以下は、変数に割り当てられた人のリスト(配列)です。

let peopleList = ['Arnold', 'Linda', 'Sylvester', 'Dolph']

今、私は変異したい 私のリスト。変更とは、単に変更を意味します。 アーノルドをジャンクロードと交換し、結果を印刷したい:

let peopleList = ['Arnold', 'Linda', 'Sylvester', 'Dolph']

peopleList[0] = 'Jean-Claude'

console.log(peopleList)

出来た!既存の値に変更を加えたところです。この場合、既存の値は配列(リスト)、より具体的には配列オブジェクトでした 。

JavaScriptでは、非プリミティブ値は変更可能(変更可能)です。

プリミティブ値は不変です

以下は、変数に割り当てられるテキスト(文字列)値です:

let person = 'Ernold'

残念ながら、クラップは、名前の最初の文字にAの代わりにEを使用して、アーノルドのスペルを間違えました。それをすばやく変更して、結果を印刷しましょう:

let person = 'Ernold'

person[0] = 'A' 

console.log(person) // output: Ernold

待って、何?なぜ「アーノルド」を印刷するのですか? EをAに交換しただけではありませんか?

いいえ、変更しようとしている値は文字列であるため、 これはプリミティブ値です —およびすべてのプリミティブ値は不変(変更不可)です。

非プリミティブ値(オブジェクトと関数)のみが変更可能です。

混乱していますか?

JavaScriptの学習の旅の始めに、このようなことについて混乱するのはまったく普通のことです。なぜなら、表面上、上記の例は見た目も同じように動作するからです— 状況。

配列から名を印刷してみましょう 以前から:

let peopleList = ['Arnold', 'Linda', 'Sylvester', 'Dolph']

console.log(peopleList[0]) // output: "Arnold"

驚くことではありません。"Arnold"が出力されます。 。

それでは、最初の文字を文字列で印刷してみましょう。 以前から(スペルミスのある名前):

let person = 'Ernold'

console.log(person[0]) // output: ??

どうなると思いますか?

...

...

出来た! "E"を出力します !

上記が機能しないことを期待しましたか?

いずれにせよ、ここでの重要な教訓は、アクセスできるということです。 非プリミティブ値にアクセスする方法と同様の方法でプリミティブ値を取得しますが、変更(変更)することはできません。これが大きな違いです(アクセスと変更)。

JavaScriptでは、プリミティブ値は読み取り専用です。 一方、非プリミティブ値(オブジェクト/配列、関数)は両方とも読み取りと書き込みです。

そのため、配列の最初のアイテム値をArnoldから変更(変更)できます。 Jean-Claudeへ 以前は、"Ernold"からの単純なスペルミスを修正できません。 "Arnold"へ —文字列であり、文字列/プリミティブ値は不変であるため。

変数と値

(私はあなたの何人かが何を考えているか知っています)

プリミティブ値は不変であると結論付けたばかりですが、「Ernold」のスペルミスを修正することを決意しています。何か新しいことを試してみましょう!

次のコードを見てください(注意深く読んでください):

let person = 'Ernold'

person = 'Arnold'

console.log(person) // output: ??

文字列などのプリミティブ値について学んだことを考慮して、上記はArnoldを出力すると思いますか 、 はい、もしくは、いいえ?

...

(考えてみてください)

...

Arnoldを出力します !

理由をすでに知っている人もいますが、知らなかった場合、それは正常なことであり、すぐに「アハモーメント」を体験します。次の段落を注意深く読んでください。

上記のコードは、文字列値を変更しておらず、それに触れていないために機能します。代わりに、新しいを割り当てます 'Arnold'という文字列値 personに 変数であるため、'Ernold'を参照(ポイント)しなくなります 文字列値。

プリミティブ値は変更できませんが、変数は変更できます!

変数は値ではないため、可変性または不変性のルールは同じではありません。 変数は値を指しているだけです。

以前の文字列値'Ernold'には触れませんでした 直接、personに伝えました 'Arnold'という別の文字列を指す変数 次に、console.log()を使用しました 結果を印刷します。

ここで私が死んだ馬を打ち負かしていると思う人もいるかもしれませんが、JavaScriptがどのように機能するかを理解しておくことが重要です。繰り返しはあなたの友達です。

注:このチュートリアル全体で使用した変数のタイプは、キーワードタイプletです。 —前のコード例で見たように、これは変更可能です。 constを使用していましたか 変数の場合、状況は異なっていたでしょうが、別のチュートリアルのためにそのトピックを保存します。

要約:

JavaScriptの場合:

  • 非プリミティブ値は、参照、アクセス、および変更できます。
  • プリミティブ値は参照、アクセスできますが、変更されません。
  • 変数と値は2つの異なるものであり、異なるルールが適用されます。

  1. JavaScriptの関数式とは何ですか?

    関数式を使用すると、後で変数名を使用して呼び出すことができる変数に関数を格納できます。また、通常の関数宣言のように吊り上げられていないため、定義する前に呼び出すことはできません。 以下は、JavaScriptで関数式を実装するためのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-wid

  2. JavaScriptのクロージャとは何ですか?

    JavaScriptのクロージャを使用すると、外部関数が実行されて返された後でも、内部関数から外部関数スコープにアクセスできます。これは、内部関数が常に外部関数変数にアクセスできることを意味します。 以下はJavaScriptのクロージャのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device