1、let、const、var的区别
var声明变量存在变量提升,let和const不存在变量提升
let、const都是块级局部变量 ,存在暂时性死区
const 的特性和 let 完全一样,不同的只是const声明时候必须赋值,赋值基本类型时,只能进行一次赋值,即声明后不能再修改,赋值引用类型时,内存地址不能修改
同一作用域下let和const不能声明同名变量,而var可以
2、箭头函数和普通函数的区别
2.1、箭头函数的this是定义时决定的,普通函数是看调用方法。
2.2、箭头函数不能成为构造函数
2.3、箭头函数不能使用async/await
2.4、箭头函数不能使用Generator函数,不能使用yeild关键字
2.5、箭头函数不能使用call、apply、bind来修改this指向
2.6、箭头函数不绑定arguments
2.7、箭头函数不具有prototype原型对象,不具有super
3、promise的实现原理和封装
promise一共有三种状态,分别是pedding初始状态 、resolved成功的状态、 rejected失败的状态。传入两个参数,一个是resolve,执行then的方法,一个是reject,执行catch的方法或者then的第二个参数的回调。promise一旦状态改变就不可在修改。promise的链式调用实际上是返回的一个新的promise,而非return this。
// 简版promise function Promise(executor){ //executor执行器 let self = this; self.status = 'pending'; //等待态 self.value = undefined; // 表示当前成功的值 self.reason = undefined; // 表示是失败的值 function resolve(value){ // 成功的方法 if(self.status === 'pending'){ self.status = 'resolved'; self.value = value; } } function reject(reason){ //失败的方法 if(self.status === 'pending'){ self.status = 'rejected'; self.reason = reason; } } executor(resolve,reject); } Promise.prototype.then = function(onFufiled,onRejected){ let self = this; if(self.status === 'resolved'){ onFufiled(self.value); } if(self.status === 'rejected'){ onRejected(self.reason); } }
4、forEach、for in、for of三者区别
forEach更多的用来遍历数组 for in 一般用来遍历对象或json,可以遍历对象的原型 for of一遍用来遍历数组对象和可枚举对象,不能遍历原型 for in循环出的是key,for of循环出的是value
5、set、map分别是什么
set对象:允许你存储任何类型的唯一值,无论是原始值或者是对象引用。Set是值得集合,不能通过get方法获取值,因为set只有值。能通过迭代器进行for...of遍历。Set的值是唯一的可以做数组去重。
var set = new Set(['1',undefined,{},2,[3,4]]); set.size; // 5 set.add(5); set.delete('1'); // true set.has('2'); // false set.keys(); // SetIterator set.values(); // SetIterator set.entries(); // SetIterator // set对象可遍历 set.forEach();
map对象:Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
var myMap = new Map(); var keyObj = {}; myMap.set(keyObj, "和键 keyObj 关联的值"); myMap.get(keyObj); // "和键 keyObj 关联的值" myMap.size // 1 myMap.has(keyObj); // true myMap.delete(keyObj); // true myMap.clear(); myMap.keys(); // MapIterator 键组成的对象 myMap.values(); // MapIterator 值组成的对象 myMap.entries(); // MapIterator 键值对组成的对象 // map对象可遍历 myMap.forEach((value, key) => { console.log(value, key) }) for(var [key, value] of myMap){ console.log(key, value); // {}, "和键 keyObj 关联的值" }
6、symbol的理解
ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名
let sy = Symbol("KK"); console.log(sy); // Symbol(KK) typeof(sy); // "symbol" // 相同参数 Symbol() 返回的值不相等 let sy1 = Symbol("kk"); sy === sy1; // false // 写法1 let syObject = {}; syObject[sy] = "kk"; console.log(syObject); // {Symbol(key1): "kk"} // 写法2 let syObject = { [sy]: "kk" }; console.log(syObject); // {Symbol(key1): "kk"} // 写法3 let syObject = {}; Object.defineProperty(syObject, sy, {value: "kk"}); console.log(syObject); // {Symbol(key1): "kk"}
Symbol 值作为属性名时,该属性是公有属性不是私有属性,可以在类的外部访问。但是不会出现在 for...in 、 for...of 的循环中,也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回。如果要读取到一个对象的 Symbol 属性,可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。
for (let i in syObject) { console.log(i); } // 无输出 Object.keys(syObject); // [] Object.getOwnPropertySymbols(syObject); // [Symbol(key1)] Reflect.ownKeys(syObject); // [Symbol(key1)]
7、新增哪些数组方法
forEach:forEach()会遍历数组, 循环体内没有返回值,forEach()循环不会改变原来数组的内容, forEach()有三个参数, 第一个参数是当前元素, 第二个参数是当前元素的索引, 第三个参数是当前元素所属的数组
map:map()的主要作用, 其实是创建一个新的数组
filter:filter()主要是过滤的, 用来过滤数组中不满足条件的元素, 把满足条件的元素放到新的数组里, 并且不会改变原数组
every:会遍历数组, 在循环体内写条件, 如果每一项都是true, 就会返回true, 只要有一个是false, 就会返回false
some:遍历数组的每一项, 然后根据循环体内的条件去判断, 只要有一个是true, 就会停止循环
reduce:接收一个函数作为累加器, 数组中每个值(从左到右)开始缩减, 最终为一个值
Array.from():用于将两类对象变成数组。一类是类数组对象,一类是可遍历对象。
Array.of():用于将一组值,转换为数组
find() 和 findIndex():用于找出第一个符合条件的数组成员和下标。
fill():方法使用给定值填充一个数组
includes():检查是否包含某个值
8、新增哪些字符串方法
startsWith():返回布尔值,表示参数字符串是否在原字符串的头部
endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部
includes():返回布尔值,表示是否找到了参数字符串
repeat():返回一个新字符串,表示将原字符串重复n次
padStart():开始位置填充
padEnd():结束位置填充
trimStart():消除字符串头部的空格
trimEnd():消除字符串尾部的空格
matchAll():返回一个正则表达式在当前字符串的所有匹配
9、新增哪些对象方法
Object.is():判断两个值是否相等
Object.assign():用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
Object.getOwnPropertyDescriptors():返回指定对象所有自身属性(非继承属性)的描述对象
Object.setPrototypeOf(),Object.getPrototypeOf():用来读取或设置当前对象的prototype对象
Object.keys():用于返回一个数组,成员的参数是对象自身的所有可遍历属性的键名
Object.values():返回值是一个数组,成员是对象自身的(不含继承的)所有可遍历属性的值。
Object.entries():返回一个数组,成员是对象自身(不含继承的)所有可遍历属性的键值对数组,Symbol 属性的值会被过滤。
Object.fromEntries():是Object.entries 的逆操作,将一个键值对数组转为对象。
10、async...await
async...await是Generator函数的语法糖,将*改成async,将yield换成await。 是对Generator函数的改进, 返回promise。 异步写法同步化,遇到await先返回,执行完异步再执行接下来的. 内置执行器, 无需next()