资讯专栏INFORMATION COLUMN

ES6基础知识01(let,const,解构赋值)

MSchumi / 824人阅读

摘要:声明的变量不得改变值,这意味着,一旦声明变量,就必须立即初始化,不能留到以后赋值。解构赋值允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。对象的解构赋值对象的属性没有次序,变量必须与属性同名。

ES6 新增特性整理讲解

新增命令

1.let命令

ES6新增了let命令,用来声明变量。它的用法类似于var,但是也存在新的特性。

</>复制代码

  1. - **let所声明的变量,只在let命令所在的代码块内有效。适用于for循环**

</>复制代码

  1. var a = 3;
  2. var a = 4;
  3. let b = 4;
  4. {
  5. var a = 5;
  6. let b = 5; //作用域仅在代码块内部
  7. let c = "this is inner c";
  8. var d = "this is inner d";
  9. console.log(b); //b = 5
  10. }
  11. console.log(a); //a = 5
  12. console.log(b); //b = 4
  13. console.log(d); //this is inner d
  14. console.log(c); //c is not defined

for循环

</>复制代码

  1. 按理说,在执行完for循环后,应该释放变量的值,否则可能会对全局变量造成影响,因此,声明为let,会更好。

</>复制代码

  1. //使用var 声明
  2. var result = 0;
  3. for(var i = 0;i<100;i++){
  4. result += i;
  5. };
  6. console.log(result); //5050
  7. console.log(i); //101

</>复制代码

  1. //使用let 声明
  2. var result = 0;
  3. for(let i = 0;i<100;i++){
  4. result += i;
  5. };
  6. console.log(result); //5050
  7. console.log(i); // i is not defined

</>复制代码

  1. - **不存在变量提升**

</>复制代码

  1. //先操作
  2. console.log("var变量提升",a); //undefined
  3. console.log("let没有变量提升",b); //报错:b is not defined
  4. //再声明
  5. var a = 3;
  6. let b = 4;

</>复制代码

  1. - **暂时性死区**

</>复制代码

  1. var tmp = 123;
  2. if (true) {
  3. tmp = "abc"; // ReferenceError
  4. let tmp;
  5. }

</>复制代码

  1. - **不允许重复声明**
  2. ```
  3. var a = 3;
  4. var a = 4;
  5. let b = 4;
  6. let b = 5; //TypeError:Duplicate declaration "b"
  7. console.log(a);//a = 4
  8. console.log(b);
  9. ```

2.const命令

基本用法:const声明一个只读常量。一旦声明,常量的值就不能改变。类似于Java中的final关键字。

</>复制代码

  1. const PI = 3.1415; PI = 3; // TypeError: Assignment to constant variable

const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。

</>复制代码

  1. const foo; // SyntaxError: Missing initializer in const declaration

其余特点与let一样,具有不能重复声明,具有块级作用域,暂时性死区。

解构赋值

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。例如:

</>复制代码

  1. let [a, b, c] = [1, 2, 3];

本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。如果解构不成功,变量的值就等于undefined。另一种情况是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功。

1.对象的解构赋值

a>对象的属性没有次序,变量必须与属性同名。

在ES5中

</>复制代码

  1. var obj ={
  2. name = "tom,
  3. age = 12,
  4. };
  5. var name = obj.name;
  6. var age = obj.age;

在ES6中

</>复制代码

  1. let {name:name,age:age} = obj;
  2. let{name,age} = obj;
  3. console.log(name,age);

b>如果变量名与属性名不一致,必须写成下面这样。

</>复制代码

  1. var { foo: baz } = { foo: "aaa", bar: "bbb" }; //baz = "aaa”

c>嵌套解构

</>复制代码

  1. let obj = { p: [ "Hello", { y: "World" } ] };
  2. let { p: [x, { y }] } = obj; //x = "Hello”; y = "World”

d>默认值(默认值生效的条件是,对象的属性值严格等于undefined)

</>复制代码

  1. var {x: y = 3} = {}; y // 3

2.数组的解构赋值

let [a, b, c] = [1, 2, 3];

a>不完全解构

</>复制代码

  1. let [a, [b], d] = [1, [2, 3], 4]; //a = 1; b = 2; d = 4

b>集合解构

</>复制代码

  1. let [head, ...tail] = [1, 2, 3, 4]; //head = 1; tail = [2, 3, 4]

c>默认值(当匹配值严格等于undefined时,默认值生效)

</>复制代码

  1. let [x, y = "b"] = ["a"]; // x="a", y="b’

d>默认值也可以为函数

