一:栈内存和堆内存介绍
1.存储:
- 栈内存:存放基本类型(Undefined,Null,Boolean,Number,String)以及引用类型值的地址,一般存储的大小是已知的
- 堆内存:存放引用类型值,一般存储的大小是未知的,需要动态分配
2.图示解析
二:应用
1.const定义的值能够更改?
答:const定义的基本类型的值不可以改,但是定义的对象,里面的属性和方法可以改
const a = 1;
a = 2;
//此时报错
const b = {}
b.name ="hello"
console.log(b) //输出结果是{name:'hello'}
2.Js的浅拷贝和深拷贝
-
如何区分深拷贝与浅拷贝?
假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝。
-
举个例子 如图所示:当a修改了,b也跟着做相应的修改,这就是浅拷贝
-
实现深拷贝的方法 方法一: JSON.stringify() 和JSON.parse()
缺点:不可以拷贝undefined,function等类型
var obj = {a: 1,b:2,c:3}
m = obj
// 输出的m为:{a: 1, b: 2, c: 3}
// 输出的obj为{a: 1, b: 2, c: 3}
obj.a = 'hello'
//此时obj和m都为,这是浅拷贝{a: 'hello', b: 2, c: 3}
var objString = JSON.stringify(obj)
var obj2 = JSON.parse(objString)
obj.b = 'word'
//输出的obj为{a: 'hello', b: 'word', c: 3}
//输出的obj2为{a: 'hello', b: 2, c: 3}
//此时为深拷贝
方法二: Object.assign(target,source)
缺点:只能拷贝一层嵌套的,多层不可以
var obj1 = {
a: 1,
b: 2,
c: ['a','b','c']
}
var obj2 = Object.assign({}, obj1);
obj2.c[1] = 5;
console.log(obj1.c); // ["a", 5, "c"]
console.log(obj2.c); // ["a", 5, "c"]
方法三: 递归拷贝
function deepCopy( source ) {
if (!isObject(source)) return source; //如果不是对象的话直接返回
let target = Array.isArray( source ) ? [] : {} //数组兼容
for ( var k in source ) {
if (source.hasOwnProperty(k)) {
if ( typeof source[ k ] === 'object' ) {
target[ k ] = deepCopy( source[ k ] )
} else {
target[ k ] = source[ k ]
}
}
}
return target
}
function isObject(obj) {
return typeof obj === 'object' && obj !== null
}