JavaScript中的值類型與引用類型
數據類型 | 值/引用類型 | 備註 |
---|---|---|
undefined | 值類型 | 無值 |
number | 值類型 | |
boolean | 值類型 | |
string | 值類型 | 字符串在賦值運算中會按照引用類型的方式來處理 |
function | 引用類型 | |
object | 引用類型 |
在JavaScript中,“全等(===)運算符”用來對值類型/引用類型的實際數據進行比較和檢查。按照約定,基於上述類型系統的運算中(以下所謂“值”,也包括undefined):
- 一般表達式運算的結果總是值
- 函數/方法調用的結果可以返回值或者引用
- 值與引用、值與值之間即使等值(==),也不一定全等(===)
- 兩個引用之間如果等值(==),則一定全等(===)
從表面上來看,一個值應該與其自身“等值/全等”。但事實上,在JavaScript中存在一個例外:一個NaN值,與其自身並不等值,也不全等。
舉幾個栗子:
0 == "0" //true
0 === "0" //false
1 == true //true
0 == true //false
's' == 's' //true
new String('s') == new String('s') //false 這裏都是引用
兩種類型在函數調用時的區別
JavaScript中的值類型與引用類型,同其他通用高級語言一樣,表達的含義是數據在運算時的使用方式:參與運算的是其值亦或其引用。因此在下面的示例中,不同的值類型通過相同的函數調用之後輸出的是不同的結果。
//1
function newToString(){
return 'Hello World!';
}
function func(val){
val.toString = newToString;
}
var str = 'abc';
var strTemp = new String(str);
func(str);//只傳入了str的值,因此對它的toString修改是無意義的
console.log(str);//abc
func(strTemp);//傳入引用,修改toString屬性會影響到後面的運算。
console.log(strTemp);//Hello World!
//2
function addNum(num){
num+=num*2;
return num;
}
var num = 1;
var result = addNum(num);
console.log(num);//1
console.log(result)//3
//3
function setName(obj){
obj.name = 'Jack';
obj = new Object(); //創建一個新的對象,並且把新對象的地址賦值給obj,所以obj並不指向外面的obj。
obj.name = 'Jacky';
}
var obj = new Object();
obj.name = 'test';
setName(obj);
console.log(obj.name);//Jack