ECMA6学习笔记

参考资料

ECMAScript6入门:http://es6.ruanyifeng.com/

官方文档:https://babeljs.io/learn-es2015/

开发软件:WebStorm 开源地址:https://coding.net/u/chenxygx/p/CodeSave/git/tree/master/ECMAScript2015

npm install

Settings - Keymap : Main menu - Code - Reformat Code (配置格式化文件)

babel软件需要WebStorm配置一下

需要全局安装 babel,

npm install babel-preset-env --save-dev
npm install --save-dev babel-cli
npm install -g babel-cli
npm install --save-dev babel-plugin-transform-es2015-modules-commonjs

然后需要添加.babelrc文件,用来控制生成es2015

{
"presets": ["env"]
}

然后package.json添加build,script用来控制编译目录

"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "babel Script --watch --out-dir lib"
},

ES6声明变量的6种方式

ES5只有两种声明变量方式:var命令 和 function 命令。

ES6还有四种声明变量方式:let命令 、Const命令、import命令、class命令

let命令

用来声明变量,类似于var,声明的变量只在代码快({}表示代码块)内有效。并且不会受到变量提升的影响。

如果区块中存在let和const命令,就会形成封闭作用域,在声明之前使用变量就会报错。这种行为称为:暂时性死区

var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}

let不允许重复声明,不能在函数内部重新声明参数。有块级作用域,就不再需要 立即执行函数表达式(IIFE)了

Const命令

const声明一个只读的常量,一旦声明,常量就不能改变。必须在声明的同时,进行初始化。

const作用域和let命令相同。只在声明所在块级作用域内有效。

const变量也不会提升,同样存在 暂时性死区

const本质上是指变量指向的内存地址不得改动。但对象和数组是可以进行变动的。

const x = {};
x.prop = 1;
x = {};

上面代码,可以对x进行添加属性,但不能重新进行赋值改变地址。

如果想让对象或数组完全冻结,可以使用object.freeze方法。

const x = Object.freeze({ prop : 2 });
x.prop = 1;
console.log(x.prop); //

顶级对象

顶级对象在浏览器环境指 window对象,在node指的是global对象。

因为顶级对象在各种实现中不统一,一般使用this变量,但是会有一些局限性。

全局环境中,this会返回顶层对象。但是node模块和ES2015模块中,this返回的是当前模块。

函数里的this,如果不是作为对象运行,而是单纯的函数,this会指向顶层对象。

针对this指向,可以查看javascript知识点记录

综上所述,可以在两种情况下都获取顶层对象的方法有两种

// 方法一
!(function () {
(typeof window !== 'undefined'
? window
: (typeof process === 'object' &&
typeof require === 'function' &&
typeof global === 'object')
? global
: this);
this.a = 1;
})()
console.log(a); // 方法二
var getGlobal = function () {
if (typeof self !== 'undefined') { return self; }
if (typeof window !== 'undefined') { return window; }
if (typeof global !== 'undefined') { return global; }
throw new Error('unable to locate global object');
};
getGlobal().b = 2;
console.log(b);

数组的解构赋值

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

let [a,b,c] = [1,2,3]; console.log(a+b+c); // 6

上面代码表示,可以从数组中提取值,按照对应次序位置,对变量进行赋值。

如果解构不成功,变量的值就等于 undefined

let [foo, [[bar], baz]] = [1, [[2], 3]];
foo //
bar //
baz // let [ , , third] = ["foo", "bar", "baz"];
third // "baz" let [x, , y] = [1, 2, 3];
x //
y // let [head, ...tail] = [1, 2, 3, 4];
head //
tail // [2, 3, 4] let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []

对象的解构赋值

对象的解构变量必须与属性同名,才可以取到值。次序不一致是没有影响的,如取不到值返回undefined

let { bar, foo } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb" let { baz } = { foo: "aaa", bar: "bbb" };
baz // undefined

如果希望变量名与属性名不一致,必须写成下面这样。此时foo 和 bar是匹配模式,f是变量。

let { foo: f, bar: b } = { foo: "aaa", bar: "bbb" };

