1、ES的全称ECMAScript,它是由ECMA国际标准组织制定的一项脚本语言的标准化规范。规定脚本语言如何实现。
ES6有两层含义
- 特指ECMAScript2015
- 泛指ES2015及之后的新增特性,虽然之后的版本应当称为ES2018,ES2019...但可统称为ES6。
ES6与javascript的关系:ECMAScript是一种语言标准,Javascript实现了这个标准(还有JScript和ActionScript也实现这个标准)。
2、为什么使用 ES6 ?
每一次标准的诞生都意味着语言的完善,功能的加强。JavaScript语言本身也有一些令人不满意的地方。
- 变量提升特性增加了程序运行时的不可预测性
- 语法过于松散,实现相同的功能,不同的人可能会写出不同的代码
3、 定义变量的关键字是var和新增let关键字的区别
格式: let 变量名 = 变量值;
它用来定义变量,基本使用格式与var关键字一样。在可以在使用var 的地方改成let。
5、块级作用域
作用域
- 全局作用域
- 局部作用域
- 块级作用域(ES6中提出的)
在java里面块级作用域({} if{} for{} )里面的变量外面不能调用。而js没有有块级作用域,ES6提出如果是通过let关键字来定义变量的,则js代码中就可以通过{}来切分作用域了。
6、全局变量不会赋值加在顶级对象中
- 浏览器环境中顶级对象为window
- nodejs环境中顶级对象为global
let声明的全局变量不会以属性的形式附加在window对象中,全局变量与window对象再无关系。
ES6中保留了对var的支持,你可以在代码中同时使用var和let。当然,建议使用let
7、const 作用:声明只读的常量,常量就是指值【简单数据类型的值,复杂数据类型的地址】(内存地址)不能变化的值
使用const 声明常量时必须赋初始值,否则报错(Missing initializer in const declaration)
8、(1)使用var声明变量,其作用域为该语句所在的函数内,且存在变量提升的现象(可以先使用在提升)
(2)使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升
(3)使用const声明的是常量,在后面的代码中不能在修改常量的值
9、定义一个不能修改的对象(属性不能添加,修改,删除),你可以使用Object.freeze()
10、****经典面试题图解:此题的关键点在于变量i是全局的,函数执行时输出的都是全局作用域下的i值。
var arr = [];
for (var i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i);
}
}
arr[0]();//2
arr[1]();//2
经典面试题图解:此题的关键点在于每次循环都会产生一个块级作用域,
每个块级作用域中的变量都是不同的,
函数执行时输出的是自己上一级(循环产生的块级作用域)作用域下的i值.
let arr = [];
for (let i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i);
}
}
arr[0]();
arr[1]();
11、 ES6提供了一个更加方便的方式从对象或者数组中取出属性值来,这就解构赋值(以前是通过foreach等遍历取值赋值)
- 解构:意思是把有结构的数据分解开成为一个一个的值
- 赋值:把解构之后的值保存到变量
数组解构赋值
解构赋值:
如果解构不成功,变量 跟 数值个数不匹配的时候,变量的值为undefined,(如果变量少于匹配,自定忽略剩余)
数组解构用中括号包裹,多个变量用逗号隔开,对象解构用花括号包裹,多个变量用逗号隔开
对象解构
格式:let {"属性名1":变量名1=默认值1, "属性名2":变量名2=默认值2,... } = {"属性名1":属性值1,"属性名2":属性值2,...}
解析规则:
- 默认值是可选的。你可以指定默认值,也可以不指定。
- 右边的"属性名"与左边的“属性名” 一致,则把右边的属性值赋值给左边的变量名。
- 如果右边的匹配不成立,看看是否有使用默认值,有默认值就使用默认值,没有就是undefined。
12、剩余值
... 只能用在最后一个变量上。这个变量一定是一个数组或者对象。
如果元素个数不足(没有剩余元素),也会返回空数组,对象返回一个空对象。
参数默认值的使用
13、rest 参数
rest (其它的,剩余的)参数 用于获取函数多余参数,把它们放在一个数组中, 与arguments相比,它是一个真正的数组,可以使用全部的数组的方法
rest参数不能设置默认值,且必须设置在参数列表最后位置
如果以箭头函数 的方式去定义这个函数,则内部不可以使用arguments这个对象了。此时,我们就可以使用rest 参数,它可以替代 arguments 的使用
14、定义函数 三种方式
15、箭头函数格式: let 函数名 = (形参1,...形参n) => {函数体};
const fn = () => {} //代表把一个函数赋值给fn fn为变量名
格式小结:
(1). 去除function关键字,箭头函数只在书写格式上有些区别,但在函数调用方式上,是没有区别的。
(2). 在形参和函数体之间设置 =>,=>是一个整体,不要加空格
箭头函数如果形参只有一个,可以省略 小括号
面试题:箭头函数与普通函数的区别
- 内部没有this
- 箭头函数 内部不可以使用arguments这个对象,所以使用剩余参数
- 不能作为构造器(了解)
实际原因是箭头函数根本没有自己的 this,导致内部的 this 就是外层代码块的 this。正是因为它没有 this,所以也就不能用作构造函数
16、箭头函数不绑定this ,没有自己的this关键字,如果在箭头函数中使用this,this关键字指向箭头函数定义位置的this
小结
- 箭头函数中不绑定this,箭头函数中的this指向是它所定义的位置,可以简单理解成,定义箭头函数中的作用域的this指向谁,它就指向谁
- 箭头函数的优点在于解决了this执行环境所造成的一些问题。
比如:解决了匿名函数this指向的问题(匿名函数的执行环境具有全局性),包括setTimeout和setInterval中使用this所造成的问题
17、 数组对象是js中非常重要的对象,它本身提供了非常多的方法,例如:push,pop,shift,unshift,splice,concat,sort,indexOf,join,map,forEach,filter,every,some,reduce...( 曾经有一道面试题:写出10个你用过的与数组相关的方法。)
18、扩展运算符可以将数组或者对象转为用逗号分隔的**参数序列**(...rest)
格式:...数组
功能:它的作用是把数组中的元素一项项地展开:把一个整体的数组拆开成单个的元素
利用扩展运算符 将伪数组或者可遍历对象转换为真正的数组 (将伪数组用扩展运算符隔开,在加[ ]转换成真正的数组)
12、Array.from():把其它伪数组的对象转成数组
此还可以接受第二个参数(回调函数),作用类似与数组的map方法,
用来对于每个元素进行处理,将处理后的值放入返回的数组中
13、回调函数是作为参数传递给另一个函数的函数,然后在外部函数内部调用该回调函数以完成某种例程或操作。
14、数组实例方法find():用于找出第一个符合条件的数组成员,如果没有找到返回undefined
let arr = [1, 2, 4, 0, -4, 3, -2, 9];
let result = arr.find(function (item) {
return item < 0; //遍历过程中,根据这个条件去查找
});
console.log(result); // -4
- 回调函数有三个参数,分别表示:数组元素的值、索引及整个数组
- 如果某次循环返回的是true,find和findIndex方法的返回值就是满足这个条件的第一个元素或索引
15、实例方法findIndex 找到数组中第一个满足条件的成员并返回该成员的索引,如果找不到返回 -1。
// 用法:找数组中第一个小于0的数字
let arr = [1, 2, 4, 0, -4, 3, -2, 9];
let result = arr.findIndex(function (item) {
return item < 0; //遍历过程中,根据这个条件去查找
});
console.log(result); // 返回索引4
16、数组方法includes() 功能:判断数组是否包含某个值,返回 true / false,字符串也有includes, 功能:返回布尔值,表示是否找到了参数字符串
格式:数组.includes(参数1,参数2)
- 参数1,必须,表示查找的内容
- 参数2,可选,表示开始查找的位置,0表示从第一个元素开始找。默认值是0。
let arr = [1, 4, 3, 9];
console.log(arr.includes(4,2)); // false 从第二个位置开始是否包含4
17、模板字 符串使用反引号(电脑键盘左上第二个键) ` 把内容括起来,类似于普通字符串的""
模板字符串可以*解析变量
18、 问题1 :查找理解转义字符
19、ES6里提供了新的数据结构set,它类似与数组,但是成员变量的值是唯一的,没有重复的值(自动去重)
Set本身就是一个构造函数,用来生成Set数据结构
Set可以接受一个数组为参数,用来初始化 const set =new Set([1,2,4,5])
20、 字符串扩展方法