ECMAScript5新特性
现在写这篇文章有点晚了,毕竟ECMAScript5在2009年就发布了。但是当时支持的浏览器还很少,经过这几年的发展,主流浏览器对ECMAScript5已经大都支持了(不过IE8仍然占有很大的份额),我们再重新看看ECMAScript5里有哪些新特性我们可用的。
ECMAScript支持的浏览器为IE9+,chrome23+,safari6+,IOS7/8,其它份额很小的浏览器我就没有列出来了,具体可以看 http://kangax.github.io/compat-table/es5/
Object.create | 创建一个拥有指定原型和若干个指定属性的对象 | |
Object.defineProperty | 该方法允许精确添加或修改对象的属性。正常的属性添加通过赋值来创建并显示在属性枚举中(for…in 循环 或 Object.keys 方法), 这种方式添加的属性值可能被改变,也可能会被 删除。该方法允许改变这些额外细节的默认设置。 | 可以定义这个属性的特性,如writable, get, set, confiurable, enumerable |
Object.defineProperties | 批量defineProperty | |
Object.getPrototypeOf | 返回指定对象的原型(也就是该对象内部属性[[Prototype]]的值) | |
Object.keys | 返回一个由给定对象的所有可枚举自身属性的属性名组成的数组,数组中属性名的排列顺序和使用for-in循环遍历该对象时返回的顺序一致(两者的主要区别是 for-in 还会遍历出一个对象从其原型链上继承到的可枚举属性) | |
Object.seal | 让一个对象密封,并返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可能可以修改已有属性的值的对象 | 检测:Object.isSealed |
Object.freeze | 冻结一个对象。冻结对象是指那些不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。也就是说,这个对象永远是不可变的。该方法返回被冻结的对象 | 和seal相比,值都不能改了检测:Object.isFrozen |
Object.preventExtensions | 让一个对象变的不可扩展,也就是永远不能再添加新的属性 | 检测:Object.isExtensible |
Object.getOwnPropertyDescriptor | 返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性) | 返回其writable, get, set, confiurable, enumerable属性 |
Object.getOwnPropertyNames | 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性)组成的数组。 | 和keys的区别是它可以列出不可枚举的值 |
Date.prototype.toISOString | 返回一个 ISO(ISO 8601 Extended Format)格式的字符串: YYYY-MM-DDTHH:mm:ss.sssZ。时区总是UTC(协调世界时),加一个后缀“Z”标识 | |
Date.now | 返回自1970年1月1日 00:00:00 UTC到当前时间的毫秒数 | |
Array.isArray | 判断一个对象是否为数组,如果是,则返回true,否则返回false. | |
JSON |
parse 解析JSON字符串, 可以选择改变前面解析后的值及其属性,然后返回解析的值。 stringify 返回指定值的 JSON 字符串,可以自定义只包含某些特定的属性或替换属性值。 |
IE8支持 |
Function.prototype.bind | 创建一个新函数,称为绑定函数.当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数. | |
String.prototype.trim | 删除字符串两端的空白字符并返回. | |
Array.prototype.indexOf | 返回根据给定元素找到的第一个索引值,否则返回-1 | |
Array.prototype.lastIndexOf | 返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从 fromIndex 处开始。 | |
Array.prototype.every | 为数组中的每个元素执行一次 callback 函数,直到它找到一个使 callback 返回 falsy(表示可转换为布尔值 false 的值)的元素。如果发现了一个这样的元素,every 方法将会立即返回 false。否则,callback 为每一个元素返回 true,every 就会返回 true。 | |
Array.prototype.some | 测试数组中的某些元素是否通过了指定函数的测试 | |
Array.prototype.forEach | 让数组的每一项都执行一次给定的函数 | |
Array.prototype.map | 给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值组合起来形成一个新数组。 callback 函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete 删除的索引则不会被调用。 | |
Array.prototype.filter | filter 为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回“真值”(即可转换为布尔值 true 的值)的元素创建一个新数组。callback 只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback 测试的元素只会被跳过,不会被包含在新数组中。 | |
Array.prototype.reduce | 接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。 | |
Array.prototype.reduceRight | 接受一个函数作为累加器(accumulator),让每个值(从右到左,亦即从尾到头)缩减为一个值。(与 reduce() 的执行方向相反) | |
getter和setter | var o={_name :’o’, get name(){return this._name}, set name(v) {this._name=v}};console.log(o.name); //‘o’ | |
Property access on strings | ‘foobar'[3]==’b’ | IE8支持 |
保留字作为对象属性 | a={if:1} | |
0宽度字符作为名称 |
var _\u200c\u200d = true; return _\u200c\u200d; |
|
parseInt忽视开头的’0′ | parseInt(‘010′) === 10; | |
undefined不可变 | ||
Strict mode | (function () {“use strict”;return !this;}()) | IE9不支持 |