在將一個值賦給變量時熬拒,解析器必須確定這個值是基本類型值還是引用類型值爷光。
js數(shù)據(jù)分為兩種類型:基礎(chǔ)數(shù)據(jù)類型和引用數(shù)據(jù)類型:
1、基礎(chǔ)數(shù)據(jù)類型:
就是簡單的數(shù)據(jù)段澎粟。按值引用蛀序,可以操作保存在變量中的實際的值。(如圖1活烙,a1\b1\e1\f1)
js包含五種基礎(chǔ)數(shù)據(jù)類型:Undefined徐裸、Null、Boolean啸盏、Number 和 String重贺。
從邏輯角度來看,null 值表示一個空對象指針回懦,而這也正是使用 typeof 操作符檢測 null 值時會返回"object"的原因气笙。
2、引用數(shù)據(jù)類型:
是存在內(nèi)存中的對象怯晕,引用類型的值是按引用訪問的潜圃,JavaScript 不允許直接訪問內(nèi)存中的位置,也就是說不能直接操作對象的內(nèi)存空間舟茶。在操作對象時谭期,實際上是在操作對象的引用而不是實際的對象。(如圖1,c2\d2)
復(fù)制變量值:
除了保存的方式不同之外吧凉,在從一個變量向另一個變量復(fù)制基本類型值和引用類型值時隧出,也存在不同。
1客燕、基礎(chǔ)數(shù)據(jù)類型復(fù)制
var num1 = 5;
var num2 = num1; //5
2鸳劳、引用類型復(fù)制
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"
傳遞參數(shù):
ECMAScript 中所有函數(shù)的參數(shù)都是按值傳遞的狰贯∫泊辏基本類型值的傳遞如同基本類型變量的復(fù)制一樣赏廓,而
引用類型值的傳遞,則如同引用類型變量的復(fù)制一樣傍妒。
1幔摸、基本數(shù)據(jù)類型參數(shù)傳遞
function addNum(num){
num=num+10
return num
}
const age=20
const result=addNum(age)
console.log(age) //20
console.log(result) //30
這個例子的意思據(jù)說基本類型值的age=10傳入到addNum方法中,相當(dāng)于num復(fù)制了age的值(基礎(chǔ)數(shù)據(jù)類型復(fù)制)颤练。所以無論內(nèi)容數(shù)據(jù)如何變化都不影響age本身的值既忆。
2、引用數(shù)據(jù)類型參數(shù)傳遞
function setName(obj) {
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
以上代碼中創(chuàng)建一個對象嗦玖,并將其保存在了變量 person 中患雇。然后,這個變量被傳遞到 setName()
函數(shù)中之后就被復(fù)制給了 obj宇挫。于是苛吱,當(dāng)在函數(shù)內(nèi)部為 obj 添加 name屬性后,函數(shù)外部的 person 也將有所反映器瘪。
function setName(obj) {
const objNew=obj
obj.name='jack'
}
const person={
name:'nick'
}
setName(person)
console.log(person) //jack person本身的name被修改
以上例子要說明的是開發(fā)過程中要注意翠储,由于引用類型傳遞時復(fù)制指向內(nèi)存的地址,所以傳遞對象時進(jìn)行深拷貝橡疼,否則可能會影響原值援所。