读阮一峰《ECMAScript 6 入门》小结,http://es6.ruanyifeng.com/

1. ES6简介

Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码

在线转换:https://babeljs.io/repl/

2. let和const命令

let在块级作用域内有效,var有变量提升(变量可以在声明之前使用,值为undefined),声明的变量有内存泄露

const定义常量,不能改变

如果区块中存在letconst命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错都属于变量的“死区”。

3. 变量的解构赋值

  • 数组的解构

    let [a, b, c] = [1, 2, 3];    // a=1;b=2;c=3
    let [a, ...b] = [1, 2, 3, 4]; // a=1;b=[2, 3, 4];
    let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
    let [x = 1] = [null]; // x=null

    注意,ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。

  • 对象的解构
    let { foo, bar } = { foo: "aaa", bar: "bbb" };
    等价于
    let { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" };
    // foo="aaa" ; bar="bbb"
    let { foo: baz } = { foo: 'aaa', bar: 'bbb' };// baz="aaa"

    对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者

  • 字符串的解构赋值
    const [a, b, c, d, e] = 'hello'; //'h','e','l','l','e'
    let {length : len} = 'hello'; // len=5
  • 数值和布尔值的解构赋值
  • 函数参数的解构赋值

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

用途:

  1. 交换变量的值 [x, y] = [y, x]
  2. 从函数返回多个值
  3. 函数参数的定义

    // 参数是一组有次序的值
    function f([x, y, z]) { ... }
    f([1, 2, 3]); // 参数是一组无次序的值
    function f({x, y, z}) { ... }
    f({z: 3, y: 2, x: 1});
  4. 提取 JSON 数据

    let jsonData = {
    id: 42,
    status: "OK",
    data: [867, 5309]
    }; let { id, status, data: number } = jsonData; console.log(id, status, number);
    // 42, "OK", [867, 5309]
  5. 函数参数的默认值
  6. 遍历 Map 结构
  7. 输入模块的指定方法

4. 字符串的扩展

  • 可以被for...of循环遍历
  • includes():返回布尔值,表示是否找到了参数字符串。

    startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。

    endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部

    这三个方法都支持第二个参数,表示开始搜索的位置。
  • repeat(): 返回一个新字符串,表示将原字符串重复n次
  • padStart()用于头部补全,padEnd()用于尾部补全。'3'.padStart(2, '0') //03
  • 模板字符串
    $('#result').append(`
    There are <b>${basket.count}</b> items
    in your basket, <em>${basket.onSale}</em>
    are on sale!
    `);

    所有的空格和缩进都会被保留在输出之中

    模板字符串中嵌入变量,需要将变量名写在${}之中。

5. 正则的扩展

  • RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。
  • u 修饰符,含义为“Unicode 模式”
  • y 修饰符,叫做“粘连”(sticky)修饰符。后一次匹配都从上一次匹配成功的下一个位置开始
    const REGEX = /a/gy;
    'aaxa'.replace(REGEX, '-') // '--xa'

    单单一个y修饰符对match方法,只能返回第一个匹配,必须与g修饰符联用,才能返回所有匹配。

  • s 修饰符:dotAll 模式

    使得.可以匹配任意单个字符。/foo.bar/s.test('foo\nbar') // true
  • 后行断言

    ”先行断言“指的是,x只有在y前面才匹配,必须写成/x(?=y)/

    ”先行否定断言“指的是,x只有不在y前面才匹配,必须写成/x(?!y)/

    “后行断言”正好与“先行断言”相反,x只有在y后面才匹配,必须写成/(?<=y)x/

    ”后行否定断言“则与”先行否定断言“相反,x只有不在y后面才匹配,必须写成/(?<!y)x/
  • 具名组匹配
    const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
    const matchObj = RE_DATE.exec('1999-12-31');
    const year = matchObj.groups.year; // 1999
    const month = matchObj.groups.month; // 12
    const day = matchObj.groups.day; // 31

6. 数值的扩展

Number.isFinite()

Number.isNaN()

Number.parseInt()

Number.parseFloat()

Number.isInteger() //判断是否是整数

Math.trunc() //方法用于去除一个数的小数部分,返回整数部分

Math.sign() //用来判断一个数到底是正数、负数、还是零(+1,-1,0,-0,NaN)

指数运算符:**

2 ** 3 // 8
2 ** 3 ** 2 // 相当于 2 ** (3 ** 2)

7. 函数的扩展

  • ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。
  • 参数默认值不是传值的,而是每次都重新计算默认值表达式的值。也就是说,参数默认值是惰性求值的。
    let x = 99;
    function foo(p = x + 1) {
    console.log(p);
    }
    foo() // 100
    x = 100;
    foo() // 101
  • 函数的length属性,将返回没有指定默认值的参数个数

    (function (a, b, c = 5) {}).length // 2
  • rest 参数
function add(...values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(2, 5, 3) // 10
  • 箭头函数

    如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。

    箭头函数有几个使用注意点:

    (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

    (2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。

    (3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。

    (4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。

8. 数组的扩展

9. 对象的扩展

见《ES6数组、对象的扩展

10. Symbol

  • 一种新的原始数据类型Symbol,表示独一无二的值。
  • 用于对象的属性名,就能保证不会出现同名的属性

    在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中。
  • 消除魔术字符串
  • Symbol 作为属性名,该属性不会出现在for...infor...of循环中,也不会被Object.keys()Object.getOwnPropertyNames()JSON.stringify()返回。但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。

11. Set 和 Map 数据结构

Set 数据结构

它类似于数组,但是成员的值都是唯一的,没有重复的值。

Set 结构的实例有以下属性。

  • Set.prototype.constructor:构造函数,默认就是Set函数。
  • Set.prototype.size:返回Set实例的成员总数。

Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。下面先介绍四个操作方法。

  • add(value):添加某个值,返回 Set 结构本身。
  • delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • has(value):返回一个布尔值,表示该值是否为Set的成员。
  • clear():清除所有成员,没有返回值。

Array.from方法可以将 Set 结构转为数组。

去重

const items = new Set([1, 2, 3, 4, 4]);
//方法一
[...items]
//方法二
Array.from(items);
// [1, 2, 3, 4]

Map 数据结构

它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

12. Proxy 代理器

Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。

  • get(目标对象,属性名,[proxy 实例本身])

    用于拦截某个属性的读取操作

  • set(目标对象,属性名,属性值,[proxy 实例本身])

    用来拦截某个属性的赋值操作

  • apply(目标对象,上下文对象(this),参数数组)

    拦截函数的调用、callapply操作。

  • has

    用来拦截HasProperty操作,即判断对象是否具有某个属性时,这个方法会生效。典型的操作就是in运算符。

    has拦截只对in运算符生效,对for...in循环不生效,导致不符合要求的属性没有被for...in循环所排除。

  • construct()

    用于拦截new命令

  • deleteProperty()

    用于拦截new命令

  • defineProperty()

    拦截了Object.defineProperty操作

    ...

Reflect

Promise 对象

读阮一峰《ECMAScript 6 入门》小结的更多相关文章

  1. 读阮一峰老师 es6 入门笔记 —— 第一章

    鉴于最近用 vuejs 框架开发项目,其中有很多涉及到 es6 语法不太理解所以便认真地读了一下这本书. 地址:http://es6.ruanyifeng.com/#README 第一章:let ,c ...

  2. 【js 笔记】读阮一峰老师 es6 入门笔记 —— 第一章

      鉴于最近用 vuejs 框架开发项目,其中有很多涉及到 es6 语法不太理解所以便认真地读了一下这本书. 地址:http://es6.ruanyifeng.com/#README 第一章:let ...

  3. 【js 笔记】读阮一峰老师 es6 入门笔记 —— 第二章

    第二章:变量的解构赋值 在es6 版本前,如果要为多个变量赋不同值,我想是件比较麻烦的事情.但es6 版本新推出了一个新技术那就是今天的主角变量的解构赋值. 变量解构赋值分为两种方法:数组解构赋值 和 ...

  4. 读阮一峰对《javascript语言精粹》的笔记,我有疑问。

    <javascript语言精粹>是一本很棒的书籍,其中作者在附录列出了12种他所认为的javascript语言中的糟粕. 我最近开始跟读前端前辈的博客,其中读到了阮一峰的<12种不宜 ...

  5. react 入门教程 阮一峰老师真的是榜样

    -  转自阮一峰老师博客 React 入门实例教程   作者: 阮一峰 日期: 2015年3月31日 现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Nati ...

  6. 转: DNS 原理入门 (from 阮一峰)

    转自:http://www.ruanyifeng.com/blog/2016/06/dns.html DNS 原理入门   作者: 阮一峰 日期: 2016年6月16日 DNS 是互联网核心协议之一. ...

  7. DNS 原理入门 - 阮一峰(转载)

      DNS 原理入门 作者: 阮一峰 日期: 2016年6月16日 DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件 ...

  8. react入门(1)之阮一峰react教程

    阮一峰老师的github地址:React Demos React 入门实例教程 2.ReactDOM.render() // ReactDOM.render() 将模板转化为 HTML 语言 // 参 ...

  9. React 入门实例教程[阮一峰的网络日志] (分享)

    作者: 阮一峰 https://github.com/ruanyf/react-demos 转自:http://www.ruanyifeng.com/blog/2015/03/react.html 对 ...

随机推荐

  1. 安卓ContentObserver模式获取短信用正则自己主动填充验证码

    近期做注冊的时候看到非常多app在手机接受到短信的时候直接填写验证码到界面省略用户自己主动输入,感觉这样确实蛮人性化的呵呵.于是自己也做了一个 步骤: 首先我使用了ContentObserver监听短 ...

  2. 開始EEPlat之旅

    怎样開始EEPlat之旅 EEPlat分为社区版和商业版:功能上分为企业版和PaaS版.下面为社区企业版的開始之旅. 第一步:安装project,有两种:war包和代码project.(眼下googl ...

  3. cocos2d-x 3.1 学习(一):工具安装与配置环境

    初级学习cocos2d-x 3.1开发,学习开发过程记录到博客上面来,哪写的不正确请指点. 1.工具安装 cocos2d-x 3.1rc0 最新版本号,下载后解压.下载地址:http://www.co ...

  4. vim使用(二):经常使用功能

    1. vim经常使用功能 vim的经常使用功能.包含块的选择.复制,多文件的编辑.多窗体等功能. 2. vim块选择 块选择是将文档中的一块能够选择复制,粘贴,不用整行的处理. 按下 v , V . ...

  5. UINavigationBar的系统渲染方式

    昨天想手工实现一下类知乎日报的Navigation Bar的动态颜色改变,但不管怎么设置Navigation Bar的 backgroundColor barTintColor alpha參数都达不到 ...

  6. 面试基础_03实现strcpy、strcat、strcmp、strlen

    实现代码例如以下: /************************************************************************* > File Name: ...

  7. vue7 下拉列表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. mysql简单优化思路

    mysql简单优化思路 作为开发人员,数据库知识掌握的可能不是很深入,但是一些基本的技能还是要有时间学习一下的.作为一个数据库菜鸟,厚着脸皮来总结一下 mysql 的基本的不能再基本的优化方法. 为了 ...

  9. OPENCV(2) —— Basic Structures(二)

    Mat OpenCV C++ n-dimensional dense array class The class Mat represents an n-dimensional dense numer ...

  10. Ubuntu16.04进入挂起或休眠状态时按任何键都无法唤醒问题解决办法

    挂起(待机)计算机将目前的运行状态等数据存放在内存,关闭硬盘.外设等设备,进入等待状态.此时内存仍然需要电力维持其数据,但整机耗电很少.恢复时计算机从内存读 出数据,回到挂起前的状态,恢复速度较快.一 ...