前言
本篇文章介绍面试中经常问的JS基础知识点。文章中的关联问题可以在面试官问了问题后自己进行引申这些相关话题,从而引导面试官询问自己擅长的部分。后续会持续推出HTML知识点、CSS知识点、ES6知识点、JS进阶知识点、webpack知识点、react知识点、组件设计相关知识点、浏览器相关知识点、网络相关知识点、算法相关知识点等文章进行全面的知识梳理。
基础类型和对象类型
Q: 基础类型有哪些?
A: 基础类型有 number、undefined、null、bollean、string、symbol。
关联Q: 和对象类型的存储有什么区别?
关联A: 基础类型存储在栈内存中,存储的是值,是没有函数可以调用的。对象类型存储在堆内存中,存储的是地址。
关联Q: null
是对象吗?
关联A: 虽然typeof null
输出的是object
,但是null
其实是基础类型。这个错误是因为JS的最初版本是32位系统,000开头代表的是对象,而null
表示全零,所以被错误的判断为object
typeof和instanceof
Q: typeof
能正确的判断类型吗?
A: 对于基础类型,除了null
其余的基础类型都能正确判断类型,对于对象类型,除了函数都会显示object
,所以不能准确区分类型。
关联Q: instanceof能正确的判断类型吗?
关联A: instanceof
可以准确的判断对象类型,因为内部机制是通过原型链来判断的。但是它不能区分基础类型,当然也可以写一个自定义类,修改Symbol.hasInstance
属性来判断基础类型。
类型转换
Q: == 和 === 有什么区别?
A: ===
不需要进行类型转换,只有类型相同,并且值相等时返回true
,==
需要进行类型转换比较。
关联Q: 类型转换的规则是怎样的?
关联A: 先判断类型是否相等,如果相等就判断值是否相等;判断类型是否是null
或者undefined
,如果是则返回true
;判断类型是否是number
和string
,如果是则把string
转成number
;判断类型其中一方是否是boolean
,如果是则把boolean
转成number
再进行比较;判断类型其中一方是否是object
,且另一方是string、number、symbol
如果是则把object
转成原始类型在进行比较。对象转原始类型会调用内置的Symbol.toPrimitive
函数。
this
Q: 如何正确判断this?
A: this的绑定规则有四种:默认绑定、隐式绑定、硬绑定、new绑定。new绑定的优先级最高,然后是硬绑定,然后是隐式绑定,最后是默认绑定。
关联Q: 箭头函数的this是什么?
关联A: 箭头函数的this
取决于包裹箭头函数的第一个普通函数的this
。
闭包
Q: 什么是闭包?
A: 闭包就是能够访问另一个函数作用域下的变量的函数。
关联Q: 闭包有哪些使用场景?
关联A: 封装私有变量、模仿块级作用域、实现JS的模块。
深浅拷贝
Q: 浅拷贝和深拷贝是什么?
A: 浅拷贝只会拷贝所有属性值到新对象中,如果属性是对象拷贝的是地址。深拷贝会深层次的拷贝对象的值。
关联Q: 如何实现浅拷贝和深拷贝?
关联A: 浅拷贝可以通过Object.assign
方法来实现,另外也可以通过...
操作符来实现。深拷贝可以通过JSON.parse(JSON.stringify(object))
来解决,但是这个方法会忽略undefined、symbol
,且不能序列化函数,不能解决循环引用的对象。如果拷贝的对象含有内置类型不包含函数,也可以使用MessageChannel
来实现。
原型
Q: 如何理解原型?如何理解原型链?
A: 每当定义一个对象时,对象都会包含一些预定义的属性。其中每个函数对象都有一个prototype
属性,这个属性指向函数的原型对象。原型链就是多个对象通过__proto__连接了起来。通过原型链可以拥有定义在其他对象中的属性和方法。
关联Q: 是不是所有函数都有prototype属性?
关联A: Function.prototype.bind()
就没有这个属性。