箭头函数和普通函数的区别?
- 普通函数的this指向调用它的对象,箭头函数里的this是固定的(同时,没有其他的局部变量,比如this, arguments, super),它指向定义该函数时所在的对象。
- 箭头函数不能使用new来作为构造函数使用。
new操作符做了些什么?
- 创建了一个空对象
var obj = new Object()
- 设置原型链
obj.proto= Func.prototype
- 让Func的this指向obj, 并且执行Func函数体
Func.call(obj)
- 判断Func函数的返回值类型。
如果Func返回值是非引用类型或者没有返回值,则返回obj;如果是引用类型,则返回这个引用类型对象
call, apply和bind的区别?
相同点:都是用来改变函数的this指向
- call和apply都是用来在调用函数的时候同时改变this指向,其中call是将函数参数一个一个的传进来,apply则是将函数参数组合到数组中传进来的。
- bind只是绑定函数的this, 返回一个改变了this指向的新函数,不会立即执行这个函数。返回的新函数参数中始终有绑定时的参数。
function fn(a, b, c) {
console.log(a, b, c);
}
var fn1 = fn.bind(null, 'Dot');
fn('A', 'B', 'C'); // A B C
fn1('A', 'B', 'C'); // Dot A B
fn1('B', 'C'); // Dot B C
fn.call(null, 'Dot'); // Dot undefined undefined
浅拷贝和深拷贝的区别?
【我所理解的概念】 js基本数据类型是存在栈内存中,比较的是值的比较; 引用数据类型是存在堆内存中,比较的是引用的比较,两个独立的对象,js存储的是两个个指向堆内存的指针地址,将a对象复制给b,是对象保存在栈中地址的复制,他们指向的还是同一个堆地址。所以两者之间操作互相有影响。
深拷贝和浅拷贝是针对对象的概念,包括array.
- 浅拷贝指的是只拷贝对象的一层属性,如果属性值里还有对象则不拷贝。 浅拷贝的方法:
Object.assign()
let obj2 = {...obj1} 自定义一个浅拷贝方法:
function shallowCopy (obj) {
let copyObj = {}
for (let key in obj) {
console.log(key, 'key')
if (obj.hasOwnProperty(key)) {
copyObj[key] = obj[key]
}
}
return copyObj
}
- 深拷贝是拷贝一个对象的以及对象的所有子对象
JSON.parse & JSON.stringify, 非数组对象里面的undefined, function, symbol值会被忽略, 数组里的会转换成null。
自定义一个简洁版深拷贝方法:
function deepCopy (obj) {
let result = {}
Object.keys(obj).forEach(key => {
if (obj[key] && typeof obj[key] === 'object') {
result[key] = deepCopy(obj[key])
} else {
result[key] = obj[key]
}
});
return result
}