新手上路,如有不对的地方,请多多指教,最近在巩固基础,自己总结一下用于复习。
基本类型和引用类型
基本类型
- Undefined
- Null
- String
- Boolean
- Number
- Symbol
基本类型的复制的过程是在变量对象上创建一个新的变量,再将值复制到新变量分配的位置上
引用类型
- Object
- Array
- Function
引用类型的值实际上存储在堆内存里的一个对象里,引用类型相当于一个指针,指向堆内存对象,当你复制一个引用类型,也会在变量对象上创建一个新的变量,但是这个变量也是一个指针,指向堆内存的对象。
传递参数
在ECMA中所有函数的参数都是按值传递的
所以函数外部的值复制到函数内部的参数,就相当于变量的复制,这时候就要区别基本类型和引用类型。
函数传参的值是基本类型的话,在函数内进行参数的操作,不会改变外部的值。
引用类型复制是引用值,相当于指针,所以形参和实参都指向堆内存里的对象。
如果仅仅是改变引用值内的属性,那么形参和实参都有影响
function changeAgeImpure(person) {
person.age = 25;
return person;
}
var alex = {
name: "Alex",
age: 30
};
var changedAlex = changeAgeImpure(alex);
console.log(alex); // { name: 'Alex', age: 25 }
console.log(changedAlex); // { name: 'Alex', age: 25 }
在函数里给形参重新赋值,相当于指向的对象不一样了,形参会有影响,实参没有影响。
function changeAgeAndReference(person) {
person.age = 25;
person = {
name: "John",
age: 50
};
return person;
}
var personObj1 = {
name: "Alex",
age: 30
};
var personObj2 = changeAgeAndReference(personObj1);
console.log(personObj1); // -> { name: 'Alex', age: 25 }
console.log(personObj2); // -> { name: 'John', age: 50 }
== 和 ===
对于引用类型的变量,==和===只会判断引用的地址是否相同,而不会判断对象具体里属性以及值是否相同。因此,如果两个变量指向相同的对象,则返回true。
var arrRef = ["Hi!"];
var arrRef2 = arrRef;
console.log(arrRef === arrRef2); // true
如果是不同的对象,及时包含相同的属性和值,也会返回false
var arr1=["Hi!"];
var arr1=["Hi!"];
console.log(arr1 === arr2); //false
如果想判断两个不同的对象是否真的相同,一个简单的方法就是将它们转换为字符串然后判断。
var arr1str = JSON.stringify(arr1);
var arr2str = JSON.stringify(arr2);
console.log(arr1str === arr2str); // true
另一个方法就是递归地判断每一个属性的值,直到基本类型位置,然后判断是否相同。
参考: Fundebug