Es6新增语法梳理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Es6新增语法梳理相关的知识,希望对你有一定的参考价值。
参考技术A 这两天项目上线,手头工作忙完了,忽然想起来面试的时候总会问到ES6有哪些新增的语法,你了解多少?
梳理梳理吧!
现在项目中我已经基本上不会使用 var 来声明变量了,
此方法可以获得所有对象的key,返回数组包含所有对象的key
有时候不确定会给函数中传入多少个参数,可以使用展开运算符
这些都是ES6遍历数组的方法,但是有一些不同处,
用于处理数据过后返回一个新数组
用来过滤的方法
const filterArr = [1, 2, 3, 4, 5]
// 三个参数:遍历项 索引 数组本身
// 返回大于3
const filterArr2 = filterArr.filter((num, index, arr) => num > 3)
console.log(filterArr2)
// 输出:
[ 4, 5 ]
只要有一个是真,就返回真
every与some是相反的,every要每一项为真才返回真
提取对象里的属性,对象解构
数组的解构
获取对象 value 值的集合
ES6新增语法 + 内置对象扩展 + 箭头函数
ES6语法
ES 的全称是 ECMAScript , 它是由 ECMA 国际标准化组织,制定的一项脚本语言的标准化规范
一、ES6新增语法
1. let 关键字
- 特性一 :有块级作用域
{}
里面就是块级作用域
let
声明的变量只在所处于的块级有效
let
关键字声明的变量才具有块级作用域,var
没有
// 防止循环变量变成全局变量
for (let i = 0; i < 10; i++) {
console.log(i)
}
console.log(i) // i is not defined
- 特性二:没有变量提升
在使用let
关键字声明变量时, 必须先声明后使用
console.log(a) // 报错
let a = 100
- 特性三:暂时性死区
let 关键字声明的变量, 会和当前作用域绑定
var a = 10
if (true) {
console.log(a) // 报错 a is not defined
let a = 20
}
- 经典面试题
var arr = [];
for (var i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i);
}
}
arr[0]();
arr[1]();
关键点:变量 i
是全局的,函数执行时输出的都是全局作用域下的 i
值
let arr = [];
for (let i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i);
}
}
arr[0]();
arr[1]();
关键点:每次循环都会产生一个块级作用域,每个块级作用域中的变量 i
都是不同的,函数执行时输出的是自己上一级(循环产生的块级作用域)作用域下的 i
值
2. const 关键字
- 特性一 :有块级作用域
- 特性二 :声明时必须有初始值
const PI // 报错
const PI = 3.1415926
- 特性三 :赋值后无法更改地址值
基本数据类型 值 不能改
引用数据类型 数据结构内部值 可以改
const PI = 3.14;
PI = 100; // Assignment to constant variable.
const ary = [100, 200];
ary[0] = 'a';
ary[1] = 'b';
console.log(ary); // ['a', 'b'];
ary = ['a', 'b']; // Assignment to constant variable.
3. let
const
var
的区别
var | let | const |
---|---|---|
函数级作用域 | 块级作用域 | 块级作用域 |
变量提升 | 无变量提升 | 无变量提升 |
值可修改 | 值可修改 | 值不可修改 |
4. 解构赋值
作用:将数组或对象的成员提取并赋值给变量
- 数组解构
let [a, b, c] = [1, 2, 3];
console.log(a) //1
console.log(b) //2
console.log(c) //3
//如果解构不成功,变量的值为undefined
- 对象解构
let person = { name: 'zhangsan', age: 20 };
let { name, age } = person;
console.log(name); // 'zhangsan'
console.log(age); // 20
let {name: myName, age: myAge} = person;
console.log(myName); // 'zhangsan'
console.log(myAge); // 20
5. 箭头函数
作用:为了简化 匿名函数 的编写
语法:() => {}
()
代表函数
=>
必须要的符号,指向哪一个代码块
{}
函数体
const fn = () => {}
把一个函数赋值给 fn
- 如果函数体中只有一行代码且需要返回数据,可以省略大括号
let sum = (a, b) => {
return a + b
}
let sum = (a, b) => a + b
- 如果只有一个参数,可以省略参数外的小括号
let sum = (item) => {}
let sum = item => {}
- 如果函数没有参数或多个参数,必须写小括号
let sum = () => {}
let sum = (a, b) => {}
this
的指向
箭头函数不绑定this
关键字
箭头函数内部this
指向当前定义的位置
let div = document.querySelector('div')
// div.onclick = function() {
// console.log(this)
// }
div.onclick = () => {
console.log(this) // window, this 指向当前函数定义的位置
}
6. 剩余参数
作用:当实参数量大于形参数量时,剩余的参数可以用 ...args
方式接受剩余的参数
let sum = (...args) => {
let total = 0
args.forEach(item => total += item)
return total
}
sum(1, 2, 3, 4, 5)
剩余参数和解构配合使用
let students = ['wangwu', 'zhangsan', 'lisi'];
let [s1, ...s2] = students;
console.log(s1); // 'wangwu'
console.log(s2); // ['zhangsan', 'lisi']
二、ES6 的内置对象扩展
1. Array 的扩展方法
1.1 扩展运算符(重点)
作用:可以将数组或者对象转为用逗号分隔的参数序列
let ary = [1, 2, 3];
...ary // 1, 2, 3
console.log(...ary); // 1 2 3,相当于下面的代码
合并数组
// 方法一
let ary1 = [1, 2, 3];
let ary2 = [3, 4, 5];
let ary3 = [...ary1, ...ary2];
// 方法二
ary1.push(...ary2);
// 方法三
Array.prototype.push.apply(arr1, arr2)
console.log(arr1);
将伪数组转换为真数组
let divs = document.getElementsByTagName('div')
let arr = [...divs]
// 转为真数组就可以调用数组对象下面的方法
1.2 Array.from()
方法
作用:将伪数组转为真数组,对象就是一个伪数组
//定义一个集合
let a = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
//转成数组
let b = Array.from(a); // ['a', 'b', 'c']
// 还可以接受第二个参数,作用类似于数组的map方法
// 用来对每个元素进行处理,将处理后的值放入返回的数组
let arrayLike = {
"0": 1,
"1": 2,
"length": 2
}
let newAry = Array.from(arrayLike, item => item *2)//[2,4]
// 注意:如果是对象,那么属性需要写对应的索引
1.3 Array 的实例方法(重点)
1.3.1 实例方法:find()
作用:返回第一个匹配条件的元素(查找元素),如果没找到返回 undefined
// arr.indexOf(1) 查找1对应的索引
// 有就返回索引, 没有就返回 -1
let arr = [{
name: 'zs',
age: 18
}, {
name: 'ww',
age: 20
}]
let obj = arr.find(item => item.name === 'ww')
console.log(obj)
1.3.2 实例方法:findIndex()
作用:返回第一个匹配元素的索引,如果没找到返回 -1
let ary = [1, 5, 10, 15];
let index = ary.findIndex(item => item > 9);
console.log(index); // 2
1.3.3 实例方法:includes()
作用:判断数组中是否包含该元素,返回 boolean 类型的值
// arr.indexOf(1) 查找1对应的索引
// 有就返回索引, 没有就返回 -1
[1, 2, 3].includes(2) // true
[1, 2, 3].includes(4) // false
let arr = [1, 2, 3, 4, 5]
arr.includes(1) // 有1就是true 没有就是false
2. String 的扩展方法
2.1 模板字符串(重点)
作用:用于拼接字符串
let name = '张三';
let sayHello = `hello,my name is ${name}`;
// hello, my name is zhangsan
// 模板字符串换行
let result = {
name: 'zhangsan',
age: 20,
sex: '男'
}
let html = ` <div>
<span>${result.name}</span>
<span>${result.age}</span>
<span>${result.sex}</span>
</div> `;
// 模板字符串: 调用函数得到结果
function getData() {
return '结果'
}
let str = `我现在想拿到结果,具体内容是:${getData()}`
2.2 实例方法:
startsWith()
表示参数字符串是否在原字符串的头部,返回布尔值endsWith()
表示参数字符串是否在原字符串的尾部,返回布尔值
let str = 'Hello world!';
str.startsWith('Hello') // true
str.endsWith('!') // true
2.3 实例方法:repeat()
作用:将字符串重复n次,返回一个新字符串,参数:重复的次数
let str = 'abc'
str.repeat(3) // abcabcabc
3. Set 数据结构
作用:过滤数组重复的值
Set 它类似于数组,但是成员的值都是唯一的,没有重复的值,数组通过索引获取元素,而 Set 不能
Set本身是一个构造函数,用来生成 Set 数据结构
const s = new Set();
// Set函数可以接受一个数组作为参数,用来初始化
const set = new Set([1, 2, 3, 4, 4]);//{1, 2, 3, 4}
实例方法
add()
添加元素,返回 Set 结构本身delete()
删除元素,返回一个布尔值,表示删除是否成功has()
判断元素是否存在,返回一个布尔值clear()
清空Set,没有返回值forEach()
遍历元素,和Array的forEach一样size
属性, 获取Set中元素的个数
遍历
Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值
// s.forEach(value => console.log(value))
const s = new Set([1, 2, 3]);
s.forEach(value => {
console.log(value);
});
以上是关于Es6新增语法梳理的主要内容,如果未能解决你的问题,请参考以下文章