總結(jié)
- 對于引用類型值愿伴,可以為其增加、修改电湘、刪除屬性和方法隔节,而基本類型不行。
- 引用類型值的復(fù)制本質(zhì)上屬于淺拷貝寂呛。
- ECMAScript函數(shù)所有的參數(shù)傳遞都是值傳遞怎诫。
- ECMAScript提供
instanceof
操作符來檢測對象的類型。
與C/C++不同之處
- JavaScript不允許直接訪問內(nèi)存中的位置贷痪。
正文
ECMAScript變量可能包含兩種不同數(shù)據(jù)結(jié)構(gòu)的值:基本類型值和引用類型值幻妓。
基本類型值,指的是簡單的數(shù)據(jù)段劫拢。
引用類型值肉津,指那些可能由多個(gè)值構(gòu)成的對象。
在將值賦給變量時(shí)舱沧,解析器必須確定這個(gè)值是基本類型值還是引用類型值妹沙。而5種基本類型(哪幾種?)熟吏,是按值訪問的距糖,因?yàn)槭强梢圆僮鞅4嬖谧兞糠N的實(shí)際的值。
引用類型的值是保存在內(nèi)存中的對象牵寺,JavaScript不允許直接訪問內(nèi)存中的位置悍引,也就是說不能直接操作對象的內(nèi)存空間。
動態(tài)的屬性
定義基本類型值和引用類型值的方式是類似的:創(chuàng)建一個(gè)變量并為該變量賦值帽氓。
對于引用類型的值趣斤,我們可以為其添加屬性和方法,也可以改變和刪除其屬性和方法黎休。
var persion = new Object();
persion.name = "Hello";
alert(persion.name); //Hello
但是浓领,我們不能給基本類型的值添加屬性,盡管這樣做不會導(dǎo)致任何錯(cuò)誤奋渔。
var name = "Hello";
name.age = 10;
alert(name.age); //undefined
復(fù)制變量的值
復(fù)制基本類型值镊逝,會在變量對象上創(chuàng)建一個(gè)新值,然后把該值復(fù)制到為新變量分配的位置上嫉鲸。
var num1 = 5;
var num2 = num1;
num1 = 6;
alert(num1); 6
alert(num2); 5
復(fù)制引用類型值時(shí)撑蒜,同樣也是將存儲在變量對象中的值復(fù)制一份放到新變量分配的空間中,不同的是,這個(gè)值的副本實(shí)際上是一個(gè)指針座菠。(淺拷貝)
因此狸眼,改變其中一個(gè)變量,會影響另外一個(gè)變量浴滴。
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Hello";
alert(obj2.name); //Hello
傳遞參數(shù)
ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的拓萌,也就是說,傳遞參數(shù)的這個(gè)過程升略,相當(dāng)于把值從一個(gè)變量復(fù)制到另一個(gè)變量微王。
在向參數(shù)傳遞基本類型的值時(shí),被傳遞的值會復(fù)制給一個(gè)局部對象品嚣。
function addTen(num){
num+=10;
return num;
}
var count = 20;
var result = addTen(20);
alert(count); //20
alert(result); //30
而向參數(shù)傳遞引用類型的值時(shí)炕倘,會把這個(gè)值在內(nèi)存中的地址復(fù)制給一個(gè)局部對象。
funciton setName(obj){
obj.name = "hello";
}
var persion = new Object();
setName(persion);
alert(persion.name); //"hello"
為了證明對象是按值傳遞的翰撑,我們可以看看經(jīng)過修改的例子:
function setName(obj){
obj.name = "hello";
obj = new Object();
obj.name = "world!";
}
var persion = new Object();
setName(persion);
alert(persion.name); //hello
上述例子說明罩旋,即使在函數(shù)內(nèi)部修改了參數(shù)的值,但原始的引用依然保持未變眶诈。
檢測類型
要檢測一個(gè)變量是不是基本類型涨醋,我們可以使用typeof
操作符。但在檢測引用類型的值時(shí)逝撬,這個(gè)操作符的用處就不大了浴骂。
為此,ECMAScript提供了instanceof
操作符球拦,其語法如下所示:
var result = persion instanceof Object;
根據(jù)規(guī)定靠闭,所有的引用類型的值都是Object
的實(shí)例,因此坎炼,在檢測 一個(gè)引用類型值和Object
構(gòu)造函數(shù)時(shí),instanceof
操作符始終會返回true
拦键。
如果用instanceof
操作符檢測基本類型時(shí)谣光,該操作符始終會返回false
。
完芬为!