接着上一篇的说。

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 12
console.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);
// true
var { message: msg = "Something went wrong" } = {};
console.log(msg);
// "Something went wrong"
var { x = 3 } = {};
console.log(x);
//

解构的实际应用场景

多重返回值

返回一个数组,然后解构

    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

ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring的更多相关文章

  1. ES6学习笔记(2)- 箭头函数

    1. 箭头函数声明 箭头函数的声明方式示例: 1 const printValue = (condition) => { 2 let testValue = 55; 3 if (conditio ...

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

    python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...

  3. ES6学习笔记二:各种扩展

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7242967.html 一:字符串扩展 1:字符串遍历器 for (let char of str) { // ...

  4. arrow functions 箭头函数

    ES6里新增加的,与普通方法不同的地方 1.this 的对象在定义函数的时候确定了,而不是在使用的时候才决定 2.不可以使用 new  ,也就不能当构造函数 3.this 的值一旦确定无法修改     ...

  5. Vue学习笔记之Vue的箭头函数

    0x00 箭头函数 基本语法: ES6允许使用“箭头”(=>)定义函数 var f = a = > a //等同于 var f = function(a){ return a; } 如果箭 ...

  6. ES6学习(2)——arrows箭头函数

    Arrows => 箭头函数 箭头函数,若有了解过coffeeScript的同学,或许对此印象深刻,因为它可以让语法省略不少,特别是对于回调函数,会让代码更清晰简洁. expression 让我 ...

  7. ES6学习笔记二

    字符串遍历 var str = 'hello'; for(let s of str){console.log(s += ' ')} //h e l l o 字符串查找:添加了include(str,i ...

  8. ES6学习笔记(二)——字符串扩展

    相信很多人也和我一样,不喜欢这样循规蹈矩的逐条去学习语法,很枯燥乏味.主要是这样学完一遍之后,没过一段时间就忘到九霄云外了.不如实际用到的时候研究它记得牢靠,所以我就整理成笔记,加深记忆的同时便于复习 ...

  9. ES6学习笔记(二)

    Set 和 Map 数据结构 1.set 基本用法 ES6提供了新的数据结构Set,它类似于数组,但是成员的值都是唯一的,没有重复的值 Set本身是一个构造函数,用来生成Set数据结构 const s ...

随机推荐

  1. unicodedata.normalize()/使用strip()、rstrip()和lstrip()/encode和decode 笔记(具体可看 《Python Cookbook》3rd Edition 2.9~2.11)

    unicodedata.normalize()清理字符串 # normalize()的第一个参数指定字符串标准化的方式,分别有NFD/NFC >>> s1 = 'Spicy Jala ...

  2. asp.net开发细节整理

    1.使用entity framework的DB First时,手动书实体类的表单验证 public partial class Fund { } [MetadataType(typeof(Valida ...

  3. 一个基于netty的websocket聊天demo

    这里,仅仅是一个demo,模拟客户基于浏览器咨询卖家问题的场景,但是,这里的demo中,卖家不是人,是基于netty的程序(我就叫你uglyRobot吧),自动回复了客户问的问题. 项目特点如下: 1 ...

  4. Windows 2003 下安装 SQL Server 2008 Express

    .NET Framework 3.5 Service Pack 1(完整程序包) https://www.microsoft.com/zh-cn/download/details.aspx?id=25 ...

  5. <亲测>CentOS7yum安装PHP7.2

    如果之前已经安装我们先卸载一下 yum -y remove php* 由于linux的yum源不存在php7.x,所以我们要更改yum源 rpm -Uvh https://dl.fedoraproje ...

  6. socket.io入门整理教程

    socket.io入门整理  发布于 5 年前  作者 dtrex  124983 次浏览  最后一次编辑是 1 年前 我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写 ...

  7. 【ActiveMQ】之安全机制(一)管控台安全设置

    ActiveMQ 管控台基于jetty,默认端口8161,默认用户名,密码都是admin,这样的安全配置过于弱化,所以我们需要修改一下 1.修改端口 找到conf/jetty.xml文件里面这一段配置 ...

  8. Apple公司Darwin流式服务器源代码分析

    当前,伴随着Internet的飞速发展,计算机网络已经进入到每一个普通人的家庭.在这个过程中,一个值得我们关注的现象是:Internet中存储和传输内容的构成已经发生了本质的改变,从传统的基于文本或少 ...

  9. 51nod1302 矩形面积交

    有2N个矩形,这些矩形被标号为0 ~ 2N-1,对于第i个矩形其长宽分别为X[i]与Y[i].现在要把这2N个矩形分为两组,每组N个,每个矩形恰好分到两组中的一组里.分成两组后,设两组分别为A组.B组 ...

  10. Global配置接口访问日志以及测试日志记录

    在客户端请求接口时,经常会出现接口相应慢,接口等待超时,接口错误,为了这事相信不少后台开发者为此背锅,记下请求日志,拿出有力证据这才是关键. 1.接口请求错误记录 很多时候接口请求出现的500,404 ...