# 深浅拷贝问点
# 前言
前面系列即为前端面试系列(Front-end interview series), 主要内容是一些前端面试中经常被问到的题.
系列问答中没有繁琐的讲解过程, 力求保证面试者给予面试官一个简洁、具有重点的答案, 所以适合于有一定知识基础的前端童鞋👨🎓. 当然, 在每题的最后我也会贴上关于这一章节比较好文章, 以供大家更好的理解所提到的知识点.
请认准github地址: niubility-coding-js
# 一、面试部分
# 1. 有哪些属于浅拷贝 🤔️?
Object.assign()方法- 展开算法
Spread({...obj}) - 操作数组的方法
slice()、concat()
# 2. 有哪些深拷贝的方式 🤔️?
- 比较流氓式的方式:
JSON.parse(JSON.stringify(object)) - 自己实现一个深拷贝的方法
- 使用一些工具库里的方法, 比如
lodash里的cloneDeep(),jquery里的extend().
# 3. JSON.parse(JSON.stringify(object))的缺点
- 会忽略属性值为
undefined、symbol、函数的这三种情况, 也就是不进行拷贝 - 不能解决循环引用问题
- 不能正确的处理
new Date - 不能处理正则(为正则的时候, 拷贝过去为一个空对象
{})
# 二、笔试部分
# 1. 手写一个Object.assign()函数实现
思路:
- 判断原生
Object是否支持assign, 若是不存在的话则使用Object.defineProperty方法将该函数绑定到Object中 - 判断传入的目标参数是否正确, 是否为
null - 使用
Object()将目标参数转为对象, 并保存为to, 最终要返回这个to - 使用
for..in循环遍历出所有可枚举的自有属性。并复制给新的目标对象(使用hasOwnProperty获取自有属性,即非原型链上的属性) - 在设计的时候需要在让该方法在严格模式下进行
function createAssign2 () {
if (typeof Object.assign2 !== 'function') {
Object.defineProperty(Object, 'assign2', {
value: function (target) {
"use strict";
if (target == null) {
throw new Error("Cannot convert undefined or null to object")
}
var to = Object(target);
for (var i = 1; i < arguments.length; i++) {
var nextSource = arguments[i];
for (var nextKey in nextSource) {
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
}
}
return to;
},