Es6常见面试题必看!

1.let、var和const的区别

1. 作用域规则
    let和const 声明的变量 形成 块级作用域,在块级作用域下起作用, var 声明的变量 在 全局作用域或者局部作用域下 起作用
2. 是否存在变量提升
    let 和 const 不存在变量提升, var存在变量提升(在声明之前可以使用)
3. 是否可以重复声明 和 是否可以重复赋值
    var 可以重复声明,也可以重复赋值
    let和const 都不可以重复声明,而 let可以重复赋值,const不可以重复赋值
4. 暂时性死区
    let 和 const存在暂时性死区(let和const声明之前的
区域都称为暂时性死区),而var不存在

2.ECMAScriptJavaScript 的关系

该标准从一开始就是针对 JavaScript 语言制定的,但是之所以不叫 JavaScript,有两个原因。一是商标,Java 是 Sun 公司的商标,根据授权协议,
只有 Netscape 公司可以合法地使用 JavaScript 这个名字,且 JavaScript 本身也已经被 Netscape公司注册为商标。
 二是想体现这门语言的制定者是 ECMA,不是 Netscape,这样有利于保证这门语言的开放性和中立性。
因此,ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现

3.箭头函数中的this和普通函数中的this的区别

箭头函数中的this指向定义它的地方(父级作用域),而不指向调用它的地方。

 注意:1) 用let const var 定义的箭头函数 在全局环境下指向window 
           2) 对象的字面量写法 不产生新的作用域
           3) 箭头函数中的this不可以使用call apply  bind 改变
           4) 构造函数 和 构造函数原型对象中的函数 如果用箭头函数依然只 window
           5) 箭头函数中不含arguments
           1) 箭头函数不合适使用在 构造函数和原型对象的函数中
           2) 箭头函数不适合使用在 对象的方法 和 事件后绑定的函数
           3)  适合在闭包函数中使用
           4) 适合在数组方法的回调函数中使用
           5) 适合在计时器的回调函数中使用

4.块级作用域和块级作用域的优势

let和const会形成块级作用域,只要含有{}(除了对象的{}之外) 都会形成块级作用域
ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。
第一种场景,内层变量可能会覆盖外层变量。
第二种场景,用来计数的循环变量泄露为全局变量。
在这里插入图片描述

5.什么是 暂时性死区

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区” 

6.定义一个person类,自定义一些属性和方法,定义一个Student类继承person类 (用es6语法实现)

class Person{
            // 构造器 写私有属性和方法
            constructor(name,age){
                this.name=name;
                this.age=age;
            }
            //原型方法
            run(){
                console.log(this.name+"会跑步")
            }
            // 静态方法
             Cv  isPerson(){
                console.log(123);
            }
        }

7.set和map的区别

1.	Map是键值对,Set是值的集合,当然键和值可以是任何的值;
2.	Map可以通过get方法获取值,而set不能因为它只有值;因为set的值就是键
3.	都能通过迭代器进行for...of遍历;
4.	Set的值是唯一的可以做数组去重,Map由于没有格式限制,可以做数据存

8.什么是promise

Promise 是异步编程的一种解决方案,比传统的解决方案回调函数和事件更合理和更强大。

Promise对象是一个构造函数,用来生成Promise实例。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)
的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 
API,各种异步操作都可以用同样的方法进行处理。

9.什么是Symbol以及特点

 Symbol为了给对象的属性,提供独一无二的名字,它是一种原始数据类型, JavaScript 语言 的第七 种
 数据类型,表示独一无二的值,是一种类似于字符串的数据类型
 特点:
    1)Symbol的值是唯一的,用来解决命名冲突的问题
    2)Symbol 值不能与其他类型的值进行运算,会报错。
    3)Symbol 定义的属性不可以使用for...in进行遍历,可以使用Reflect.ownKeys()获取所有的键名,
    可以通过Object.getOwnPropertySymbols获取所有的Symbol值
    4)可以通过显示的方式转为字符串或者布尔类型,不可以转为数字类型

10. Symbol.for()与Symbol()区别

Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。它们的区别是,前者会被登记在全局环境
中供搜索,后者不会。Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给
定的key是否已经存在,如果不存在才会新建一个值。比如,如果你调用Symbol.for("cat")30 次,每次都
会返回同一个 Symbol 值,但是调用Symbol("cat")30 次,会返回 30 个不同的 Symbol 值。

11.描述promise如何使用,举例说明

let p5=new Promise(function(resolve,reject){
            $.ajax({
                url:'data/p5.json',
                type:'get',
                success:function(res){
                    resolve(res);
                },
                error:function(res){
                    reject(res);
                }
 
            })
        })
