この記事では、JavaScript 変数に含まれる 2 つの異なるデータ型、つまり基本型の値と参照型の値の違いに焦点を当てます。また、ECMAScript と JavaScript の関係についても簡単に触れました。
タイトルはJavaScript変数ですが、正確にはECMAScript変数のはずです。
1990 年代に、Netscape と Microsoft は JavaScript の 2 つの異なるバージョンを発表しましたが、これは JavaScript の開発と使用に役立たず、欧州コンピュータ製造者協会 (ECMA) が JavaScript の標準化問題への対応を開始することになり、これにより JavaScript が完成しました。有名な ECMA-262 - ECMAScript と呼ばれる新しいスクリプト言語を定義する標準。
完全な JavaScript 実装には、ECMAScript、ドキュメント オブジェクト モデル (DOM、ドキュメント オブジェクト モデル)、およびブラウザ オブジェクト モデル (BOM、ブラウザ オブジェクト モデル) が含まれます。 JavaScript の中核であり、その実装の基礎である ECMAScript は、ECMA-262 標準で指定された構文、型、ステートメント、キーワード、予約語、演算子、およびオブジェクトの観点から言語を記述したものです。
ECMA-262 標準で指定されている ECMAScript 変数は型指定が緩く、あらゆる種類のデータの保存に使用できるため、異なる型の変数を初期化する操作を 1 つのステートメントで実行できます。たとえば、次のコードです。合法です。
var message = "hello", //string age = 20, //number3 found = false; //boolean
var演算子で定義した変数は、変数が定義されているスコープ内ではローカル変数となり、スコープを抜けた直後に変数は破棄されます。たとえば、関数内で変数を定義した場合、関数の呼び出し時に変数が作成されますが、関数が終了すると、その変数にアクセスできなくなります。
ECMAScript には 6 つのデータ型があります (6 つだけです。ECMAScript はカスタム タイプを作成するメカニズムをサポートしていません)。
このうち、基本データ型には、underfined、null、boolean、number、string の 5 つの型があり、これらの 5 つの基本データ型は、値によってアクセスされます。記事の先頭にある と は単純なデータ セグメントであり、変数に格納されている実際の値を操作できます。
6 番目の型は複合データ型であるオブジェクトで、基本的に順序付けされていない名前と値のペアのセットで構成され、参照型の値であり、メモリに格納されるオブジェクトです。 JavaScript では、オブジェクトのメモリ空間を直接操作することはできません。オブジェクトを操作する場合、実際には、実際のオブジェクトではなくオブジェクトへの参照を操作することになります。
変数を定義するときにそのデータ型を指定する必要はありませんが、基本型と参照型の値に対して実行できる操作は依然として大きく異なります。
属性の追加
次のコードに示すように、参照型値の場合、その属性とメソッドを追加、変更、削除できます。
var obj = new object(); //创建对象并保存在obj中 obj.name = "Marry"; //添加名为name的属性,赋予字符串值“Marry” alert(obj.name); //弹出"Marry"
objオブジェクトが破棄されていない場合または name 属性は削除されません。この属性は常に存在します。
もう一度基本型の値を見てください:
var name = "Marry"; //创建字符串 name.age = 20; //添加名为age的属性,赋予number值20 alert(name.age); //弹出"underfined"
名前文字列には age 属性が追加され、値 20 が割り当てられていますが、この属性は次回アクセスすると消えます。
これは、属性は参照型の値にのみ動的に追加できることを示しています。
変数値をコピー
基本型の値を変数aから変数bにコピーすると、変数bオブジェクトに新しい値が作成され、その値がコピーされます変数aに割り当てられた場所を個別に保存します。これら 2 つの変数が関係する操作は相互に影響しません。
若从变量c向变量d复制引用类型的值,同样会将存储在变量d对象中的值复制一份放到为变量c分配的空间中,但这个值的副本实际是一个指针,与变量d指向堆内存中的同一个对象。两个变量实际引用同一个对象,改变其中一个变量,将影响另一个变量。
具体区别见如下例子:
//基本类型值 var num1 = 5;var num2 = num1; num2 = num2 + 5; alert(num1); //5alert(num2); //10/ /引用类型值 var obj1 = new object();var obj2 = obj1; obj1.name = "Marry"; alert(obj2.name); //"Marry"
函数传参
ECMAScript中所有函数的参数都是按值传递的,即将函数外部的值复制给函数内部的参数。鉴于基本类型值与引用类型值复制变量的不同,其函数传参的效果也不同。
在向参数传递基本类型值时,被传递的参数被赋给一个局部变量,函数内部参数的变化不影响函数外部的变量;向参数传递引用类型值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化将会反映在函数的外部。如下列例子:
//传递基本类型值function addnum(num) { num += 10; return num; }var num1 = 5;var num2 = addnum(num1); alert(num1); //5,无变化alert(num2); //15//传递引用类型值 function setage(obj) { obj.age = 20; }var obj1 = new object(); setage(obj1) alert(obj1.age); //20
在局部作用域中修改的对象反映在全局作用域中,很多人会以为这是按引用传递。但函数对象确实都是按值传递,见下列例子:
function setage(obj) { obj.age = 20; obj = new object(); obj.age = 30; }var obj1 = new object(); setage(obj1) alert(obj1.age); //20
此例中在函数内部为obj重新定义了一个对象,且为其age属性重新赋值,但这一变化并未反映在函数外部,说明obj1 并不是按引用传递的。实际函数内重新定义的对象为局部对象,在退出函数后就会被立即销毁。
检测类型
基本类型值可以通过typeof检测,但typeof检测引用类型时只能返回object。所以为了知道某个值是什么类型的对象,ECMAScript提供了instanceof操作符,语法如下:
result = variable instanceof constructor
如果变量是引用类型的实例,instanceof操作符就会返回true。
以上がJavaScript変数に関する問題の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。