ECMAScript5的新特性

[b]转载: [url]http://www.cnblogs.com/winter-cn/archive/2012/02/28/2371415.html[/url][/b]


[b]1. strict模式[/b]
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);
这里的strict声明导致代码全局变成strict模式,再无法使用非strict模式

strict也可以作用于函数级别, John Resig的建议很不错

// 非strict代码...
(function(){
"use strict";
// 用strict模式编写我们的库
})();
// 用户仍然可以自由使用非strict代码...



[b]2. 数组[/b]
数组变化不小,有一些用起来蛮顺手的扩展:
Array.prototype.indexOf, Array.prototype.lastIndexOf 正向查找和逆向查找,这个没什么好说的,看名字都知道是干什么的

Array的集合操作一直深得月同学喜爱,这下终于成了标准
Array.prototype.every:检查一个数组里所有元素都符合某个条件 数理逻辑中的任意符号 ∀(符号看不到的换宋体)


var arr = [2,9,4,5,3,7];
var greater5 = arr.every(function(e,i){return e>5}); //是否大于5
var smaller10 = arr.every(function(e,i){return e<10}); //是否小于10
alert([greater5,smaller10]);


Array.prototype.some : 检查一个数组里是否存在元素符合某个条件 数理逻辑中的存在符号 ∃

<script>
var arr = [2,9,4,5,3,7];
var smaller5 = arr.some(function(e,i){return e<5}); //是否小于5
var greater10 = arr.some(function(e,i){return e>10}); //是否大于10
alert([smaller5 ,greater10]);
</script>


Array.prototype.forEach : 这个就是普通的遍历了

Array.prototype.map : 对一个数组每一个元素执行函数,把所有返回值做为一个数组返回
<script>
var arr = [2,9,4,5,3,7];
var smaller5 = arr.map(function(e,i){return e<5}); //是否小于5
alert(smaller5);
</script>


Array.prototype.filter : filter从一个数组中选出符合条件的元素,不过并不改变原来的数组
<script>
var arr = [2,9,4,5,3,7];
var smaller5 = arr.filter(function(e,i){return e<5}); //是否小于5
alert(smaller5);
</script>


迭代操作
Array.prototype.reduce 和Array.prototype.reduceRight 提供了迭代操作
想想吧,用Array.prototype.forEach怎么求一个数组的所有元素的和?无论如何,你都需要用到一个外部变量。而Array.prototype.reduce更适合一些

<script>
var arr = [2,9,4,5,3,7];
var sum = arr.reduce(function(sum,e,i){return sum+e;}); //是否小于5
alert(sum);
</script>


[b] 3.Function.prototype.bind[/b]
对大多数JSer来说,Function.prototype.bind并不陌生了,这个prototype.js中的著名函数终于成为标准的一部分,并且有了更佳的内部实现方式。用法还是老样子
<script>
var f = function(){ return this.a + this.b}.bind({a:1,b:2});
alert(f());
</script>



[b]4.String.prototype.trim[/b]
这个就是方便了,去掉字符串两端空格

alert("  啦啦  ".trim());


[b]5. Date.now()是一个新的函数,得到当前的time stamp[/b]
这个是一个非常小的变动 实际相当于new Date().getTime()

<script>
alert([Date.now(),new Date().getTime()]);
</script>


[b]6.原型式编程 [/b]
Object.getPrototypeOf 可以获取一个对象的原型(注意,一个"对象"的原型,不是函数的prototype属性,即标准中所说的[[prototype]]) 这个函数的作用大致相当于SpiderMonkey的 __proto__属性,区别在于这个函数是低命名污染的,而且无法set

<script>
var klass = function() {}
klass.prototype = {a:10};

var obj = new klass();

var proto= Object.getPrototypeOf(obj)

alert(proto == klass.prototype);
alert(proto.hasOwnProperty("a"));
</script>


Object.create 可以以指定原型创建对象,效果大约等同于
function create(proto)
{
var klass = function(){} ;
klass.prototype = proto;
return new klass;
}


Object.create的第二个参数是附加在新对象上的属性,可参考第三条

有意思的是,我们终于可以创建一个原型链“干净”的对象了,不需要每个对象都继承Object.prototype

<script>
var obj=Object.create(null);
alert(obj.toString);
</script>



[b]7.属性操作[/b]
Object.getOwnPropertyNames可以获取一个对象所有属性名组成的数组,包括那些不可枚举的属性,这是以前for in的替代品

<script>
alert(Object.getOwnPropertyNames(Object));
</script>


Object.defineProperty是新的定义属性的方式,比起之前直接赋值,我们可以更好地控制属性的可访问性、可枚举性,大家一直期待的getter和setter也在此实现,正式成为标准:

一个只读属性的例子:
<script>
var obj = {a:1};
Object.defineProperty(obj,"b",{value: 42, writable: false, configurable: true})
alert(obj.b);
obj.b = 10; // 无效
alert(obj.b);
</script>



一个getter和setter的例子
<script>
var a=10,b;
var obj = {x:1};
Object.defineProperty(obj,"c",{get:function(){return a+b}, set:function(v){b=v}});
obj.c = 3;
alert(obj.c);
</script>



不能枚举的属性(以后扩展Array就不用心惊胆颤啦):
<script>
var obj = {a:1,c:3,d:4};
Object.defineProperty(obj,"b",{value: 42, writable: false, configurable: true, enumrable:false});
for(var p in obj)
{
alert(p);
}
</script>



也可以用Object.getOwnPropertyDescriptor获取一个对象的属性的"属性"
<script>
alert(JSON.stringify(Object.getOwnPropertyDescriptor([],"length")));
</script>



还支持一次定义好多属性Object.defineProperties 不过用处不大

[b]8. JSON支持[/b]
JSON对象类似Math,其实就是命名空间的作用,实际只有2个函数JSON.stringify和JSON.parse

<script>
var jsonStr = JSON.stringify({a:10});
alert(jsonStr);
var obj = JSON.parse("{\"a\":10}");
alert(obj.a);
</script>



Date对象也添加了一个相关方法toJSON,像Date.now()一样,它也只是个快捷的东西

<script>
alert([JSON.stringify(new Date),(new Date).toJSON()]);
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值