- null和undefined的区别
- 能不能描述一下原型链?
- JS如何实现继承?
- 函数的arguments为什么不是数组?如何转化成数组?
- forEach中return有效果吗?如何中断forEach循环?
- 能不能实现数组map方法 ?
- 能不能实现数组reduce方法 ?
- 能不能写一个完整的深拷贝?
- V8 引擎如何进行垃圾内存的回收?
- 描述一下 V8 执行一段JS代码的过程?
- 宏任务(MacroTask)引入
- nodejs 和 浏览器关于eventLoop的主要区别
- nodejs中的异步、非阻塞I/O是如何实现的?
- JS异步编程有哪些方案?为什么会出现这些方案?
- 能不能简单实现一下 node 中回调函数的机制?
- Promise 凭借什么消灭了回调地狱?
- Promise 如何实现链式调用?
- 现Promise的 all 和 race
- 解释一下async/await的运行机制
null和undefined的区别
小米
- undefined表示不存在的值,null表示空引用或者空对象;
- undefined转为数字类型为NaN,null转为数字类型为0; ```javascript typeof undefined // undefined typeof null // object
null === undefined // false null == undefined // true
Number(undefined) // NaN Number(null) // 0
- undefined是定义了未赋值,null是定义了且赋值为null;- 设置为null的变量或者对象会被内存收集器回收,通过分配null可以手动释放对象;<a name="iiXbj"></a>#### [] == null?小米<a name="HAgLH"></a>#### null == undefined?小米<a name="nEKjv"></a>### ==和===的区别<a name="MQRb5"></a>#### Object.is和===的区别?<a name="HJLDw"></a>### [] == ![]结果是什么?为什么?<a name="EZqtH"></a>### typeof和instanceof的区别?手写instanceof?小米<a name="dxiZL"></a>### 作用域类型小米<a name="Grnjk"></a>### 为什么0.1+0.2!==0.3<a name="Oml2U"></a>### 原型链快手创新业务小米<a name="H6XTv"></a>### 说说JS的数据类型小米<br />ES7 BigInt<a name="OmQY3"></a>#### JS原始数据类型有哪些?引用数据类型有哪些?<a name="ngw3I"></a>#### 判断数据类型的方法、缺点快手创新业务小米<a name="Hedm8"></a>#### 判断数组的方式小米<br />五种,1. typeof 2. constructor 3. instanceof 4. Object.prototype.toString.call 5. Array.isArray),然后说说 3. 4. 5. 方式的区别,顺便手写了 instanceof [ 省的讲一遍原型原型链了——从构造函数到寄生式继承 ]<a name="Lms4t"></a>### 什么是BigInt? 为什么需要BigInt?<a name="aS4yu"></a>#### 如何创建并使用BigInt?<a name="FOfa6"></a>### Object的toString和构造器的toString有什么区别?快手创新业务<a name="WwRu6"></a>### this指向问题快手创新业务<a name="bZ0Ju"></a>### 了解闭包吗?小米<a name="TrBQ6"></a>#### 闭包产生的原因?<a name="aqe9M"></a>#### 闭包有哪些表现形式?<a name="TGDNd"></a>#### 闭包中的this指向小米<a name="rjH3X"></a>###<a name="oG4tQ"></a>### 箭头函数和普通函数的区别快手创新业务小米<a name="Sv71x"></a>### Set、Map、WeakMap、WeakSet 区别小米<br />Map 和 Object 的效率问题,各自的 API,WeakMap 和 WeakSet 可迭代吗,JS 垃圾回收机制对 WeakMap 和 WeakSet 的影响<a name="NQjMF"></a>### 原型对象和构造函数有何关系?<a name="wVN9d"></a>#### 原型、构造函数、实例1. 构造函数> 用来初始化新创建对象的函数是构造函数```javascriptfunction Foo() {...}
每一个构造函数都有一个原型对象即:prototype(指针)指向的对象。而原型对象也有一个属性constructor(构造器)指向构造函数。
- 实例对象
通过构造函数的new操作创建的对象是实例对象。可以用一个构造函数构造多个实例对象。
const f1 = new Foo();const f2 = new Foo();
实例对象也有一个proto(非标准顺序)属性。该属性指向实例对象的原型对象。
- 原型
能不能描述一下原型链?
JS如何实现继承?
函数的arguments为什么不是数组?如何转化成数组?
因为arguments本身并不能调用数组方法,它是一个另外一种对象类型,只不过属性从0开始排,依次为0,1,2…最后还有 callee 和length属性,我们也把这样的对象称为类数组。
常见的类数组还有:
1. 用getElementsByTagName/ClassName()获得的HTMLCollection;
2. 用querySelector获得的nodeList。
那这导致很多数组的方法就不能用了,必要时需要我们将它们转换成数组,有哪些方法呢?Array.prototype.slice.call()
function sum(a, b) {// 将类数组转换为数组let args = Array.prototype.slice.call(arguments);// 对转换为数组的方法调用累加let num = args.reduce((sum,cur) =>{return sum+cur;})console.log(num);};sum(1,2,3,4,5,6);// 21
Array.from()
function sum(a, b) {// 将类数组转换为数组let args=Array.from(arguments)// 对转换为数组的方法调用累加let num = args.reduce((sum,cur) =>{return sum+cur;})console.log(num);};sum(1,2,3,4,5,6);// 21
这种方法也可以用来转换Set和Map哦!
ES6展开运算符
function sum(a, b) {// 将类数组转换为数组let args= [...arguments];// 对转换为数组的方法调用累加let num = args.reduce((sum,cur) =>{return sum+cur;})console.log(num);};sum(1,2,3,4,5,6);// 21
利用concat+apply
function sum(a, b) {// 将类数组转换为数组// apply方法会把第二个参数展开let args=Array.prototype.concat.apply([], arguments);// 对转换为数组的方法调用累加let num = args.reduce((sum,cur) =>{return sum+cur;})console.log(num);};sum(1,2,3,4,5,6);// 21
当然,最原始的方法就是再创建一个数组,用for循环把类数组的每个属性值放在里面,过于简单,就不浪费篇幅了。
