在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值。
js数据分为两种类型:基础数据类型和引用数据类型:
1、基础数据类型:
就是简单的数据段。按值引用,可以操作保存在变量中的实际的值。(如图1,a1\b1\e1\f1)
js包含五种基础数据类型:Undefined、Null、Boolean、Number 和 String。
从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值时会返回"object"的原因。
2、引用数据类型:
是存在内存中的对象,引用类型的值是按引用访问的,JavaScript 不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。(如图1,c2\d2)
复制变量值:
除了保存的方式不同之外,在从一个变量向另一个变量复制基本类型值和引用类型值时,也存在不同。
1、基础数据类型复制
var num1 = 5;
var num2 = num1; //5
2、引用类型复制
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"
传递参数:
ECMAScript 中所有函数的参数都是按值传递的。基本类型值的传递如同基本类型变量的复制一样,而
引用类型值的传递,则如同引用类型变量的复制一样。
1、基本数据类型参数传递
function addNum(num){
num=num+10
return num
}
const age=20
const result=addNum(age)
console.log(age) //20
console.log(result) //30
这个例子的意思据说基本类型值的age=10传入到addNum方法中,相当于num复制了age的值(基础数据类型复制)。所以无论内容数据如何变化都不影响age本身的值。
2、引用数据类型参数传递
function setName(obj) {
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
以上代码中创建一个对象,并将其保存在了变量 person 中。然后,这个变量被传递到 setName()
函数中之后就被复制给了 obj。于是,当在函数内部为 obj 添加 name属性后,函数外部的 person 也将有所反映。
function setName(obj) {
const objNew=obj
obj.name='jack'
}
const person={
name:'nick'
}
setName(person)
console.log(person) //jack person本身的name被修改
以上例子要说明的是开发过程中要注意,由于引用类型传递时复制指向内存的地址,所以传递对象时进行深拷贝,否则可能会影响原值。