Js基础知识加强排

手写代码

实现函数能够深度克隆基本类型

JS 中的浅拷贝深拷贝,只是针对复杂数据类型(ObjectArray)的复制问题。浅拷贝深拷贝都可以实现在已有对象上再生出一份的作用。但是对象的实例是存储在堆内存中然后通过一个引用值去操作对象,由此拷贝的时候就存在两种情况了:拷贝引用拷贝实例,这也是浅拷贝深拷贝的区别。注:有的数组自带方法是局限性的,例如slice()concat(),仅适用于对不包含引用对象的一维数组的深拷贝。

数组的深拷贝

  • slice()(有上述局限)
  • concat()(有上述局限)
  • 扩展运算符(有上述局限)

对象的深拷贝

  • 利用 JSON 对象中的 parsestringify
  • 扩展运算符(有上述局限)
  • 利用递归来实现每一层都重新创建对象并赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
function deepCopy(obj) {
if (typeof obj === 'object') {
var result = obj.constructor === Array ? [] : {};

for (var i in obj) {
result[i] = typeof obj[i] === 'object' ? deepCopy(obj[i]) : obj[i];
}
} else {
var result = obj;
}

return result;
}

函数中的arguments是数组吗?类数组转数组的方法了解一下?

函数中的arguments是类数组:

1
2
3
4
5
function info(name,age,address){
return arguments
}
let arg = info(1,2,3)
console.log(arg);

结果:

1
2
3
4
5
6
{
0:1,
1:2,
2:3,
length:3
}

类数组转数组的方法:

  • 扩展运算符
  • Array.from
  • Array.prototype.slice.apply(arguments)

原型、原型链、继承

详见JavaScript深入之从原型到原型链到继承

ES5中this、apply、call、bind问题

详见Js中关于this、apply、call、bind的深入探讨

运行机制

详见「硬核JS」一次搞懂JS运行机制