从代码示例了解ECMAScript5新特性
1. strict模式
strict模式目前无人实现,但是按标准的说法strict模式是非strict的完全子集
strict模式究竟是什么意思?很多同学认为使用strict模式是强迫使用良好的代码风格,我的意见是strict不是良好风格的代码而是高效的代码。通过使用strict模式,编译器有了把变量优化成内存地址的能力。
具体限制为
eval中不再能声明变量,声明的函数将会变成全局的
var定义只能在函数级,if、for、while、switch等不能有var定义
不能使用with语句
不能使用arguments.callee
普通的函数调用中this是null
试图改变只读属性将会抛出异常
delete失败会抛出异常
arguments不再和形参绑定
函数不能有同名参数
使用的方法是用一个strict声明,这个声明是一个字符串表达式(为了兼容非strict模式),例如
strict声明只能是'use strict'和"use strict",包括转义、字符串断行在内的任何改动都不会被认为是strict声明
这里的strict声明导致代码全局变成strict模式,再无法使用非strict模式
数组变化不小,有一些用起来蛮顺手的扩展:
Array.prototype.indexOf, Array.prototype.lastIndexOf 正向查找和逆向查找,这个没什么好说的,看名字都知道是干什么的
Array的集合操作一直深得月同学喜爱,这下终于成了标准
Array.prototype.every:检查一个数组里所有元素都符合某个条件 数理逻辑中的任意符号 ∀(符号看不到的换宋体)
Array.prototype.some : 检查一个数组里是否存在元素符合某个条件 数理逻辑中的存在符号 ∃
Array.prototype.forEach : 这个就是普通的遍历了
Array.prototype.map : 对一个数组每一个元素执行函数,把所有返回值做为一个数组返回
Array.prototype.filter : filter从一个数组中选出符合条件的元素,不过并不改变原来的数组
迭代操作
Array.prototype.reduce 和Array.prototype.reduceRight 提供了迭代操作
想想吧,用Array.prototype.forEach怎么求一个数组的所有元素的和?无论如何,你都需要用到一个外部变量。而Array.prototype.reduce更适合一些
4.String.prototype.trim
这个就是方便了,去掉字符串两端空格
Object.create 可以以指定原型创建对象,效果大约等同于
function create(proto)
{
var klass = function(){} ;
klass.prototype = proto;
return new klass;
}
Object.create的第二个参数是附加在新对象上的属性,可参考第三条
有意思的是,我们终于可以创建一个原型链“干净”的对象了,不需要每个对象都继承Object.prototype
代码
7.属性操作
Object.getOwnPropertyNames可以获取一个对象所有属性名组成的数组,包括那些不可枚举的属性,这是以前for in的替代品
Object.defineProperty是新的定义属性的方式,比起之前直接赋值,我们可以更好地控制属性的可访问性、可枚举性,大家一直期待的getter和setter也在此实现,正式成为标准:
一个只读属性的例子:
一个getter和setter的例子
不能枚举的属性(以后扩展Array就不用心惊胆颤啦):
也可以用Object.getOwnPropertyDescriptor获取一个对象的属性的"属性"
还支持一次定义好多属性Object.defineProperties 不过用处不大
8. JSON支持
JSON对象类似Math,其实就是命名空间的作用,实际只有2个函数JSON.stringify和JSON.parse
Date对象也添加了一个相关方法toJSON,像Date.now()一样,它也只是个快捷的东西
strict模式目前无人实现,但是按标准的说法strict模式是非strict的完全子集
strict模式究竟是什么意思?很多同学认为使用strict模式是强迫使用良好的代码风格,我的意见是strict不是良好风格的代码而是高效的代码。通过使用strict模式,编译器有了把变量优化成内存地址的能力。
具体限制为
eval中不再能声明变量,声明的函数将会变成全局的
var定义只能在函数级,if、for、while、switch等不能有var定义
不能使用with语句
不能使用arguments.callee
普通的函数调用中this是null
试图改变只读属性将会抛出异常
delete失败会抛出异常
arguments不再和形参绑定
函数不能有同名参数
使用的方法是用一个strict声明,这个声明是一个字符串表达式(为了兼容非strict模式),例如
strict声明只能是'use strict'和"use strict",包括转义、字符串断行在内的任何改动都不会被认为是strict声明
'use strict';
eval("var a=1;")
alert(a);
eval("var a=1;")
alert(a);
strict也可以作用于函数级别, John Resig的建议很不错
// 非strict代码...
(function(){
"use strict";
// 用strict模式编写我们的库
})();
// 用户仍然可以自由使用非strict代码...
(function(){
"use strict";
// 用strict模式编写我们的库
})();
// 用户仍然可以自由使用非strict代码...
2. 数组
数组变化不小,有一些用起来蛮顺手的扩展:
Array.prototype.indexOf, Array.prototype.lastIndexOf 正向查找和逆向查找,这个没什么好说的,看名字都知道是干什么的
Array的集合操作一直深得月同学喜爱,这下终于成了标准
Array.prototype.every:检查一个数组里所有元素都符合某个条件 数理逻辑中的任意符号 ∀(符号看不到的换宋体)
Array.prototype.some : 检查一个数组里是否存在元素符合某个条件 数理逻辑中的存在符号 ∃
Array.prototype.forEach : 这个就是普通的遍历了
Array.prototype.map : 对一个数组每一个元素执行函数,把所有返回值做为一个数组返回
Array.prototype.filter : filter从一个数组中选出符合条件的元素,不过并不改变原来的数组
迭代操作
Array.prototype.reduce 和Array.prototype.reduceRight 提供了迭代操作
想想吧,用Array.prototype.forEach怎么求一个数组的所有元素的和?无论如何,你都需要用到一个外部变量。而Array.prototype.reduce更适合一些
3.Function.prototype.bind
对大多数JSer来说,Function.prototype.bind并不陌生了,这个prototype.js中的著名函数终于成为标准的一部分,并且有了更佳的内部实现方式。用法还是老样子4.String.prototype.trim
这个就是方便了,去掉字符串两端空格
alert(" 啦啦 ".trim());
5. Date.now()是一个新的函数,得到当前的time stamp
这个是一个非常小的变动 实际相当于new Date().getTime()6.原型式编程
Object.getPrototypeOf 可以获取一个对象的原型(注意,一个"对象"的原型,不是函数的prototype属性,即标准中所说的[[prototype]]) 这个函数的作用大致相当于SpiderMonkey的 __proto__属性,区别在于这个函数是低命名污染的,而且无法set
Object.create 可以以指定原型创建对象,效果大约等同于
function create(proto)
{
var klass = function(){} ;
klass.prototype = proto;
return new klass;
}
Object.create的第二个参数是附加在新对象上的属性,可参考第三条
有意思的是,我们终于可以创建一个原型链“干净”的对象了,不需要每个对象都继承Object.prototype
代码
7.属性操作
Object.getOwnPropertyNames可以获取一个对象所有属性名组成的数组,包括那些不可枚举的属性,这是以前for in的替代品
Object.defineProperty是新的定义属性的方式,比起之前直接赋值,我们可以更好地控制属性的可访问性、可枚举性,大家一直期待的getter和setter也在此实现,正式成为标准:
一个只读属性的例子:
一个getter和setter的例子
不能枚举的属性(以后扩展Array就不用心惊胆颤啦):
也可以用Object.getOwnPropertyDescriptor获取一个对象的属性的"属性"
还支持一次定义好多属性Object.defineProperties 不过用处不大
8. JSON支持
JSON对象类似Math,其实就是命名空间的作用,实际只有2个函数JSON.stringify和JSON.parse
Date对象也添加了一个相关方法toJSON,像Date.now()一样,它也只是个快捷的东西