采用解构的写法,变量不能重新声明,所以如果有赋值的变量重新声明就会报错。

解构也可以用于嵌套结构的对象。此时p是模式不会赋值

let obj = {
p: [
'Hello',
{ y: 'World' }
]
}; let { p: [x, { y }] } = obj;
x // "Hello"
y // "World"

对于结构嵌套对象,也是同样的操作。

var node = {
loc: {
start: {
line: 1,
column: 5
}
}
};
let { loc:{start:{line:l,column:c}} } = node;
console.log(l + c);
let obj = {};
let arr = [];
({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar: true });
obj // {prop:123}
arr // [true]

对象的解构也可以设定默认值,使用 = 可以在目标值的属性等于undefined的时候,进行赋初始化值

var {x = 3} = {};
x // var {x, y = 5} = {x: 1};
x //
y // var {x:y = 3} = {};
y // var {x:y = 3} = {x: 5};
y // var { message: msg = 'Something went wrong' } = {};
msg // "Something went wrong"

如果要使用一个已经声明的变量,需要将内容嵌套在一个大括号里,告诉js不当做代码段处理

let x;
({x} = {x: 1});

字符串的解构赋值

字符串也可以进行解构,将字符串拆分成数组对象。

const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
let {length : len} = 'hello';
len //

数值和布尔值的解构赋值

如果等号右边是数值或布尔值,则会转换为对象。也就是说赋值的变量与等号右边类型相同。

赋值的规则是只要右边不是对象和数组,就会转换成对象。undefined和null是无法进行赋值的。

let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError

函数参数的解构赋值

函数的参数也可以进行解构赋值,并且可以使用默认值。

function move({x = 0, y = 0} = {}) {
return [x, y];
} move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]

但是注意,如果

move({x, y} = { x: 0, y: 0 })

则不会给参数赋默认值,因为上面代码是给函数的参数给默认值,而不是给变量赋默认值。

move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, undefined]
move({}); // [undefined, undefined]
move(); // [0, 0]

undefined也会触发函数参数的默认值。

[1, undefined, 3].map((x = 'yes') => x);
// [ 1, 'yes', 3 ]

圆括号问题

ES6的规则是,只要有可能导致解构的歧义,就不得使用圆括号。

可以使用圆括号的只有一种场景:赋值语句的非模式部分。

