之前写过一篇,但是还是不是很清楚,一知半解。这里再来一篇加深印象!
老规矩先说说数据类型:

基本数据类型和引用数据类型的储存方式有什么不同?
基本数据类型:变量名和值都储存在栈内存中,例如: 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
浙公网安备 33010602011771号