接着上一篇的说。

arrow functions 箭头函数

=> 更便捷的函数声明

    document.getElementById("click_1").onclick = function(){ console.log("say Hi!"); }document.getElementById("click_2").onclick = () => { let a = 1; let b = 2; console.log(a + b); }

之前的 function 声明可以被 => 代替,书写起来更便捷。

箭头函数还有个更炫酷也是最使用的用法。

先看个常见的例子:

    class people{constructor(){ this.age = 18; }say(){ setTimeout(function(){ console.log("I'm " + this.age + " year old."); },2000) }}let children = new people();children.say();    // I'm undefined year old.

这里的this指向内层function对象,所以出现undefined,这就是比较蛋疼的bug。为了方便理解上个截图说明

传统解决方案:

    class people{constructor(){ this.age = 18; }say(){ var self = this;setTimeout(function(){ console.log("I'm " + self.age + " year old."); },2000) }}let children = new people();children.say();    // I'm 18 year old.

this在函数内传递给一个变量再使用。或者

    class people{constructor(){ this.age = 18; }say(){ setTimeout(function(){ console.log("I'm " + this.age + " year old."); }.bind(this),2000) }}let children = new people();children.say();    // I'm 18 year old.

bind(this) 指明this的对象

再来看看用 => 的做法

    class people{constructor(){ this.age = 18; }say(){ setTimeout( ()=>{ console.log("I'm " + this.age + " year old."); },2000) }}let children = new people();children.say();    // I'm 18 year old.

简单省事儿阅读清晰。

template string

这玩儿超好用,一旦用上你会爱不释手,下面来看一段案例:

    class people{constructor(name,age,comeFrom){this.name = name;this.age = age;this.comeFrom = comeFrom;}}// 实例化对象let XiaoM = new people("小明",18,"中国");// 传统写法console.log("我叫"+XiaoM.name+",今年"+XiaoM.age+"岁,我来自"+XiaoM.comeFrom+"。");// template string写法document.write(`我叫<font color="red">${XiaoM.name}</font>,今年<b>${XiaoM.age}</b>岁,我来自${XiaoM.comeFrom}。`);console.log(`我叫${XiaoM.name},今年${XiaoM.age}岁,我来自${XiaoM.comeFrom}。`);

template string有点类似C#中的string.format,不过个人感觉template stringstring.format更直观。