Promise.all([p5]).then(function(res){
            console.log(res);
            res.forEach(item=>console.log(item));
        }).catch(function(res){
            console.log(res);
        })

promise详情链接供参考

12.Es6字符串新增方法

includes() 判断是否有该字符串 有返回true;
stratsWith() 判断开头是否有该字符串 有返回true;
endsWith() 判断末尾是否有该字符串 有返回true;
repeat()    返回字符串 将原来字符串重复n次
padStart()用于头部补全,padEnd()用于尾部补全
消除空格  trim  trimStart  trimEnd  trimLeft  trimRight
消除头部和尾部空格  中间的不可消除
replaceAll() 

13.什么是Iterator

遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。
任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。

作用:
Iterator 的作用有三个:一是为各种数据结构,提供一个统一的、简便的访问接口;二是使得数据结构
的成员能够按某种次序排列;三是 ES6 创造了一种新的遍历命令for...of循环,Iterator 接口主要供for...of
消费。

14. 什么是解构赋值

解构赋值 : 主要是针对数组和对象的解构 , 可以看成是一种匹配模式 ,对其中的变量进行赋值是 对赋值运 算符的一种扩展
优点: 在代码的书写上更加易读,语义更加清晰明了,方便从数组和对象中取数据
		保持两边一致
		解构源 : 等号右边
		解构目标 :  等号的左边

15.设置一个Person类,使得该类可迭代,可以使用for…of循环属性方法

let c = [];
        class Fn {
            constructor(name, age) {
                    this.name = name,
                    this.age = age,
                    this.a = this
                c.push(name, age);
                this.s=function(){}
 
            }
            say() {
                console.log('我是原型方法')
            }
            static jt() {
                console.log('我是静态方法')
            }
            [Symbol.iterator]() {
                let index = 0;
                return {
                    next() {
                        if (index >= c.length) {
                            return {
                                value: undefined,
                                done: true
                            }
                        } else {
                            let result = {
                                value: c[index],
                                done: false
                            }
                            index++;
                            return result
                        }
                    }
                }
            }
        }
        let a = new Fn('lili', 19);
        let b = new Fn('lili', 19);
        let iterator = a[Symbol.iterator]();
        console.log(a);
        console.log(iterator.next());
        console.log(iterator.next());
        console.log(iterator.next());
        console.log(iterator.next());

16.es6提供的数组方法有哪些

Array.from()方法,将类似数组的对象转为数组。
Array.of()方法用于将一组值,转换为数组。
coypWithin() 循环  没有返回值
find()找出第一个满足条件的数据
findIndex()找出第一个满足条件的下标
 fill() 用指定的值 将数组中的数据替换
 Includes()返回新数组
map()映射  
filter()过滤
reduce()求和
every()遇假则停  返回值为boolean  
some()遇真则停  返回值为boolean

17.写出es6中module的导出文件和导入文件的写法

1) 分别暴露数据
export let a=100;
export function show(){
     		console.log(123);
	}
import * as m1 from "js/m1.js";
2)使用{}统一暴露数据
let a=100;
let b=200;
let obj={
    name:"zhangsan",
    age:18
}
let arr=[1,2,3];
function fn(){
    console.log(123);
}


export {a,b,obj as o,arr,fn}
import {a,b,obj as o,arr,fn} from "./src/js/m1.js"
3)默认暴露数据
export default {
    name:"lisi",
    fn:function(){
        console.log(this.name);
    }
}
import {default as m3} from "./src/js/m3.js"

18. ES6 与 ECMAScript 2015 的关系

ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版以后的 JavaScript 的下一代标准,涵盖了
ES2015、ES2016、ES2017 等等,而 ES2015 则是正式名称,特指该年发布的正式版本的语言标准。
平常提到 ES6 的地方,一般是指 ES2015 标准,但有时也是泛指“下一代 JavaScript 语言”。

19.Object.defineProperty()

直接在一个对象上添加属性,修改属性,也可以把属性设置为是否可写,可以设置为响应式数据
Object.defineProperty(obj,'num',{
    value:10000,
    // 设置当前属性是否可以修改  默认 false不可以修改, true可以修改
    writable:true,
    // 设置当前属性是否可以枚举  默认 false不可以枚举, true可以枚举
    enumerable:true,

    //设置当前属性是否可以被删除   默认 是 false  不被删除  true可以被删除
    configurable:true,

});

20.什么是Generator

Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。

Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,
封装了多个内部状态。
执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个
遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值