之前写过一篇,但是还是不是很清楚,一知半解。这里再来一篇加深印象!

老规矩先说说数据类型:

 

 

 基本数据类型和引用数据类型的储存方式有什么不同?

基本数据类型:变量名和值都储存在栈内存中,例如:

var num=10;

num变量在内存中储存如下:

 

引用数据类型:变量名储存在栈内存中,值储存在堆内存中,但是堆内存中会提供一个引用地址指向堆内存中的值,而这个地址是储存在栈内存中的,例如:

var arr=[1,2,3,4,5];

arr变量在内存中的储存如下:

javascript值传递与址传递

基本类型与引用类型最大的区别实际就是传值与传址的区别

值传递:基本类型采用的是值传递。

址传递:引用类型则是地址传递,将存放在栈内存中的地址赋值给接收的变量。

 分析:由于a和b都是引用类型,采用的是址传递,即a将地址传递给b,那么a和b必然指向同一个地址(引用类型的地址存放在栈内存中),而这个地址都指向了堆内存中引用类型的值。当b改变了这个值的同时,因为a的地址也指向了这个值,故a的值也跟着变化。

那么如何解决上面出现的问题,就是使用浅拷贝或者深拷贝了。

 

下面我将以最常见的数组和对象的深浅拷贝为例。

浅拷贝解决就是先设置一个新的对象obj2,通过遍历的方式将obj1对象的值一一赋值给obj2对象。

代码实现如下:

 

 但上面代码只能实现一层的拷贝,无法进行深层次的拷贝,封装函数再次通过对象数组嵌套测试如下:

由于for in 会遍历原型上面的东西,所以要做一个判断obj.hasOwnProperty(key) 是否是本身的属性

 

 结果证明,无法进行深层次的拷贝,这个时候我们可以使用深拷贝来完成,所谓深拷贝,就是能够实现真正意义上的数组和对象的拷贝,我们通过递归调用浅拷贝的方式实现。

结果证明上面的代码可以实现深层次的克隆。

//深拷贝
  function deepCopy(obj) {
    //定义一个对象,用来确定当前的参数是数组还是对象
    var objArray = Array.isArray(obj) ? [] : {};
    //如果obj存在,且类型为对象
    if (obj && typeof obj === "object") {
      for (key in obj) {
        if (obj.hasOwnProperty(key)) {
          //如果obj的子元素是对象,递归操作
          if (obj[key] && typeof obj[key] === "object") {
            objArray[key] = deepCopy(obj[key]);
          }else{
            objArray[key] = obj[key];
          }
        }
      }
    }
    return objArray;
  }

 

同时也可以用jquery下面的extend工具方法实现:

jQuery.extend([deep], target, object1, [objectN]);

第一个参数设置为true,则jQuery返回一个深层次的副本,递归地复制找到的任何对象。

 

比较js中两个对象相等 ==(基本数据类型题)

“如果两个操作数都是对象,则比较他们是不是同一个对象,如果两个操作数都指向同一个对象,则相等操作符返回true,否则,返回false”。

function person() {
    // define some peroperty here
}
 
var p1 = new person();
var p2 = new person();
 
console.log(p1 == p2); //false

如果等号两边是对象或者对象的函数,则比较地址是否相等(即判断两者是否引用的同一对象)

 然后 有综合了一些查询结果,发现这里的地址应该指的是内存地址。“每生成一个实例就会重新占用一些内存”,所以两次生成的person占用的是不同的内存地址。所以返回结果是false。new person();新开辟内存,址指向新的内存

 

let a = { a: 1 };
let b = { a: 1 };
let c = a;
 
console.log(a === b); // 打印 false,即使它们有相同的属性
console.log(a === c); // true

 

a,c 都是指向同一个地址

 

那这样的话怎么样才能用==返回true呢?我又查了一下,没有找到特别合适的例子,指找到一个用prototype定义函数可以得到== 返回true的效果

function person(name) {
    this.name=name;
}
 
var p1 = new person("p1");
var p2 = new person("p2");
 
console.log(p1 == p2); //false
            
person.prototype.sayHi = function() {
    // do sayHi here
}
 
console.log(p1.sayHi() == p2.sayHi()); //true
console.log(p1.sayHi() === p2.sayHi()); //true

 

posted on 2021-01-08 16:51  京鸿一瞥  阅读(156)  评论(1)    收藏  举报