1. JS 中的数据类型
2. JS 数据拷贝
3. JS函数中的参数传递
JS 数据类型
- 基本类型值:
- undefined:
- Null
- Boolean
- Number
- String
- 引用类型值:
- Object
- Array
- Function
- Date等
JS 数据的拷贝
JS中变量的基本类型数据和引用类型数据保存的方式不同,在数据拷贝时就存在区别。
- 浅拷贝(基本类型数据拷贝)
复制基本类型值,两个变量相互独立,只是单纯的value数据拷贝,两者是否被修改都互不影响
var s = 8;
var a = s;
console.log(a); //8
a = 16;
console.log(s) //8
console.log(a) //16
- 深拷贝(引用类型数据拷贝)
复制引用类型值,同样会将存储在变量对象中的值复制一份放到新变量分配的空间中
不同:复制对象时,不会在堆内存中新生成一个相同的对象,只是多了一个保存指向这个对象指针的变量而已。
把 obj 的值复制给objT,这个值的副本实际上是一个指针,指向存储在堆中的一个对象,即创建了一个新的内存地
址传给objT,obj 和 objT同时指向同一个 object,任何一个做出的改变都会反映在另一个身上
var obj = {
name:"lili";
age:23
}
var objT = obj;
console.log(obj.name) //lili
console.log(objT.name) //lili
objT.name = "liu";
console.log(obj.name) //liu
console.log(objT.name) //liu
JS函数中的参数传递
所有函数的参数都是按值传递的,即把函数外部的值复制给函数内部的参数
- 一般类型传参
var s = 12;
function add(c){
c = 6;
return c
}
var a = add(s);
console.log(a) //6
console.log(s) //12
- 对象传参
- 把info复制传入adit中,p 和 info指向同一个对象,是否修改相互影响
var info = {
name:"lili"
};
function adit(p){
p.name = "Jen";
return p;
}
var some = adit(info);
console.log(some.name) //Jen
comsole.log(info.name) //Jen
解除影响:函数中重定义了一个对象,即堆内存中两个对象,调用后返回的值是新对象的值,按值传递(共享传递)
var info = {
name:"lili"
};
function adit(p){
p = {
name:"Jen"
};
return p;
}
var some = adit(info);
console.log(some.name) //Jen
comsole.log(info.name) //lili
函数调用过程中,值传递、参数不对等处理上,不管实参的数目大于还是小于形参,数据类型是否准确,调用的函数都会被执行
理解:JS中的参数在内部是用数组表示的。函数接收的始终是个数组(arguments对象),可以通过下标来获取传入的每一个元素(arguments[0]),也可以用length属性来气确定传递进来的参数个数
function hello(name,msg){
console.log("hello ' + arguments[0] +arguments[1])
console.log(arguments.length)
}
function say(){
console.log("hello ' + arguments[0] +arguments[1])
console.log(arguments.length)
}
hellow('lili',',how are you');
say('lili',',how are you');
//以上都会输出:hello lili ,how are you