本文梳理出了一些面试中有一定难度的高频原生 JS 问题, 部分知识点可能你之前从未关注过, 或者看到了, 却没有仔细研究, 但是它们却非常重要.
1. 原始类型有哪几种? null 是对象吗? 原始数据类型和复杂数据类型存储有什么区别?
原始类型有 6 种, 分别是 undefined,null,bool,string,number,symbol(ES6 新增).
虽然 typeof null 返回的值是 object, 但是 null 不是对象, 而是基本数据类型的一种.
原始数据类型存储在栈内存, 存储的是值.
复杂数据类型存储在堆内存, 存储的是地址. 当我们把对象赋值给另外一个变量的时候, 复制的是地址, 指向同一块内存空间, 当其中一个对象改变时, 另一个对象也会变化.
2. ES6 中的 class 和 ES5 的类有什么区别?
1.ES6 class 内部所有定义的方法都是不可枚举的;
2.ES6 class 必须使用 new 调用;
3.ES6 class 不存在变量提升;
4.ES6 class 默认即是严格模式;
5.ES6 class 子类必须在父类的构造函数中调用 super(), 这样才有 this 对象; ES5 中类继承的关系是相反的, 先有子类的 this, 然后用父类的方法应用在 this 上.
3. 数组的哪些 API 会改变原数组?
修改原数组的 API 有:
splice/reverse/fill/copyWithin/sort/push/pop/unshift/shift
不修改原数组的 API 有:
slice/map/forEach/every/filter/reduce/entry/entries/find
4. let,const 以及 var 的区别是什么?
1.let 和 const 定义的变量不会出现变量提升, 而 var 定义的变量会提升.
2.let 和 const 是 JS 中的块级作用域
3.let 和 const 不允许重复声明(会抛出错误)
4.let 和 const 定义的变量在定义语句之前, 如果使用会抛出错误(形成了暂时性死区), 而 var 不会.
5.const 声明一个只读的常量. 一旦声明, 常量的值就不能改变(如果声明是一个对象, 那么不能改变的是对象的引用地址)
5. 什么是闭包? 闭包的作用是什么? 闭包有哪些使用场景?
闭包是指有权访问另一个函数作用域中的变量的函数, 创建闭包最常用的方式就是在一个函数内部创建另一个函数.
闭包的作用有:
1. 封装私有变量
2. 模仿块级作用域(ES5 中没有块级作用域)
3. 实现 JS 的模块
6. 谈谈你对原型的理解?
在 JavaScript 中, 每当定义一个对象 (函数也是对象) 时候, 对象中都会包含一些预定义的属性. 其中每个函数对象都有一个 prototype 属性, 这个属性指向函数的原型对象. 使用原型对象的好处是所有对象实例共享它所包含的属性和方法.
分享超过 5 万程序员朋友下载的 web 前端学习资料, 这次我把所有干货重新梳理精简, 从零基础到深入进阶, 分享给大家. 获取方式: 官方企鹅群: 9567,66604(持续招募中)
来源: http://www.jianshu.com/p/7656d5c16dfa