ES6---(1)新增语法及扩展方法

x33g5p2x  于2021-09-24 转载在 其他  
字(5.0k)|赞(0)|评价(0)|浏览(407)

一、关键字

1、let关键字

特性:

  • let声明的变量只在所处于的块级有效
  1. // let变量具有块级作用域,即在{}里面生效
  2. if (true) {
  3. let a = 10;
  4. }
  5. console.log(a); // not defined
  • 不存在变量提升
  1. // let 不存在变量提升
  2. console.log(a);
  3. let a = 100;
  • 暂时性死区
  1. var tmp = 123;
  2. if (true) {
  3. tmp = 'abc';
  4. let tmp;
  5. }

2、const关键字

作用:声明常量,常量就是值(内存地址)不能变化的量。

特性:

  1. 具有块级作用域
  1. if (true) {
  2. const a = 10;
  3. console.log(a); // 10
  4. }
  5. console.log(a); // not defined
  1. 声明常量时必须赋值
  1. // 必须赋初值
  2. const pi; // 报错
  1. 常量赋值后,值不能修改。
  1. // 简单数据类型赋值后不能更改,复杂数据类型赋值后可以改变数据结构内部的值不能更改地址
  2. const pi = 3.14;
  3. // pi = 100; // Assignment to constant variable.
  4. const arr = [100, 200];
  5. arr[0] = 'a';
  6. arr[1] = 'b';
  7. console.log(arr);
  8. arr = ['a', 'b']; // 报错

3、let、var、const的区别

  1. 使用 var 声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象。
  2. 使用 let 声明的变量,其作用域为该语句所在的代码块内,不存在变量提升。
  3. 使用 const 声明的是常量,在后面出现的代码中不能再修改该常量的值。

二、解构赋值

ES6中允许从数组中提取值,按照对应位置,对变量赋值。对象也可以实现解构。

1、数组解构

方法[variable1,variable2,variable3…] = [数组内容]

数组解构允许我们按照一一对应的关系从数组中提取值,然后将值赋值给变量
*
如果解构不成功,变量值变成undefined

  1. // 数组解构允许我们按照一一对应的关系从数组中提取值,然后将值赋值给变量
  2. let [a, b, c, d, e] = [1, 2, 3];
  3. console.log(a);
  4. console.log(b);
  5. console.log(c);
  6. // 如果解构不成功,变量值变成undefined
  7. console.log(d);
  8. console.log(e);

2、对象解构

对象解构允许我们使用变量的名字匹配对象的属性, 匹配成功将对象属性的值赋值给变量

  1. let person = {
  2. name: "zhangsan",
  3. age: 20,
  4. sex: '男'
  5. };
  6. let {
  7. name,
  8. age,
  9. sex
  10. } = person;
  11. console.log(name); // zhangsan
  12. console.log(age); // 20
  13. console.log(sex); // 男

当然也可以对解构的变量重新赋值

  1. let {
  2. name: myName,
  3. age: myAge
  4. } = person;
  5. console.log(myName);
  6. console.log(myAge);

三、箭头函数及剩余参数

1、箭头函数

ES6中新增的定义函数的方式:
() => {}
const fn = () => {}

函数体中只有一句代码,且代码的执行结果就是返回值,可以省略大括号
const sum = (num1, num2) => num1 + num2;

如果形参只有一个,可以省略小括号
const fn = v => v;

箭头函数不绑定this关键字,箭头函数中的this,指向的是函数定义位置的上下文this。

  1. // 箭头函数不绑定this关键字,其this指向函数定义位置的上下文
  2. const obj = {
  3. name: "andy"
  4. };
  5. function fn() {
  6. console.log(this); // obj
  7. return () => {
  8. console.log(this); // obj
  9. };
  10. };
  11. const resFn = fn.call(obj);
  12. resFn();
  13. fs = () => {
  14. console.log(this); // Window
  15. }
  16. fs();

2、剩余参数 …args

剩余参数语法允许我们将一个不定数量的参数表示为一个数组。

  1. function sum (first, ...args) {
  2. console.log(first); // 10
  3. console.log(args); // [20, 30]
  4. }
  5. sum(10, 20, 30)

剩余参数和解构配合使用

  1. let students = ['wangwu', 'zhangsan', 'lisi'];
  2. let [s1, ...s2] = students;
  3. console.log(s1); // 'wangwu'
  4. console.log(s2); // ['zhangsan', 'lisi']

三、内置对象扩展

1、扩展运算符

  1. 扩展运算符可以将数组或者对象转为用逗号分隔的参数序列。
  1. let ary = [1, 2, 3];
  2. ...ary // 1, 2, 3
  3. console.log(...ary); // 1 2 3
  4. console.log(1, 2, 3)
  1. 扩展运算符可以应用于合并数组。
  1. // 方法一
  2. let ary1 = [1, 2, 3]; let ary2 = [3, 4, 5];
  3. let ary3 = [...ary1, ...ary2];
  4. // 方法二
  5. ary1.push(...ary2);
  1. 将类数组或可遍历对象转换为真正的数组
  1. let oDivs = document.getElementsByTagName('div');
  2. oDivs = [...oDivs];

