《JavaScript高级程序设计》笔记:附录A ECMAScript Harmony
一般性变化
常量
用const关键字声明常量,声明的变量在初始赋值后,就不能进行修改了,如下代码:
const MAX_SIZE = 25;
MAX_SIZE = 10; //报错
块级作用域及其他作用域
for(let i = 0; i < 10; i++){
//执行某些操作
}
console.log(i); //错误! i is not defined
函数
剩余参数与分布参数
剩余参数的语法是三个点后跟一个标识符,如下例子:
function sum (num1, num2, ...nums){
var result = num1 + num2;
for(let i = 0, len = nums.length; i < len; i++){
result += nums[i];
}
return result;
}
var result = sum(1,2,3,4,5,6);
console.log(result); //
分布参数:可以向函数中传入一个数组,然后数组中的元素会映射到函数的每个参数上。如下代码:
var result = sum(...[1,2,3,4,5,6]);
以上代码跟下面等价:
var result = sum.apply(this,[1,2,3,4,5,6]);
默认参数值
要为参数指定默认值,可以在参数名后面直接加上等于号和默认值,如下代码:
function sum(num1,num2 =2){
return num1 + num2;
}
var result1 = sum(5);
var result2 = sum(5,5);
console.log(result1,result2); //7,10
生成器
所谓生成器,其实就是一个对象,它每次能生成一系列值中的一个。要创建生成器,可以让函数通过yield操作符返回某个特殊的值。对于使用yield操作符返回值的函数,调用它时就会创建并返回一个新的Generator实例。然后在这个实例上调用next()方法就能取得生成器的第一个值。此时,执行的是原来的函数,但执行流到yield语句就会停止,只返回特定的值。从这个角度看,yield和return很相似。如果再次调用next()方法,原来函数中位于yield语句后的代码会继续执行,知道再次遇见yield语句时停止执行,此时再返回一个新值,如下代码:
function* myNumbers(){
for(var i =0 ; i < 10; i++){
yield i * 2;
}
}
var generator = myNumbers();
try{
while(true){
document.write(generator.next() + "<br/>")
}
}catch(ex){
//有意没有写代码
}finally{
generator.close();
}
执行上面代码浏览器卡死。来看下面例子:
function* a(){
console.log(11)
yield 'kevin';
console.log(22);
yield 'ivan';
console.log(33);
yield 'wuhan';
return 'yes';
}
var b = a();
console.log(b.next())
console.log(b.next())
console.log(b.next())
console.log(b.next())
结果:
//打印结果:
11
Object { value: "kevin", done: false }
22
Object { value: "ivan", done: false }
33
Object { value: "wuhan", done: false }
Object { value: "yes", done: true }
在需要一系列值,而每一个值又与前一个值存在某种关系的情况下,可以使用生成器。
数组及其他结构
迭代器
普通的对象并没有内置的@@iterator。当然,你也可以给任何想遍历的对象定义@@iterator,如下代码:
var myObject = {
a:2,
b:3
};
Object.defineProperty(myObject,Symbol.iterator,{
enumerable:false,
writable:false,
configurable:true,
value:function(){
var o = this,
idx = 0,
ks = Object.keys(o);
return {
next:function(){
return {
value:o[ks[idx++]],
done:(idx > ks.length)
}
}
}
}
});
//手动遍历myObject
var it = myObject[Symbol.iterator]();
var next1 = it.next();
var next2 = it.next();
var next3 = it.next();
console.log(next1); //{value: 2, done: false}
console.log(next2); //{value: 3, done: false}
console.log(next3); //{value: undefined, done: true}
//用for...of遍历myObject
for(var v of myObject){
console.log(v);
}
//
//
注:我们使用Object.defineProperty()定义了我们自己的@@iterator(主要是为了让它不可枚举),不过注意,我们把符号当做可计算属性名。此外,也可以直接在定义对象时进行声明,比如:
var myObject = {
a:2,
b:3,
[Symbol.iterator]:function(){
/*..*/
}
};
为数组创建迭代器,如下代码:
var colors = ["red","green","blue"];
var iterator = colors[Symbol.iterator]();
console.log(iterator.next()); //{value: "red", done: false}
console.log(iterator.next()); //{value: "green", done: false}
console.log(iterator.next()); //{value: "blue", done: false}
console.log(iterator.next()); //{value: undefined, done: true}
数组领悟
所谓数组领悟,指的是用一组符合某个条件的值来初始化数组。JS中数组领悟的基本形式:
array = [value for each (variable in values) condition];
其中,value是实际会包含在数组中的值,它源自values数组。for each结构会循环values中的每一个值,并将每个值保存在变量variable中,如果保存在variable中的值符合condition条件,就会将这个值添加到结果数组中,如下例子:
var numbers = [0,1,2,3,4,5,6,7,8,9,10]; //把所有元素复制到新数组
var duplicate = [i for each (i in numbers)]; //只把偶数复制到新数组
var evens = [i for each (i in numbers) if (i % 2 == 0)]; //把每个数乘以2后的结果放到新数组中
var doubled = [i*2 for each (i in numbers)]; //把每个奇数乘以3后的结果放到新数组中
var tripledOdds = [i*3 for each (i in numbers) if (i %2 > 0)];
firefox2+是唯一支持数组领悟的浏览器。而且要使用这个功能,必须将<script>的type属性值指定为“application/javascript;version=1.7”
解构赋值
var [name,value] = ["color","red"];
console.log(name,value); //color red var [,value] = ["color","red"];
console.log(value); //red var person = {
name:"Nice",
age:29
};
var {name:personName,age:personAge} = person;
console.log(personName,personAge); //Nice 29
新对象类型
Harmony为JS定义了几个新的对象类型。
代理对象
要创建代理对象,可以使用Proxy.create()方法,传入一个handler(处理程序)对象和一个可选的prototype()原型对象。
var proxy = Proxy.create(handler); //创建一个以myOjbect为原型的代理对象
var proxy = Proxy.create(handler,myObject);
待续
《JavaScript高级程序设计》笔记:附录A ECMAScript Harmony的更多相关文章
- javascript高级程序设计--笔记01
概述 JavaScript的实现包含三个部分: 1 核心(ECMAScript) 提供核心语言功能 2 文档对象模型(DOM) 一套提供了访问以及操作网页内容的API 3 浏览器对象模型( ...
- JavaScript高级程序设计笔记(一)
---恢复内容开始--- 前三章为基础知识,为了方便以后查看,所以比较啰嗦.这里对函数的基本操作没有记录. 1.JavaScript的实现 虽然 JavaScript 和 ECMAScript 通常都 ...
- JavaScript高级程序设计笔记之面向对象
说起面向对象,大部分程序员首先会想到 类 .通过类可以创建许多具有共同属性以及方法的实例或者说对象.但是JavaScript并没有类的概念,而且在JavaScript中几乎一切皆对象,问题来了,Jav ...
- <javascript高级程序设计>笔记
1.要讲一个值转换成其对应的Boolean类型 ,可以调用转型函数Boolean(). var message=“hello world!”; var messageAsBoolean=Boolean ...
- javascript事件小结(事件处理程序方式)--javascript高级程序设计笔记
1.事件流:描述的是从页面中接收事件的顺序. 2.事件冒泡:IE的事件流叫做事件冒泡,即事件开始从具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到不具体的节点(文档). 3.事件捕获 ...
- javaScript高级程序设计笔记 1
核心 ECMAScript 文档对象模型 DOM 浏览器对象模型 BOM 延迟脚本 defer typeof操作符 判断字符类型 返回 undefined boolean s ...
- JavaScript高级程序设计笔记 事件冒泡和事件捕获
1.事件冒泡 要理解事件冒泡,就得先知道事件流.事件流描述的是从页面接收事件的顺序,比如如下的代码: <body> <div> click me! </div> & ...
- javaScript高级程序设计笔记 2
Undefinde Null Boolean Number String 基本类型 Object 引用类型 只有引用类型才能动态的添加属性 赋值基本类型和引用类型也不相同,复制的基本类型的 ...
- Javascript高级程序设计笔记 <第五章> 引用类型
一.object类型 创建object实例的方式有两种: //第一种使用new操作符跟构造函数 var person= new Object(); person.name="小王" ...
- Javascript高级程序设计笔记(很重要尤其是对象的设计模式与继承)
var obj = {'a':'a'}; var fun = function (){} console.log(typeof obj);//object console.log(typeof fun ...
随机推荐
- 一个小问题 关于 com.mysql.jdbc.PacketTooBigException: Packet for query is too large
这个错本身就是应为传输的数据大于mysql的max_allowed_packet参数默认值造成的: 之前遇到这个问题,一直是改max_allowed_packet的值 ,做项目遇到这个错误改了好几次, ...
- dos下编辑过sh脚本后无法运行
情景: 同样的的脚本,在不同的机器下运行有的可以成功,有的运行失败, 前提:sh脚本windos下编辑过. 脚本在windows上修改之后,在每行尾部多了个 ^M,导致sh脚本在执行的时候可能shba ...
- Python实现电子词典(web)
思路: 准备配置文件setting.py,运行src/data.py,使用MySQL新建数据库并创建table,将字典数据导入到table中.编写server.py文件,建立服务端,循环接收web请求 ...
- docker 创建私有镜像之 registry
一.下载 registry 镜像 [root@localhost ~]# docker pull registry Using default tag: latest latest: Pulling ...
- GitHub 上传文件过大报错:remote: error: GH001: Large files detected.
1.查看哪个文件过大了 报错信息: remote: Resolving deltas: 100% (24/24), completed with 3 local objects. remote: wa ...
- 自动签发https证书工具 cert manager
最近cert manager进行升级,不再支持0.11以下的版本了,所以进行升级.但是发现不能直接通过更改镜像版本来升级,在Apps里的版本也是旧版本,部署后发现不支持,于是自已动手,根据文档整理了一 ...
- 2018-2019-2 20165315《网络对抗技术》Exp9 Web安全基础
2018-2019-2 20165315<网络对抗技术>Exp9 Web安全基础 目录 一.实验内容 二.实验步骤 1.Webgoat前期准备 2.SQL注入攻击 Command Inje ...
- Mysql 查看连接数,状态 最大并发数,以及设置连接数
show variables like '%max_connections%'; 查看最大连接数 set global max_connections=1000 重新设置最大连接数 set-vari ...
- 使用软件FileZilla, 通过sftp协议实现windows与linux系统传输文件
前提: windows 7 /windows8 / windows 10系统已安装FileZilla软件: 我们还有一个Linux系统,系统上安装了ssh服务,并且开放了22端口. 操作: 1.打开软 ...
- Nginx配置反向代理支持WebSocket
http { #WebSocket代理配置 map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { ...