1、新增了let const关键字
let/const 声明的变量只在let/const 命令所在的代码块内有效,在这之外不能访问
使用 let/const关键字声明的全局作用域变量不属于 window 对象,所以不可以用window. 变量名的方式访问这些变量
Var会提升,let const不会
Var可以重复声明,let const不可以
Let声明的变量可以重复赋值,const不可以
Let和var都用于声明变量,const用于声明常量
2、新增的解构赋值
解构赋值针对数组或者对象进行模式匹配,然后对其中的变量进行赋值
数组解构按位置解构
对象解构按属性名解构
3、新增了箭头函数
箭头函数和普通函数的区别
普通函数存在着变量的提升,箭头函数没有
普通函数的this指向,谁调用指向谁,箭头函数是在哪定义就指向谁
普通函数可以当成构造函数,而箭头函数是不可以的
箭头函数没有arguments,要接受所有的参数用...rest
ES6中引入rest参数,用于获取函数的实参,用来代替arguments
作用与arguments相似
rest 参数必须是最后一个形参
rest 参数不适合不确定个数参数函数的使用
当不确定有多少参数传递的时候,用arguments来获取
伪数组,可以遍历,内置对象
伪数组有以下特点
1 具有length属性
2 按照索引的方式存储数据
3 不具有数组的push,pop等方法
4、js的数据类型
基本数据类型
ES5的5种:Null,undefined,Boolean,Number,String,
ES6新增:Symbol表示独一无二的值
ES10新增:BigInt 表示任意大的整数
引用数据类型
Object。包含Object、Array、 function、Date、RegExp。 JavaScript不支持创建任何自定义类型的数据,也就是说JavaScript中所有值的类型都是上面8中之一
ES10新增:BigInt 表示任意大的整数
BigInt数据类型的目的是比Number数据类型支持的范围更大的整数值。在对大整数执行数学运算时,以任意精度表示整数的能力尤为重要。使用BigInt,整数溢出将不再是问题
5、数据类型判断
typeof 对于基本数据类型判断是没有问题的,但是遇到引用数据类型(如:Array)是不起作用
instanceof 判断 new 关键字创建的引用数据类型,不考虑 null 和 undefined(这两个比较特殊)以对象字面量创建的基本数据类型
constructor 可以应对基本数据类型和引用数据类型,但如果声明了一个构造函数,并且把他的原型指向了 Array 的原型,所以这种情况下,constructor 也显得力不从心
Object.prototype.toString.call() 完美的解决方案
jquery.type() 如果对象是undefined或null,则返回相应的“undefined”或“null”
6、es6新增了模块化
根据功能封装模块 通过import导入,然后通过export导出
可以使用 export 导出,也可以使用export default导出
export 和 export defualt的区别export 可以导出多个属性或者方法,export default是以整体的方式抛出,接受的时候只接一个
浏览器加载ES6模块,使用<script>标签,但是要加入type="module"属性。称之为ES6 Module
封闭的作用域:代码是在模块作用域之中运行,而不是在全局作用域运行。模块内部的顶层变量,外部不可见
模块脚本自动采用严格模式,不管有没有声明use strict
模块之中,可以使用import命令加载其他模块(.js后缀不可省略,需要提供绝对 URL 或相对 URL),也可以使用export命令输出对外接口
模块之中,顶层的this关键字返回undefined,而不是指向window。也就是说,在模块顶层使用this关键字,是无意义的
同一个模块如果加载多次,将只执行一次
7、promise
promise是es6处理异步的一种方式,它的本质是一个对象
promise的参数是一个回调,回调有两个参数 resolve 成功回调 reject 失败回调
它有三种状态分别为 初始状态pending 已完成fulfilled 已失败rejected,状态改变只有两种结果 完成或者失败
promise处理错误的方式有两种 第一种在then中传递两个回调 第二个回调是错误回调,第二种方式是通过catch方式来实现
promise常用的api有 then ()处理回调函数 catch()捕获异常
还有两个常用的静态方法Promise.all()一块处理多个promise请求,所有的请求都成功才成功。Promise.race()一块处理多个promise请求,有一个成功就成功
8、Es6的class类?
Class类是使用函数的prototype对象封装的,可以实现封装,多态和继承
类有constructor函数作为初始化类时调用的第一个构造函数
类使用extends实现类之间的继承
extends的主要用于子类继承父类,继承之后子类拥有父类的所有方法包括,静态方法和属性
如果静态方法包含this关键字,这个this指的是类,而不是实例
9、es6新增哪些特性?
es6新增了promise 需要说什么是promise
es6新增了模块化 需要说什么是模块化
新增了class关键字 需要解释
新增了箭头函数 再说箭头函数与普通函数的区别
新增了解构赋值 需要解释什么是解构赋值
新增了let const关键字 需要说let const var的区别
新增了简单数据类型symbol
10、作用域与作用域链
作用域:就是变量的使用范围。js中作用域分为全局和局部
js的作用域分为全局作用域和局部作用域。在全局作用域中是不能访问局部作用域中的数据。在局部作用域中访问变量如果当前作用域中有可以直接访问,如果没有那么向上级作用域中访问,如果上级作用域也没有就继续向上找,直到找到全局window作用域,如果window作用域也没有返回undefined,整个作用域的访问形成了一个作用域链
11、说一下闭包
概念
闭包是指有权访问另外一个函数作用域中的变量的函数。可以理解为(能够读取另一个函数作用域的变量的函数)
特性
1:函数套函数
2:内部函数可以直接访问外部函数的内部变量或参数
3:变量或参数不会被垃圾回收机制回收定义
优缺点
优点:
1:变量长期驻扎在内存中
2:避免全局变量的污染
3:私有成员的存在
缺点:
1.常驻内存
2.增大内存的使用量
3.使用不当会造成内存的泄露
12、原型与原型链
每个函数都有一个prototype属性,被称为显示原型
每个实例对象都会有`proto`属性, 其被称为隐式原型
每一个实例对象的隐式原型`proto`属性指向自身构造函数的显式原型prototype
每个prototype原型都有一个constructor属性,指向它关联的构造函数
原型链: 当我们访问对象中的属性的时候,先从当前对象找,如果找不到的话,从当前原型中查找
当前函数的继承对象中查找,最后如果没有找到返回 undefined
13、对象的浅拷贝与深拷贝
由于引用数据类型的数据是存储在堆空间中,在栈空间中存储的是是数据的引用地址。对象的浅拷贝就是将栈空间中的地址复制一份,两个地址指向的同一个数据浅拷贝,可以使用Object.assign()来实现 深拷贝可以使用JSON.stringify()先转换为json的串复制,然后再通过JSON.parse()转换回来
14、说一下js的事件机制
js中存在两种事件机制
一个是ie提出的冒泡事件机制 还有一个是网景提出的捕获型事件机制
冒泡事件机制是先触发事件的的直接元素,然后向外扩散就像冒泡一样。捕获型就是事件从外向里执行
js中的事件监听addEventListener的第三个参数默认的为false 是冒泡 为true是捕获我们可以通过event.stopPropagation()来实现
15、rem布局的原理
1rem的大小就是根元素<html>的font-size的值,通过设置 根元素<html>的font-size的大小,来控制整个html文档内的字体大小、元素宽高、内外边距等
16、如何实现响应式布局
响应式布局可以让网站同时适配不同分辨率和不同的手机端,让客户有更好的体验响应式布局实现的方案:
百分比布局
媒体查询
rem布局
vw vh布局
flex弹性盒布局