2、Array的扩展方法

  1. Array.from() 将类数组或可遍历对象转换为真正的数组
  1. let arrayLike = {
  2. '0': 'a',
  3. '1': 'b',
  4. '2': 'c',
  5. length: 3
  6. };
  7. let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。

  1. let arrayLike = {
  2. "0": 1,
  3. "1": 2,
  4. "length": 2
  5. }
  6. let newAry = Array.from(aryLike, item => item *2)
  1. find() 用于找出第一个符合条件的数组成员,如果没有找到返回undefined
  1. let ary = [{
  2. id: 1,
  3. name: '张三‘
  4. }, {
  5. id: 2,
  6. name: '李四‘
  7. }];
  8. let target = ary.find((item, index) => item.id == 2);
  9. // {id:2, name:"李四"}
  1. findIndex() 用于找出第一个符合条件的数组成员的位置,如果没有找到返回-1
  1. let ary = [1, 5, 10, 15];
  2. let index = ary.findIndex((value, index) => value > 9);
  3. console.log(index); // 2
  1. includes() 表示某个数组是否包含给定的值,返回布尔值。
  1. [1, 2, 3].includes(2) // true
  2. [1, 2, 3].includes(4) // false

3、String 的扩展方法

  1. 模板字符串
    ES6新增的创建字符串的方式,使用反引号定义。
  1. let name = `zhangsan`;
  • 模板字符串中可以解析变量。
  1. let name = '张三';
  2. let sayHello = `hello,my name is ${name}`; // hello, my name is zhangsan
  • 模板字符串中可以换行
  1. let result = {
  2. name: 'zhangsan',
  3. age: 20,
  4. sex: '男'
  5. }
  6. let html = ` <div> <span>${result.name}</span> <span>${result.age}</span> <span>${result.sex}</span> </div> `;
  • 在模板字符串中可以调用函数。
  1. const sayHello = function () {
  2. return '哈哈哈哈 追不到我吧 我就是这么强大';
  3. };
  4. let greet = `${sayHello()} 哈哈哈哈`; console.log(greet); // 哈哈哈哈 追不到我吧 我就是这么强大 哈哈哈哈
  1. startsWith() 和 endsWith()
    startsWith():表示参数字符串是否在原字符串的头部,返回布尔值
    endsWith():表示参数字符串是否在原字符串的尾部,返回布尔值
  1. let str = 'Hello world!';
  2. str.startsWith('Hello') // true
  3. str.endsWith('!') // true
  1. repeat()
    repeat方法表示将原字符串重复n次,返回一个新字符串。
  1. 'x'.repeat(3) // "xxx"
  2. 'hello'.repeat(2) // "hellohello"

4、Set 数据结构

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set本身是一个构造函数,用来生成 Set 数据结构。

  1. const s = new Set();

Set函数可以接受一个数组作为参数,用来初始化。

  1. const set = new Set([1, 2, 3, 4, 4]);
  1. 实例方法
  • add(value):添加某个值,返回 Set 结构本身
  • delete(value):删除某个值,返回一个布尔值,表示删除是否成功
  • has(value):返回一个布尔值,表示该值是否为 Set 的成员
  • clear():清除所有成员,没有返回值
  1. const s = new Set();
  2. s.add(1).add(2).add(3); // 向 set 结构中添加值
  3. s.delete(2) // 删除 set 结构中的2值
  4. s.has(1) // 表示 set 结构中是否有1这个值 返回布尔值
  5. s.clear() // 清除 set 结构中的所有值
  1. 遍历
    Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。
  1. s.forEach(value => console.log(value))

5、Map数据结构

map是用来存放键值对的有序列表,类似于Python中的字典数据类型。
其定义如下:

  1. let map = new Map();

map也有很多方法:

  • set() 添加元素
  • get() 获取元素的值
  • has() 判断是否存在该键
  • delete() 删除元素
  • clear() 清空
  1. // 键值对的有序列表
  2. let map = new Map();
  3. map.set('name', '张三');
  4. map.set("age", '20');
  5. console.log(map.get('name'));
  6. console.log(map);
  7. console.log(map.has('name'));
  8. map.delete('name');
  9. map.clear();
  10. console.log(map);

6、Symbol数据类型

  1. Symbol是原始数据类型,用来表示独一无二的值,通常用来定义对象的私有变量。定义时不需要new声明。
  1. const name1 = Symbol('name');
  2. const name2 = Symbol("name"); // 二者内存地址不一样
  3. console.log(name1 === name2); // false
  1. 如果用symbol定义对象的变量,取值时一定要用[]
  1. let s1 = Symbol("s1");
  2. console.log(s1);
  3. let obj = {};
  4. obj[s1] = "andy";
  5. console.log(obj);
  6. console.log(obj.s1); // undefined
  7. console.log(obj[s1]);
  1. 遍历symbol
    不能简单地用for、foreach遍历获取。
    可以用Object.getOwnPropertySymbols()和Reflect.ownKeys()获取
  1. // 遍历symbol定义对象的变量 获取属性名
  2. let s = Object.getOwnPropertySymbols(obj);
  3. console.log(s);
  4. let m = Reflect.ownKeys(obj);
  5. console.log(m);

下一篇:ES6—(2)迭代器和生成器

相关文章