引言:
因為Javascript變量是松散類型的本質件蚕,所以決定了它只是在特定時間用于保存特定的值的一個名字而已猪勇,所以變量的值以及數據類型可以在腳本的生命周期內改變溜族。
一.基本類型和引用類型的值
ECMAScript變量有兩種不同數據類型的值:基本類型值和引用類型值。
基本類型值:簡單的數據
引用類型的值:可能由多個值構成的對象
在將一個值賦值給變量時挤悉,解析器必須確定這個值是基本類型值還是引用類型值渐裸,
比如基本數據類型:Undefined、Null装悲、Boolean昏鹃、Number和String,這五種基本數據類型是按照值訪問的诀诊,因為可以操作保存在變量中的值洞渤。而引用類型的值是保存在內存中的對象,與其他語言不同属瓣,Javascript不允許直接訪問內存中的位置载迄,也就是說不能直接操作對象的內存空間。
在操作對象時實際上是在操作對象的引用而不是實際的對象抡蛙。所以引用類型的值是按引用訪問的护昧。
1.動態(tài)的屬性
定義基本類型的值和引用類型的值基本是一樣的,但是當這個值保存到變量中以后粗截,對不同類型的值可以執(zhí)行的操作則大相徑庭惋耙。
對于引用類型的值,我們可以為其添加屬性和方法熊昌,也可以改變和刪除其屬性和方法怠晴。
比如:
var person = new Object();
person.name = "路飛";
alert(person.name);//路飛
但是我們不能給基本類型的值添加屬性,盡管這樣做不會導致任何錯誤...
var name = "索隆";
name.dream = "世界第一劍士";
alert(name.dream); //undefined
這也說明了一個問題浴捆,只能給基本類型的值動態(tài)的添加屬性。
2.復制變量值
2.1如果從一個變量向另一個變量復制基本類型的值稿械,會在變量上創(chuàng)建一個新值选泻,然后把該值復制到新變量分配的位置上。
比如:
var num1 = 5;
var num2 = num1;
此時,num1的5和num2的5是完全獨立的页眯。
2.2當從一個變量向兩一個變量復制引用類型的值時梯捕,同樣也會將變量存儲的值復制到新的變量的分配的位置上,但是這個值的副本實際上是一個指針窝撵,而這個指針指向存儲在堆中的一個對象傀顾。復制結束后,兩個變量實際上是引用同一個對象碌奉,因此改變其中一個變量短曾,就會影響另一個變量。
比如:
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "喬巴";
alert(obj2.name);//喬巴
3.傳遞參數
ECMAScript中所有函數的參數都是按值傳遞的赐劣!
再向參數傳遞基本類型的值時嫉拐,被傳遞的值會會被復制給一個局部變量(即命名參數)。再向參數傳遞引用類型的值時魁兼,會把這個值在內存中的地址復制個局部變量婉徘,因此這個局部變量的變化會反映在函數的外部。
比如:
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); //20 沒有變化
alert(result);//30
如果使用對象傳遞
function setName(obj){
obj.name = "山治";
}
var person = new Object();
setName(person);
alert(person.name);//山治
當person當做參數傳遞到setName()函數中之后就復制 給了obj,在這個函數的內部咐汞,obj和person引用的是同一個對象盖呼。所以在函數內部添加屬性后,函數外部的person也將有所反應化撕。
function setName(obj){
obj.name = "山治"几晤;
obj = new Object();
obj.name = "喬巴";
}
var person = new Object();
setName(person);
alert(person);//山治
4.檢測類型
4.1基本數據類型檢測:typeof
var str = "123";alert(typeof str);//String
var num = 123;alert(typeof num);//Number
var bool = true;alert(typeof bool);//Boolean
var udf ; alert(typeof udf);//undefined
var n = null;alert(typeof n);//object
var obj = new Object();alert(typeof obj);//object
4.2引用類型檢測:instanceof
語法:result = variable instanceof constructor
alert(person instanceof Object);//變量person是object嗎? true : false
alert(arr instanceof Array);//變量arr 是Array嗎?true : false
alert(reg instanceof RegExp);//變量reg是RegExp嗎? true : false
注意:所有引用類型都是Object的示例侯谁,因此在檢測一個引用類型值和Object構造函數時锌仅,instanceof操作符始終會返回true。