ES6基础教程(整理自阮一峰)
------------------------
ECMAScript 6 简介
------------------------
ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现
另外 ECMAScript 方言还有 Jscript 和 ActionScript
ES6 = ES2015
查看node支持的es6特性:
$ node --v8-options | grep harmony
查看自己浏览器对es6的支持:
http://ruanyf.github.io/es-checker/
Babel / Traceur 转码器:
~
------------------------
let / const
------------------------
1. let用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效
{
let a = 10;
var b = 1;
}
a // ReferenceError: a is not defined.
b // 1
2. for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
// abc
// abc
// abc
3. let所声明的变量一定要在声明后使用, 否则报错
console.log(bar); // 报错ReferenceError
let bar = 2;
4. 暂时性死区: 跟上一种情况相似, 必须先声明后使用
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
5.
var x = x;// 不报错
let x = x;// 报错
6. typeof不再安全: 所以使用变量之前记得要先声明
typeof x; // ReferenceError
let x;
7. 不允许重复声明
function func(arg) {
let arg; // 报错
}
8. 块级作用域不返回值, 怎么办: 加上do,使它变为do表达式
变量x会得到整个块级作用域的返回值(t * t + 1)
let x = do {
let t = f();
t * t + 1;
};
9. 与顶层对象脱钩
var a = 1;
window.a // 1
let b = 1;
window.b // undefined
10. const: 与let类似, 区别是一旦声明,常量的值就不能改变
------------------------
变量的解构赋值
------------------------
1. 解构: 按照一定模式,从数组和对象中提取值,对变量进行赋值
let [a, b, c] = [1, 2, 3];//完全解构成功
let [bar, foo] = [1];//部分解构不成功, foo的值是: undefined
let [a, [b], d] = [1, [2, 3], 4];//不完全解构, a 1, b 2, d 4
2. 如果等号的右边不是可遍历的结构,那将会报错
let [foo] = null; // 报错
let [foo] = {}; // 报错
3. set结构, 也可以赋值
let [x, y, z] = new Set(['a', 'b', 'c']);
4. 默认值
let [foo = true] = [];
foo // true
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
let [x = 1] = [null]; //x的值是null, 只能用undefined
let [x = 1, y = x] = [2]; // x=2, y=2
let [x = y, y = 1] = []; // ReferenceError
5. 对象的解构赋值
5.1 变量必须与属性同名,才能取到正确的值
let { bar, foo } = { foo: "aaa", bar: "bbb" };
let { baz } = { foo: "aaa", bar: "bbb" }; //baz的值是undefined
5.2 如果变量名与属性名不一致: foo是匹配的模式,baz才是变量
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
5.3 还支持对象赋值, 嵌套赋值: ~
6. 字符串的解构赋值
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
let {length : len} = 'hello';
len // 5
7. 数值和布尔值的解构赋值
let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。
let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError
8. 函数参数的解构赋值
function move({x = 0, y = 0} = {}) {
return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
------------------------
字符串的扩展
------------------------
1. unicode表示法: 只要将码点放入大括号,就能正确解读该字符
"\u{20BB7}" //7
2. codePointAt: 返回的是码点的十进制值
如果想要十六进制的值,可以使用toString方法转换一下。
let s = '
ES6基础教程(整理自阮一峰)的更多相关文章
- ES6自我总结笔记(阮一峰ES6入门)
[let和const命令] 1.var的作用域是函数体内,不是块级作用域 2.let是更完美的var,let的变量的作用是块级作用域 3.let声明的全局变量不是全局对象属性,不可以通过window. ...
- ES6基础教程一 学习笔记
一.变量的声明 1.var 声明全局变量 在ES6中var用来声明全局变量. 2.let 声明局部变量 3.const 声明常量 二.变量的解构赋值 //1.数组赋值 let [a,b,c]=[1,2 ...
- 《ES6基础教程》之 map、forEach、filter indexOf 用法
1,map,对数组的每个元素进行一定操作,返回一个新的数组. var oldArr = [{first_name:"Colin",last_name:"Toh" ...
- 《ES6基础教程》之 Call 方法和 Apply 方法
<script type="text/javascript"> // Call方法: // 语法:call(thisObj[,arg1,arg2,...,argN]) ...
- DDOS 攻击的防范教程--转载自阮一峰的博客
一个多月前,我的个人网站遭受 DDOS 攻击,下线了50多个小时.这篇文章就来谈谈,如何应对这种攻击. 需要说明的是,我对 DDOS 并不精通,从没想过自己会成为攻击目标.攻击发生以后,很多素昧平生的 ...
- Make 命令教程 -- 阮一峰
摘自http://www.ruanyifeng.com/blog/2015/02/make.html Make 命令教程 作者: 阮一峰 日期: 2015年2月20日 代码变成可执行文件,叫做编译(c ...
- 转载自-阮一峰-测试框架 Mocha 实例教程
测试框架 Mocha 实例教程 作者: 阮一峰 日期: 2015年12月 3日 Mocha(发音"摩卡")诞生于2011年,是现在最流行的JavaScript测试框架之一,在浏 ...
- react 入门教程 阮一峰老师真的是榜样
- 转自阮一峰老师博客 React 入门实例教程 作者: 阮一峰 日期: 2015年3月31日 现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Nati ...
- 阮一峰:jQuery官方基础教程笔记
jQuery是目前使用最广泛的javascript函数库. 据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库.微软公司甚至把jQuery作为他们的官方库. 对于网页开发者来 ...
随机推荐
- Python下opencv使用笔记(十)(图像频域滤波与傅里叶变换)
前面以前介绍过空间域滤波,空间域滤波就是用各种模板直接与图像进行卷积运算,实现对图像的处理,这个方案直接对图像空间操作,操作简单.所以也是空间域滤波. 频域滤波说究竟终于可能是和空间域滤波实现相同的功 ...
- CentOS7.2内核版本查看简述
1.uname 命令 [root@bogon /]# uname --help 用法:uname [选项]... 输出一组系统信息.如果不跟随选项,则视为只附加-s 选项. -a, --all以如 ...
- TMS320F28335项目开发记录3_28335简介
28335特性介绍 高性能静态CMOS技术 高达150MHZ(6.67ns的周期时间):1.9V / 1.8内核 ,3.3V I/O设计 高性能32位CPU IEEE- ...
- MathType在手,公式不求人!
很多论文达人们的论文排版是相当漂亮的,页面也非常整齐美观,即使是理工类的论文,里面有很多的数学符号和公式,排版也是非常整洁,为什么达人们的公式论文能排版的这么完美,而自已却总是不得其门而入,最后只好救 ...
- swift学习笔记之---数组、字典、枚举、结构体
1.数组-Array let types = ["none","warning","error"] //省略类型的数组声明 let menb ...
- Linux下gcc编译生成动态链接库*.so文件并调用它(注:执行Test程序后无需用export 命令指定.so库文件路径:方法在文中下方;)
动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一 ...
- Effective C++ —— 定制new和delete(八)
STL容器所使用的heap内存是由容器所拥有的分配器对象管理,不是被new和delete直接管理.本章并不讨论STL分配器. 条款49 : 了解new-handler的行为 当operator new ...
- C++虚继承的概念[转]
C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类.这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数 ...
- 使用HttpClient以文件流的方式上传文件(非multipartFormData方式)
@Test public void testAdd() throws IOException { HttpPost post = new HttpPost("http://localhost ...
- 使用commons-email解析 eml文件
在对eml文件进行索引的时候需要先对其进行解析,提取出其中的收件人.发件人.文件内容和附件等信息 下边是解析eml文件的一个demo(在运行之前需要先导入mail.jar 和commons-email ...