保持对代码的热爱并保持怀疑态度
什么是栈堆,及其区别
- 栈:用来保存变量的名称或地址,稳定,不可更改,空间小; 先进后出
- 堆:用来保存数据或值,空间大,可被修改 :先进先出
- 关系:一对一,多对一,不能一对多
什么是值传递,什么是引用传递
-
(基本数据)值传递:内有地址和值之分,值就是地址,地址就是值
– 字符,数据,布尔,undefind -
(复杂数据)引用传递:有地址和值,地址是地址,存在栈中,值是值,存在堆中,被栈中的地址指向
– 对象
深浅拷贝的区别,如何实现深拷贝
- 浅拷贝:只拷贝地址
- 深拷贝:拷贝值
- 实现深拷贝:先创建一个新的地址,逐个拷贝原地址中的值
栈中直接是深拷贝
var a=1;
var b=a;
b=20;
console.log(a);
console.log(b);
拷贝a的值,然后b重新赋值不会影响到a的值。
对象的浅拷贝
浅拷贝
var a={
sex:123,
yty:456
}
var b=a;
b.sex=12456
console.log(a);
console.log(b);
改变b的时候同时会改变a对象中的值
对象的深拷贝方式
用for in 遍历
var a={
sex:123,
yty:456
}
var b={};
for( let i in a){
b.sex=a.sex;
b.yty=a.yty
}
console.log(b);
利用JSON的转化实现
var a={
sex:123,
yty:456
}
var b=JSON.parse(JSON.stringify(a));
b.sex="sdd"
console.log(b);
console.log(a);
技术有限,目前只会这两种,但是这两种缺点很明显
JSON.stringify()由于返回了新对象,如果对象中存在函数,undefind会丢失
for-in用来循环对象中的属性,但是通过for-in循环输出的属性名的顺序是不可测的。具体来说,所有属性都会被返回一次,但返回的先后次序可能会因浏览器而异。
ES5之前:如果表示要迭代的对象的变量值为null或undefined,for-in语句会抛出错误;
ES5之后:这种情况不再抛出错误,而只是不执行循环体。
for-in会遍历原型链上的属性
所以最好的方法就是自己封装一个函数专用来实现拷贝。