</>复制代码

  1. function f() { console.log("aaa"); }
  2. let [x = f()] = [1];
  3. let [a,b,...c] = ["terry","lerry","tom","jack"];
  4. console.log(a); //terry;
  5. console.log(b); //lerry;
  6. console.log(c); //["tom","jack"]

3.字符串的解构赋值
a>解构时,字符串被转换成了一个类似数组的对象。

</>复制代码

  1. const [a, b, c, d, e] = ‘hello’; //a=h;b=e;c=l;d=l;e=o

b>也可以对数组的属性解构

</>复制代码

  1. let {length : len} = ‘hello’; //len = 5

c> 数值和布尔值解构赋值

</>复制代码

  1. 解构时,如果等号右边是数值和布尔值,则会先转为对象
  2. let {toString: s} = 123; //s === Number.prototype.toString true
  3. let {toString: s} = true; //s === Boolean.prototype.toString true

4.函数参数的解构赋值
基本语法:

</>复制代码

  1. function add([x, y]){ return x + y; }
  2. add([1, 2]);

默认值:

</>复制代码

  1. function move({x = 0, y = 0} = {}) {
  2. return [x, y];
  3. }
  4. move({x: 3, y: 8}); // [3, 8]
  5. move({x: 3}); // [3, 0]
  6. move({}); // [0, 0]
  7. move(); // [0, 0]

解构赋值的常见用途

1.交换变量的值

</>复制代码

  1. let x = 1; let y = 2; [x, y] = [y, x];

2.从函数返回多个值

</>复制代码

  1. function example() { return [1, 2, 3]; }
  2. let [a, b, c] = example();

3.函数参数的定义

</>复制代码

  1. function f([x, y, z]) { ... }
  2. f([1, 2, 3]);

4.提取JSON数据

</>复制代码

  1. let jsonData = { id: 42, status: "OK", data: [867, 5309] };
  2. let { id, status, data: number } = jsonData;

5.输入模块的指定方法

</>复制代码

  1. const { SourceMapConsumer, SourceNode } = require("source-map");

6.函数参数的默认值

</>复制代码

  1. jQuery.ajax = function (url, {
  2. async = true, cache = true, global = true,
  3. beforeSend = function () {},
  4. complete = function () {},
  5. // ... more config
  6. }) { // ... do stuff };

7..指定参数的默认值,就避免了在函数体内部再写var foo = config.foo || "default foo";这样的语句
遍历map结构

</>复制代码

  1. var map = new Map();
  2. map.set("first", "hello");
  3. map.set("second", "world");
  4. for (let [key, value] of map) {
  5. console.log(key + " is " + value);
  6. }

--------------------------------------------------------------------本次结束-------------------------

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95326.html

相关文章

  • ES6基础知识01(let,const,解构赋值)

    摘要:声明的变量不得改变值,这意味着,一旦声明变量,就必须立即初始化,不能留到以后赋值。解构赋值允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。对象的解构赋值对象的属性没有次序,变量必须与属性同名。 ES6 新增特性整理讲解 新增命令 1.let命令 ES6新增了let命令,用来声明变量。它的用法类似于var,但是也存在新的特性。 - **let所声明的变量,只在le...

    Gilbertat 评论0 收藏0
  • es6知识点总结(一)

    摘要:知识点总结一,,能重复声明,有前置功能。浅拷贝一个数组设置原型。永远是唯一的,不可能和别的重复,可以阻止对象的属性被篡改前面不能使用操作符。和的区别键名可以是任何数据类型初始化的时候必须一次性指定键名和键值。 es6知识点总结(一) let,var,const var:能重复声明,有前置功能。 let:有块级作用域,没有前置功能,不能重复声明。 const:有块级作用域,用来声明常量(...

    HelKyle 评论0 收藏0
  • 工作中常用es6+特性

    摘要:结合工作中使用情况,简单对进行一些复习总结,包括常用的语法,等,以及短时间内要上手需要重点学习的知识点不同工作环境可能有一些差别,主要参考链接是阮一峰的博客以及外文博客阮老师大部分文章是直接翻译的这个博客简介先说一下,是一个标准化组织,他们 结合工作中使用情况,简单对es6进行一些复习总结,包括常用的语法,api等,以及短时间内要上手需要重点学习的知识点(不同工作环境可能有一些差别),...

    xcold 评论0 收藏0
  • ES6基础

    一、块级作用域 1. var 首先看看ES5中得变量声明方式 if (true) { var a = 2 } console.log(a) // 2 以上代码等同于 var a if (true) { a = 2 } console.log(a) 以上可知 : 在块内部定义变量 变量提升,到函数最顶部 通过var声明的变量,无论在何处声明,均为全局作用域 2.let 和 ...

    BigTomato 评论0 收藏0

发表评论

0条评论

MSchumi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<