用反引号(`来标识起始,用${}来引用变量,而且所有的空格和缩进都会被保留在输出之中,是不是非常爽?!

说明下 反引号在大键盘数字键1的前面一个就是~下面的那个(很惭愧我找反引号找了一会才找到,我开始误以为是单引号)

React Router从第1.0.3版开始也使用ES6语法了,例:

<Link to={`/taco/${taco.name}`}>{taco.name}</Link>

destructuring

更简介易懂的解构。先来看下数组解构

    arr_animal = ["cat","dog","mouse"];// 传统写法var c = arr_animal[0];var d = arr_animal[1];var m = arr_animal[2];// destructuring解构var [c,d,m] = arr_animal;

解构也可以跳过数组中的一些元素,如:

    arr_animal = ["cat","dog","mouse"];var [,d,] = arr_animal;

还可以取除开头元素外的剩余元素,如:

    arr_num = [1,2,3,4,5,6,7,8,9,0];var [no1,no2, ...noX] = arr_num;console.log(noX);    // [3,4,5,6,7,8,9,0]

注:...noX只能放在最后,否则报错。

看下对象解构

    var objA = { name: "A",age: 12 };var objB = { name: "B",age: 18 };var { name: nameA,age: ageA } = objA;var { name: nameB,age: ageB } = objB;console.log(nameA,ageA); // A 12console.log(nameB,ageB); // B 18

通常用以下写法更简明

     var { name , age } = { name:"XiaoM", age:18 }console.log(name,age);    // XiaoM 18

注:这种写法仅限 解构变量名 与 属性名 相同,否则解构变量为undefined

看一个嵌套的例子:

    var complicatedObj = {arrayProp: ["Zapp",{ second: "Brannigan" }]};var { arrayProp: [first, { second }] } = complicatedObj;console.log(first); // "Zapp"console.log(second); // "Brannigan"

 注:这里只能解构 first 和 second  ,不能解构 arrayProp , 因为这里 相对于被解构的 first 和 second 来说 arrayProp 是一个数组。

若需要解构 arrayProp

    var complicatedObj = {arrayProp: ["Zapp",{ second: "Brannigan" }]};var { arrayProp } = complicatedObj;console.log(arrayProp); // ["Zapp", Object]

请注意:当解构对象并赋值给变量时,如果你已经声明或不打算声明这些变量(亦即赋值语句前没有letconstvar关键字),你应该注意这样一个潜在的语法错误:

    { blowUp } = { blowUp: 10 };// Syntax error 语法错误

为什么会出错?这是因为JavaScript语法通知解析引擎将任何以{开始的语句解析为一个块语句(例如,{console}是一个合法块语句)。解决方案是将整个表达式用一对小括号包裹:

({ safe } = {});

解构值不是对象、数组或迭代器

当尝试解构nullundefined时,你会得到一个类型错误:

    var {blowUp} = null;// TypeError: null has no properties(null没有属性)

然而,可以解构其它原始类型,例如:布尔值数值字符串,但是你将得到undefined

    var {wtf} = NaN;console.log(wtf);// undefined

这里可能对此感到意外,但经过进一步审查你就会发现,原因其实非常简单。当使用对象赋值模式时,被解构的值需要被强制转换为对象。大多数类型都可以被转换为对象,但nullundefined却无法进行转换。当使用数组赋值模式时,被解构的值一定要包含一个迭代器。

当你要解构的属性未定义时你可以提供一个默认值

    var [missing = true] = [];console.log(missing);// truevar { message: msg = "Something went wrong" } = {};console.log(msg);// "Something went wrong"var { x = 3 } = {};console.log(x);// 3

解构的实际应用场景

多重返回值

返回一个数组,然后解构

    function returnMultipleValues() {return [1, 2];}var [foo, bar] = returnMultipleValues();

返回值封装为一个对象并命名属性,然后解构

    function returnMultipleValues() {return {foo: 1,bar: 2};}var { foo, bar } = returnMultipleValues();

函数参数定义

作为开发者,我们需要实现设计良好的API,通常的做法是为函数为函数设计一个对象作为参数,然后将不同的实际参数作为对象属性,以避免让API使用者记住 多个参数的使用顺序。我们可以使用解构特性来避免这种问题,当我们想要引用它的其中一个属性时,大可不必反复使用这种单一参数对象。

    function removeBreakpoint({ url, line, column }) {    // ... }

这种函数设计在开发中非常受欢迎。

关于destructuring解构的参考资料

ES6学习笔记目录

ES6学习笔记<一> let const class extends super

ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

ES6学习笔记<三> 生成器函数与yield

ES6学习笔记<四> default、rest、Multi-line Strings

ES6学习笔记<五> Module的操作——import、export、as

转载于:https://www.cnblogs.com/MirageFox/p/7570032.html

ES6学习笔记二arrow functions 箭头函数、template string、destructuring相关推荐

  1. 【theano-windows】学习笔记二——theano中的函数和共享参数

    前言 上一篇博客中学到了theano中的变量类型,也就是dscalar.dvector之类的, 然后还有一个theano.function和eval函数, 将我们所定义的操作转换成theano可执行的 ...

  2. ES6学习笔记二 新的声明方式和变量的解构赋值!

    新的声明方式 在ES5的时候,我们只有一个声明方式,var!但是在es6中,声明进行了扩展,我们加上ES5的var的申明方式,我们有了三种声明方式: var:它是variable的简写,可以理解成变量 ...

  3. ES6学习笔记(二)

    变量解构赋值 ES6允许按照一定模式从数组和对象中提取值,对变量进行赋值,这被称为解构,模式匹配,只要等号两边的模式相同左边的变量就会被赋予对应的值,如果解构不成功,变量值就为undefined,如果 ...

  4. javascript Arrow functions(箭头函数)

    Syntax (param1, param2, -, paramN) => { statements } (param1, param2, -, paramN) => expression ...

  5. python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法

    https://www.cnblogs.com/zdz8207/p/python_learn_note_20.html

  6. 《Windows via C/C++》学习笔记(二):Working with Characters and String

    1. 字符编码与数据类型 编码 字节数 类型 字符(串)常量 WinNT.h中的定义 ANSI 8bit char 'A' "A string" typedef char CHAR ...

  7. ES6基础(var let const 箭头函数)-学习笔记

    文章目录 ES6基础(var let const 箭头函数)- 学习笔记 定义:var let const 箭头函数 数据结构 set map ES6基础(var let const 箭头函数)- 学 ...

  8. es6学习笔记-字符串的扩展_v1.0_byKL

    es6学习笔记-字符串的扩展_v1.0 字符的Unicode表示法 JavaScript 允许使用uxxxx的形式表示一个字符,但在 ES6 之前,单个码点仅支持u0000到uFFFF,超出该范围的必 ...

  9. ES6学习笔记(五):轻松了解ES6的内置扩展对象

    前面分享了四篇有关ES6相关的技术,如想了解更多,可以查看以下连接 <ES6学习笔记(一):轻松搞懂面向对象编程.类和对象> <ES6学习笔记(二):教你玩转类的继承和类的对象> ...

最新文章

  1. HDU1040简单排序题
  2. VMware HA环境搭建七:WIN2012 ISCSI目标服务器的安装
  3. 机器学习——利用K-均值聚类算法对未标注数据分组
  4. windows下挂载ext4_WSL2 支持挂载物理磁盘,Windows 可直接访问 ext4
  5. java 静态变量生命周期(类生命周期)
  6. 《博德之门 3》究竟有多「DnD」?
  7. 几个用于序列化的代码片段
  8. 9206-1118-周三 猜拳小游戏一次性版本
  9. c#时分秒毫秒微妙_C# 关于DateTime类型 精确到毫秒
  10. mysql scale,Mailchimp Scale:a MySQL Perspective
  11. WPF e.Systemkey的一个坑
  12. Google 出品的 Java 编码规范和编程指南,权威又科学,强烈推荐
  13. DOS控制台启动方式+DOS控制台常用命令
  14. 创客匠人知识付费SaaS系统功能介绍
  15. 怎样才能写好一份高质量的市场需求文档(MRD)
  16. linux 拷贝xlsx_linux 命令行将xlsx格式文件转换成CSV的5种方法
  17. 数据库上机实验八(视图)
  18. 2003服务器系统QQ安装不了,qq怎么安装不了(QQ怎么都安装不上重装也不行,是哪里出了问题?)...
  19. 什么是软文, 软文怎么写
  20. 小明Q2投影仪好用吗?小明Q2和哈趣K1哪个更值得入手?

热门文章

  1. 联通Iphone上市
  2. Kali 玩机技巧(杂篇)
  3. Shell 脚本基本用法
  4. 免费网络电话(voip)的优点
  5. 遗传算法python(含例程代码与详解)
  6. Unity3D赛车游戏+脚本基础
  7. 【小迪安全day08】信息收集-架构,搭建,防护应用WAF
  8. bshare网站实现分享
  9. cd r光盘可以反复刻录_如何跨多个DVD或CD光盘刻录数据
  10. Java中常见的对象类型简述(DO、BO、DTO、VO、AO、PO)