1.基本类型
- 基本类型指的是简单的数据段,比如5种基本数据类型,都是按值访问的,因此可以直接操作保存在变量中的实际的值
- 复制基本类型的值时,会创建一个新值,由此变成2个变量,互相独立,互不影响
var num1 = 9;
var num2 = num1;
console.log(num1); //9
console.log(num2); //9
num2++;
console.log(num1); //9
console.log(num2); //10;只有num2自己改变了
2.引用类型
- 引用类型指那些可以由多个值构成的对象;在操作对象时,实际上是在操作对象的引用而不是实际的对象;因此,引用类型的值是按引用访问的
- 复制引用类型的值时,同样会生成一个新变量,但是新变量复制到的其实是一个指针,指向存储在堆内存中的原来的变量;也就是说,复制结束后,两个变量实际上引用同一个对象,改变其中一个变量,另一个也会受影响
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Asher";
console.log(obj2.name); //Asher;obj1和obj2指向同一个对象
3.两种类型值如何传递参数
- ECMAScript中所有函数的参数都是按值传递的;也就是说,把函数外部的值复制给函数内部的参数,就和把一个变量复制到另一个变量一样
- 引用类型的值作为参数传递时,传的是个地址值,或者指针值,不是引用类型本身,赋值给
arguments
的也一样
function addTen(num){
num += 10;
console.log(num); //30;经过函数计算的cont
}
var cont = 20;
addTen(cont);
console.log(cont); //20;函数外部变量cont依然是20,按值传递,不受影响
function setName(obj){
obj.name = "Asher";
}
var boy = new Object();
setName(boy);
console.log(boy.name); //Asher
//在这个函数内部,obj和boy引用的是同一个对象
//即使这个变量是按值传递的,但是obj还是会按引用来访问同一个对象
function setName(obj){
obj.name = "Asher";
obj = new Object(); //重新声明obj之后,相当于变成局部对象了,函数执行完之后会被销毁
obj.name = "Taylor";
console.log(obj.name); //Taylor
}
var boy = new Object();
setName(boy);
console.log(boy.name); //Asher;boy.name的值依然没变(没变成Taylor)
//即使在函数内部修改了参数值,原始引用仍然不变