1.JS基础

1.原始类型有哪几种?分别是?null是对象么?

在 JS 中,存在着 6 种原始值:

  • boolean
  • null
  • undefined
  • number
  • string
  • symbol

虽然 typeof null 会输出 object但是这只是 JS 存在的一个悠久 Bug

2.引用类型和原始类型的不同之处?函数参数是引用类型会发生什么问题?

引用类型和原始类型不同的是,原始类型存储的是值,引用类型存储的是地址(指针),当改变函数引用类型参数的值,则原来的引用对象中的值也会随之发生变化。

3.typeof 是否能正确判断类型?instanceof 能正确判断对象的原理是什么?

typeof 对于原始类型来说,除了 null 都可以显示正确的类型,typeof 对于对象来说,除了函数都会显示 object,instanceof内部机制是通过原型链来判断的。

扩展:可以使用toString方式判断类型

  1. function typeOf(obj) {
  2. return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase()
  3. }

4.如何正确判断 this?箭头函数的 this 是什么?

显示绑定:call、apply、bind指向绑定的对象。
隐式绑定:

  • 全局上下文:全局上下文默认this指向window, 严格模式下指向undefined。
  • 直接调用函数:this相当于全局上下文的情况
  • 对象.方法的形式调用:谁调用这个方法,它就指向谁
  • DOM事件绑定(特殊):onclick和addEventerListener中 this 默认指向绑定事件的元素。IE比较奇异,使用attachEvent,里面的this默认指向window。
  • new构造函数绑定:此时构造函数中的this指向实例对象
  • 箭头函数:箭头函数没有this, 因此也不能绑定。里面的this会指向当前最近的非箭头函数的this,找不到就是window(严格模式是undefined)

5.==和===的区别

===是值和类型都相等才会返回true
==首先会判断两者类型是否相同,相同的话就是比大小了,类型不相同的话,那么就会进行类型转换。

6.如何理解原型?如何理解原型链?

  • Object 是所有对象的爸爸,所有对象都可以通过 __proto__ 找到它
  • Function 是所有函数的爸爸,所有函数都可以通过 __proto__ 找到它
  • 函数的 prototype 是一个对象,也就是原型
  • 对象的 __proto__ 属性指向原型, __proto__ 将对象和原型连接起来组成了原型链

在JavaScript中,每当定义一个函数数据类型(普通函数、类)时候,都会天生自带一个prototype属性,这个属性指向函数的原型对象。

当函数经过new调用时,这个函数就成为了构造函数,返回一个全新的实例对象,这个实例对象有一个proto属性,指向构造函数的原型对象。

实例的proto属性与构造函数的prototype属性都是指向原型对象,原型对象的constructor属性又是指向构造函数

JavaScript对象通过proto 指向父类的原型对象,直到指向Object的原型对象为止,这样就形成了一个原型指向的链条, 即原型链。

7.什么是浅拷贝?如何实现浅拷贝?什么是深拷贝?如何实现深拷贝?

https://www.yuque.com/linhe-8mnf5/fxyxkm/wvy2nv