http://blog.thinkjs.net/archives/129
1. 简介
ECMAScript 5.1 (或仅 ES5) 是ECMAScript(基于JavaScript的规范)标准最新修正。 与HTML5规范进程本质类似,ES5通过对现有JavaScript方法添加语句和原生ECMAScript对象做合并实现标准化。
2. 浏览器支持
随着Opera 11.60的发布, 所有5大浏览器都支持ES5, 除了一些实现的bugs.
Opera 11.60 +
Internet Explorer 9+
Firefox 4+
Safari 5.1+
Chrome 13+
Safari 5.1 仍不支持Function.prototype.bind,想了解详细的信息可以查看Juriy Zaytsev很赞的 ECMAScript 5 兼容性表。
3. JSON
ES5提供一个全局的JSON对象,用来序列化(JSON.stringify)和反序列化(JSON.parse)对象为JSON格式。对于老的浏览器,可以考虑使用Douglas Crockford的json2.js, 可以让旧的浏览器实现同样的功能
JSON.parse(text [, reviver])
1
2
|
var
User = JSON.parse(
'{"age": 1, "name": "Colin"}'
);
alert(User.age)
//return "1"
|
如果你想确保解析的值是个整数,可以使用reviver方法
1
2
3
4
5
6
7
8
|
var
User = JSON.parse(
'{"age": 1, "name": "Colin"}'
,
function
(key, value){
if
(key ==
'age'
){
return
parseInt(value);
}
else
{
return
value;
}
})
alert(User.age)
// return 1
|
JSON.stringify(value [, replacer [, space]])
1
2
3
4
5
|
var
User = {
age:1,
name:
'Colin'
};
alert(JSON.stringify(User))
//return '{"age": 1, "name": "Colin"}'
|
如果我们需要改变值字符串化的方式,或是对我们选择的提供过滤,我们可以将其传给replacer函数。
1
2
3
4
5
6
7
8
9
10
11
12
|
var
User = {
age:1,
name:
'Colin'
};
var
s = JSON.stringify(User,
function
(key, value){
if
(key ==
'age'
) {
return
undefined;
}
else
{
return
value;
}
})
alert(s)
//return '{"name": "Colin"}'
|
4. 对象的扩展
ES5对Javascript中原生的Object做了一些扩展,有了这些方法我们能够更加方便的控制Javascript中的对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
//创建一个对象,并把该对象的[Prototype]设置为parentProto.同时可以一次性添加n多属性
Object.create(parentProto, properties);
// 获取参数对象的内部属性
Object.getPrototypeOf(o);
// 创建或修改现有对象属性
Object.defineProperty(o, propertyName, descriptor);
Object.defineProperties(o, properties);
// 获取对象属性的具体描述信息
Object.getOwnPropertyDescriptor(o, propertyName);
/*
把指定对象,设置为冻结状态,即使对象不可扩展.且所有自身独占属性都不可删除的同时,
如果任何一个属性是数据属性,则将该属性的[Writable]特性设置为false.
*/
Object.freeze(o);
//判断冻结状态
Object.isFrozen(o);
/*
就干一件事,把指定对象的内部属性[Extensible]设置为false,
使指定对象为不可扩展状态.
*/
Object.preventExtensions(o);
//检查指定对象是否是可扩展滴
Object.isExtensible(o);
/*
把指定对象,设置为密封状态.且所有自身独占属性都不可删除,
类似seal,freeze等方法操作特性时,是无视其属性原始的Configurable
设置,无论如何都有权限
*/
Object.seal(o);
//判断对象是否为密封状态
Object.isSealed(o);
//获取一个以指定对象,可枚举属性名作为元素值的数组对象
Object.keys(o);
//获取指定对象的所有自身独占属性名,包括不可枚举的.并返回一个数组
Object.getOwnPropertyNames(o);
|
5. 数组的扩展
ES5中新增了下面这些方法。
1
2
3
4
5
6
7
8
9
|
Array.prototype.indexOf
Array.prototype.lastIndexOf
Array.prototype.every
Array.prototype.some
Array.prototype.forEach
Array.prototype.map
Array.prototype.filter
Array.prototype.reduce
Array.prototype.reduceRight
|
6. 函数的扩展
Function.prototype.bind(thisArg [, arg1 [, arg2, …]])
Function.prototype.bind返回一个新的函数对象,该函数对象的this绑定到了thisArg参数上。从本质上讲,这允许你在其他对象链中执行一个函数。
1
2
3
4
5
6
7
8
9
|
var
user = {name:
'colin'
};
function
showName(){
alert(
this
.name)
}
var
fn = showName.bind(user);
fn();
//result 'colin';
/*
上面两行等同于 showName.call(user);
*/
|
7. 严格模式
严格模式给作者提供了选择一个限制性更强语言变种的方式——给作者提供额外的可靠性给用户提供额外的安全性。在JS文件或是函数的顶部添加”use strict”即可启用严格模式。因为”use strict”就是个字符串,因此其会被旧版浏览器安全地忽视。
1
2
3
4
5
6
7
8
|
function
strict(){
"use strict"
;
//...
}
function
sloppy(){
eval(
"window.foo = 'bar'"
);
}
|
在严格模式下运行脚本,不少导致提醒或buggy行为的事情会抛出错误,例如:
- 未声明的变量赋值抛出一个ReferenceError, 而不是创建一个全局变量。
- 不止一次对对象字面量分配相同的属性会抛出SyntaxError.
- 使用with语句抛出SyntaxError.
关于严格模式的详细信息你可以查看 MDSN的严格模式的文章
8. 参考资料