ホームページ >ウェブフロントエンド >jsチュートリアル >アレイとオブジェクトを===と比較できないのはなぜですか

アレイとオブジェクトを===と比較できないのはなぜですか

DDD
DDDオリジナル
2025-01-29 20:37:08538ブラウズ

Why can’t we compare arrays and objects with ===

この記事では、一般的なJavaScriptの質問を調査します。なぜなら、アレイとオブジェクトを比較するときに、厳密な平等演算子(

)が期待どおりに機能しない理由。 この動作を理解するために、JavaScriptの内部作業を掘り下げます。 === JavaScriptは、原始的なデータ型と非適合性データ型を区別します。 プリミティブタイプ(ブール、ヌル、未定義、文字列、数)は値で渡されますが、非プリミティブタイプ(配列、関数、オブジェクト - すべて技術的にオブジェクト)は参照によって渡されます。

プリミティブタイプの動作(値ごとに合格)プリミティブ変数を宣言すると、値は直接保存されます。

非プリミティブタイプの動作(参照による合格)

非プリミティブ変数は、オブジェクト自体ではなく、オブジェクトのメモリの位置に参照を保存します:

<code class="language-javascript">const name = 'John';
const age = 25;</code>
最初に、

は、空の配列を指して参照(メモリアドレスh001など)を保持します。 fruitsの後、H001での配列が変更されます。push()

リファレンスコピー

を使用して参照変数をコピーすると、オブジェクトのデータではなくリファレンスをコピーします。 =

<code class="language-javascript">const fruits = [];
fruits.push('Banana');</code>

の両方が同じメモリの位置を指します。 一方を変更すると、もう一方の変更が変更されます。fruits yellowFruits「パイナップル」を追加して

も変更します。

yellowFruits参照変数の再割り当てfruits参照変数を再割り当てすると、新しいリファレンスが作成されます:

元のオブジェクトはメモリのままですが、は新しいオブジェクトを指しています

<code class="language-javascript">const fruits = ['Banana'];
const yellowFruits = fruits;</code>
なぜ

アレイとオブジェクトで失敗する{ name: 'John' }person { name: 'Mary' }

オペレーターは、非プリミティブタイプの参照を比較します。 したがって、

===

が同一の内容を持っていても、それらは異なるメモリアドレスを持っているため、

===になります。

<code class="language-javascript">let person = { name: 'John' };
person = { name: 'Mary' };</code>
関数パラメーターと純度プリミティブ値を関数に渡すと、値がコピーされます。 ただし、通過するオブジェクトは参照を渡します。 この区別は、純粋な機能と不純な機能を理解するために重要です。 arr1 arr3false純粋な関数:

外部状態を変更しないでください。 彼らは自分の入力のみで動作し、予測可能な出力を生成します。

不純な関数:関数の範囲外の元のオブジェクトに影響を与える引数として渡されたオブジェクトを変更できます。

オブジェクトを変更する純粋な関数を作成するには、変更前にコピーを作成します。

  • 概要
  • プリミティブタイプは価値で渡されます。非プライティブタイプは参照によって渡されます。
  • 非適合タイプの参照を比較します。

リファレンスコピーを理解することは、予測可能で保守可能なコードを書くために不可欠です。

純粋な関数は、外部状態を変更しないことで副作用を避けます。
<code class="language-javascript">const arr1 = ['1'];
const arr2 = arr1;  // Same reference

console.log(arr1 === arr2); // true

const arr3 = ['1']; // Different reference
console.log(arr1 === arr3); // false</code>

JavaScriptメモリ管理に深く掘り下げるには、コールスタックとメモリヒープを探索してください。

以上がアレイとオブジェクトを===と比較できないのはなぜですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。