经典面试题之ES6篇

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()

猜你喜欢

转载自blog.csdn.net/xiaozgm/article/details/125845590