[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确

实际用途

1. 交换两个变量的值

let [x,y] = [1,2];
[x,y] = [y,x];
console.log(x+","+y); // 2,1

2. 从函数返回多个值

// 返回数组
function example() {
return [1,2,3];
}
let [a,b,c] = example(); // 1,2,3 // 返回对象
function exampleObj(){
return{
foo:1,
bar:2
}
}
let{foo,bar} = exampleObj(); // 1,2

3. 函数参数的定义,可以将一组参数与变量名对应起来。

// 参数数组
function f([a,b,c]) {
console.log(a+","+b+","+c);
}
f([1,2,3]); // 参数对象
function ff({a,b,c}){
console.log(a+","+b+","+c);
}
ff({a:1,b:2,c:3});

4. 提取JSON数据

let jsonData = {
"Name":"A",
"Old":12
}
let {Name,Old} = jsonData;
console.log(Name+Old);

5. 函数参数的默认值

jQuery.ajax = function (url, {
async = true,
beforeSend = function () {},
cache = true,
complete = function () {},
crossDomain = false,
global = true,
// ... more config
}) {
// ... do stuff
};

6. 遍历Map结构

var map = new Map();
map.set('first', 'hello');
map.set('second', 'world'); for (let [key, value] of map) {
console.log(key + " is " + value);
}
//仅获取键 let[key]
//仅获取值 let[,value]

7. 输入模块的指定方法

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

字符串的Unicode表示法

Js允许使用\uxxxxx形式表示一个字符,其中xxx表示字符的Unicode码点

单一码点只能在\u0000-\uffff之间。如果超过这个范围需要使用两个字符。

ES6对此进行了改进,只要将码点放进大括号,就能正确解读该字符。

"\u{20BB7}"
// "

ES2015学习笔记的更多相关文章

  1. VueJs 学习笔记

    VueJs学习笔记 参考资料:https://cn.vuejs.org/ 特效库:TweenJS(补间动画库)  VelocityJS(轻量级JS动画库) Animate.css(CSS预设动画库) ...

  2. Webpack新手入门教程(学习笔记)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...

  3. React学习笔记--程序调试

    React学习笔记 二 程序调试   前面我们搭建好了React的基本开发环境,可以编写基本的React js程序了.但完成的开发环境肯定包含调试器,怎么调试用React编写的JS程序呢?有浏览器,比 ...

  4. vue.js 学习笔记3——TypeScript

    目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...

  5. vue 学习笔记(二)

    最近公司赶项目,一直也没时间看 vue,之前看下的都快忘得差不多了.哈哈哈,来一起回顾一下vue 学习笔记(一)后,继续向下看嘛. #表单输入绑定 基础用法 v-model 会忽略所有表单元素的 va ...

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

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

  7. Angular快速学习笔记(2) -- 架构

    0. angular 与angular js angular 1.0 google改名为Angular js 新版本的,2.0以上的,继续叫angular,但是除了名字还叫angular,已经是一个全 ...

  8. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别

    JavaScript:学习笔记(7)——VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ...

  9. Webpack4 学习笔记三 ES6+语法降级为ES5

    前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 Webpack 将es6.es7语法降级为es5 需要通过 babel JavaScript编译器. 安装: npm i babel ...

随机推荐

  1. ZOJ Monthly, January 2019 Little Sub and Isomorphism Sequences 【离线离散化 + set + multiset】

    传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5868 Little Sub and Isomorphism Seque ...

  2. Kali-linux基本设置

    1.6.1 启动默认的服务 Kali Linux自带了几个网络服务,它们是非常有用的.但是默认是禁用的.在这里,将介绍使用各种方法设置并启动每个服务. 1. 启动Apache服务 启动Apache服务 ...

  3. 快速理解Event事件

    浏览器事件是所有web程序的核心.javascript与HTML之间的交互是通过事件实现的.通过这些事件我们定义将要发生的行为.事件是一种异步编程的实现方式,本质上是程序各个组成部分之间的通信. 1. ...

  4. stack的三个意思

    (转自阮一峰的网络日志,原网址http://www.ruanyifeng.com/blog/2013/11/stack.html) 阮一峰老师终于又更新博客了,个人认为这篇文章有一定科普意义,有一定解 ...

  5. python调用对象属性出错:AttributeError: 'function' object has no attribute '_name_'

    出错如下图所示: 原来是因为把__name__写成_name_, 下图为正确结果:

  6. 数据库——MySQL——索引——索引原理及B+树

    索引原理 我们使用索引,就是为了提高查询的效率,如同查书一样,先找到章,再找到章中对于的小节,再找到具体的页码,再到我们需要的内容. 事实上索引的本质就是不断缩小获取数据的筛选范围,找出我们想要的结果 ...

  7. GoBelieve UseID及ImID方案

    GoBelieve: imId = (appid + uid) IM 服务器用(appid + uid)imid做用户的唯一标示 imid是IM平台上沟通的凭证 客户端请求联系人列表后,会有对应uid ...

  8. 使用第三方库iOS-ECharts做柱状图的心得

    最近的项目里面用到了饼图和条形统计图,饼图用的是PNChart来做的,这个库感觉用起来也简单,但是做条形统计图的时候就特别蛋疼(不知道是不是我姿势没对),反正就是各种问题,然后就想到换一种框架,最后选 ...

  9. 【C++ Primer】读书笔记_第一章

    Main(): 1. C++程序必须包含main()函数,操作系统通过调用main来运行C++程序. 2. main()的形参可以为空. 3. main函数的返回类型必须为int,返回给操作系统.in ...

  10. sublime text3配置python开发环境(windows版)

    安装阶段: sublime text3的安装: 下载网址:https://www.sublimetext.com/ 下载完成后 ,点击安装即可. 安装Package Control: 点击 Tools ...