From 5508f2dc649aa88af60c148d31edaff6225644c6 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Thu, 24 Apr 2014 18:37:03 +0800 Subject: [PATCH] add docs/let --- docs/let.md | 147 ++++++++++++++++++++++++++++++++++++++++++++++ docs/object.md | 51 ++++++++++++++++ docs/reference.md | 1 + sidebar.md | 2 + 4 files changed, 201 insertions(+) create mode 100644 docs/let.md create mode 100644 docs/object.md diff --git a/docs/let.md b/docs/let.md new file mode 100644 index 0000000..ced3228 --- /dev/null +++ b/docs/let.md @@ -0,0 +1,147 @@ +# let和const命令 + +## let命令概述 + +ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 + +```javascript + +{ + let a = 10; + var b = 1; +} + +a // ReferenceError: a is not defined. +b //1 + +``` + +上面代码在代码块之中,分别用let和var声明了两个变量。然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。 + +下面的代码如果使用var,最后输出的是9。 + +```javascript + +var a = []; +for (var i = 0; i < 10; i++) { + var c = i; + a[i] = function () { + console.log(c); + }; +} +a[6](); // 9 + +``` + +如果使用let,声明的变量仅在块级作用域内有效,最后输出的是6。 + +```javascript + +var a = []; +for (var i = 0; i < 10; i++) { + let c = i; + a[i] = function () { + console.log(c); + }; +} +a[6](); // 6 + +``` + +注意,let不允许在相同作用域内,重复声明同一个变量。 + +```javascript + +// 报错 +{ + let a = 10; + var a = 1; +} + +// 报错 +{ + let a = 10; + let a = 1; +} + +``` + +## 块级作用域 + +let实际上为JavaScript新增了块级作用域。 + +```javascript + +function f1() { + let n = 5; + if (true) { + let n = 10; + } + console.log(n); // 5 +} + +``` + +上面的函数有两个代码块,都声明了变量n,运行后输出5。这表示外层代码块不受内层代码块的影响。如果使用var定义变量n,最后输出的值就是10。 + +块级作用域的出现,实际上使得获得广泛应用的立即执行函数(IIFE)不再必要了。 + +```javascript + +// IIFE写法 +(function () { + var tmp = ...; + ... +}()); + +// 块级作用域写法 +{ + let tmp = ...; + ... +} + +``` + +## const命令 + +const也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变。 + +```javascript + +const PI = 3.1415; +PI // 3.1415 + +PI = 3; +PI // 3.1415 + +const PI = 3.1; +PI // 3.1415 + +``` + +上面代码表明改变常量的值是不起作用的。需要注意的是,对常量重新赋值不会报错,只会默默地失败。 + +const的作用域与let命令相同:只在声明所在的块级作用域内有效。 + +```javascript + +if (condition) { + const MAX = 5; +} + +// 常量MAX在此处不可得 + +``` + +const声明的常量,也与let一样不可重复声明。 + +```javascript + +var message = "Hello!"; +let age = 25; + +// 以下两行都会报错 +const message = "Goodbye!"; +const age = 30; + +``` diff --git a/docs/object.md b/docs/object.md new file mode 100644 index 0000000..5e9062d --- /dev/null +++ b/docs/object.md @@ -0,0 +1,51 @@ +# 对象和函数的扩展 + +## Object.is() + +Object.is()用来比较两个值是否严格相等。它与严格比较运算符(===)的行为基本一致,不同之处只有两个:一是+0不等于-0,二是NaN等于自身。 + +```javascript + ++0 === -0 //true +NaN === NaN // false + +Object.is(+0, -0) // false +Object.is(NaN, NaN) // true + +``` + +## 增强的对象写法 + +ES6允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。 + +```javascript + +var Person = { + + name: '张三', + + //等同于birth: birth + birth, + + // 等同于hello: function ()... + hello() { console.log('我的名字是', this.name); } + +}; + +``` + +## 函数参数的默认值 + +ES6允许为函数的参数设置默认值。 + +```javascript + +function Point(x = 0, y = 0) { + this.x = x; + this.y = y; +} + +var p = new Point(); +// p = { x:0, y:0 } + +``` diff --git a/docs/reference.md b/docs/reference.md index 5ad5c6d..63c831c 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -6,6 +6,7 @@ - Ariya Hidayat, [Toward Modern Web Apps with ECMAScript 6](http://www.sencha.com/blog/toward-modern-web-apps-with-ecmascript-6/) - Dale Schouten, [10 Ecmascript-6 tricks you can perform right now](http://html5hub.com/10-ecmascript-6-tricks-you-can-perform-right-now/) - Domenic Denicola, [ES6: The Awesome Parts](http://www.slideshare.net/domenicdenicola/es6-the-awesome-parts) +- Nicholas C. Zakas, [Understanding ECMAScript 6](https://github.com/nzakas/understandinges6) - Luke Hoban, [ES6 features](https://github.com/lukehoban/es6features) ## 语法点 diff --git a/sidebar.md b/sidebar.md index 8eb35f1..fd5d89b 100644 --- a/sidebar.md +++ b/sidebar.md @@ -7,7 +7,9 @@ ## 目录 - [前言](#README) - [ECMAScript 6简介](#docs/intro) +- [let和const命令](#docs/let) - [字符串的扩展](#docs/string) +- [对象和函数的扩展](#docs/object) - [箭头函数](#docs/arrow) - [Iterator和for...of循环](#docs/iterator) - [Generator函数](#docs/generator)