JS基本类型和引用类型

326 阅读2分钟

新手上路,如有不对的地方,请多多指教,最近在巩固基础,自己总结一下用于复习。

基本类型和引用类型

基本类型
  • 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

blog.fundebug.com/2017/08/09/…