ECMAScript 5.1 学习笔记

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行为的事情会抛出错误,例如:

  1. 未声明的变量赋值抛出一个ReferenceError, 而不是创建一个全局变量。
  2. 不止一次对对象字面量分配相同的属性会抛出SyntaxError.
  3. 使用with语句抛出SyntaxError.

关于严格模式的详细信息你可以查看 MDSN的严格模式的文章

8. 参考资料




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值