`
rayln
  • 浏览: 434203 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ECMAScript5的新特性

 
阅读更多
转载: http://www.cnblogs.com/winter-cn/archive/2012/02/28/2371415.html


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声明
'use strict';
eval("var a=1;")
alert(a);
这里的strict声明导致代码全局变成strict模式,再无法使用非strict模式

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

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



2. 数组
数组变化不小,有一些用起来蛮顺手的扩展:
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>


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



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

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


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

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


6.原型式编程
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>





7.属性操作
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 不过用处不大

8. JSON支持
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>
分享到:
评论

相关推荐

    JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性

    ECMAScript 5(简称ES5)是ECMAScript的一个重要版本,带来了许多新特性,这些新特性在《JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性》中被详细讨论。 ES5相对于之前版本,如ECMAScript 3(简称...

    ECMAScript 6新特性

    本人看过《深入浅出ES6》后把一百多页去除水分,总结成十来页的文档,方便快速入门。

    ECMAscript常用新特性积累1

    随着技术的发展,新的版本不断推出,引入了许多创新特性和改进。以下是一些在ES5、ES6(也称为ES2015)以及ES7(ES2016)中的常见新特性: 1. **保留关键字**:在ES5中,有一些保留关键字如`catch`,不能用作变量名...

    JavaScript权威指南-ECMAScript5.pdf

    12. **ECMAScript5**:ECMAScript是JavaScript的标准,第五版引入了严格模式、对象字面量的改进、JSON支持、函数绑定、数组和对象的新方法等特性。 13. **函数式编程**:虽然JavaScript并非纯函数式语言,但其支持...

    ECMAScript全套(5,6,2018).zip

    本压缩包包含的是ECMAScript的三个重要版本:ECMAScript 5(ES5)、ECMAScript 6(ES6,也称为ES2015)以及ECMAScript 2018(ES2018)。这些版本在JavaScript的发展历程中扮演了关键角色,引入了许多新的特性和改进...

    ECMAScript6 新特性范例大全

    ECMAScript6,也称为ES2015,是JavaScript语言的一个重要版本更新,引入了许多新的特性和语法改进,使得代码更加简洁、易读。以下是一些关键的新特性及其范例: 1. **箭头函数**: 箭头函数提供了一种更简洁的函数...

    ECMAScript-Edition5-小试

    ### ECMAScript 5 版本特性解析 #### 引言 随着互联网技术的迅猛发展,JavaScript 作为一种广泛应用于浏览器端的脚本语言,其重要性日益凸显。为了更好地满足开发者的实际需求并提高编程效率,ECMAScript 第五版...

    浅谈ECMAScript6新特性之let、const

    ECMAScript 6,简称ES6,是JavaScript语言的一个重要版本更新,引入了许多新的特性和语法改进。本文将深入探讨其中两个关键特性:`let` 和 `const`。 `let` 是ES6中用于声明变量的新关键字,它解决了在ES5中`var`...

    ESLint:ESLint规则详解:ECMAScript6+特性.docx

    ESLint:ESLint规则详解:ECMAScript6+特性.docx

    ECMAScript Second Edition javascript新特性2018年7月最新版本

    ECMAScript Second Edition javascript新特性2018年7月最新版本

    2018最新高清ECMAScript 6入门

    ES6,全称ECMAScript 2015,是JavaScript语言的一个重要版本更新,引入了大量的新特性和语法糖,对前端开发领域产生了深远影响。 1. **变量声明** - `let` 和 `const`: ES6 引入了新的变量声明方式,`let` 用于...

    ECMAScript 6 入门教程-全面介绍 ECMAScript 6 新引入的语法特性

    5. 正则的扩展 6. 数值的扩展 7. 函数的扩展 8. 数组的扩展 9. 对象的扩展 10. Symbol 11. Set 和 Map 数据结构 12. Proxy 13. Reflect 14. Promise 对象 15. Iterator 和 for...of 循环 16. Generator 函数的语法 ...

    《ECMAScript2016标准入门(第三版)》_阮一峰最新版

    综上所述,《ECMAScript2016标准入门(第三版)》不仅详细介绍了ES2016的新特性,而且还提供了丰富的示例帮助读者理解和应用这些特性。无论是对于初学者还是有一定经验的开发者来说,这本书都是学习ES2016不可多得的好...

    高性能JavaScript 2015版本 ECMAScript 6入门 JavaScript 5

    随着技术的不断演进,JavaScript也在持续发展,从最初的ECMAScript 3到现在的ECMAScript 6(也被称为ES2015),它带来了许多新特性和改进,显著提升了开发者的效率和代码的可维护性。以下将详细介绍JavaScript的发展...

    ECMAscript

    ### ECMAscript基础知识点详解 #### 一、ECMAscript概述 ECMAscript,通常简称ES,是一种脚本语言的标准规范,由欧洲计算机制造...随着ECMAScript标准的不断演进,掌握其最新特性和最佳实践对于开发者来说至关重要。

    ECMASCRIPT 6介绍

    ES6之前的版本包括1、2、3、5,而没有4版,这是因为在制定ES4时,提出的特性过于激进且复杂,例如内建静态类型系统,导致最终该版本未能通过,于是标准委员会在ES4的基础上发布了较为温和的ES5版本。ES5引入了一系列...

    ECMAscript2018规范

    资源名称:ECMAscript2018规范内容简介:ECMAscript 2018(第九版 JS)已于 6 月底正式发布,带来了许多新特性。ECMAscript 2018 于今年2月出炉草案,TC39 技术委员会每两个月开会一次,讨论当前...

    ECMAScript概述

    ECMAScript,通常简称为ES,是JavaScript编程语言的标准,由欧洲计算机制造商协会...随着ECMAScript的不断演进,如ES6引入的模块系统、箭头函数、类和解构赋值等新特性,开发者需要持续学习和掌握最新的语言标准。

    Qt-Quick核心编程之ECMAScript初探,适合Qt初学者

    接下来,我们将深入探讨ECMAScript的一些关键特性,这对于理解QML中如何使用脚本至关重要。 ##### 1.1 区分大小写 ECMAScript是区分大小写的,这意味着`variable`和`Variable`被视为两个不同的标识符。 ##### 1.2 ...

Global site tag (gtag.js) - Google Analytics