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. ThinkPHP3.2.3快速入门:基础篇

    一.安装 thinkphp无需安装,只需将从官网上下载的压缩包解压后,把所有文件放到localhost根目录里就行了 二.压缩包中文件简述 :应用程序文件夹.自己所写的文件都放在这个文件夹里面 :公用 ...

  2. python SQL注入测试脚本(更新中)

    import requests import json import warnings warnings.filterwarnings("ignore") url = 'https ...

  3. 搭建一个redis高可用系统

    一.单个实例 当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行. 单个实例 二.备份 由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份( ...

  4. EasyPoi导入Excel

    EasyPoi的导出Excel功能和导入功能同样简单.我之前强调过,EasyPoi的原理本质就是Poi,正如MyBatis Plus的本质原理就是MyBatis. POI导入功能可以参考如下地址:ht ...

  5. oracle 导出空表问题

    select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0

  6. Spring自定义注解(验证身份证+性别+地区)

    第一步:定义注解 PersonFormId: package com.wbg.maven1128.demo_formatter; import java.lang.annotation.*; @Doc ...

  7. PAT——1016. 部分A+B

    正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6. 现给定A.DA.B.DB,请编 ...

  8. [转]Python中下划线以及命名空间的意义

    Python 用下划线作为变量前缀和后缀指定特殊变量/方法. 主要存在四种情形 1. 1. object # public    2. __object__ # special, python sys ...

  9. CSU - 2031 Barareh on Fire (两层bfs)

    传送门: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2031 Description The Barareh village is on f ...

  10. 使用jenkins配置.net mvc5网站自动构建全过程记录

    持续集成是个简单重复劳动,人来操作费时费力,使用自动化构建工具完成是最好不过的了.最终可以实现的一个效果是,svn提交代码,服务器端自动编译并发布. 所使用的版本:windows server 200 ...