ES5特性
ES5通过对现有JavaScript方法添加语句和原生ECMAScript对象做合并实现标准化。ES5还引入了一个语法的严格变种,被称为”严格模式(strict mode)”。
1.严格模式——use strict
严格模式(“use strict”)是一种限制性更强语言变种的方式,简单点讲就是严格检查语法、拼写等规则,比如你少了结束符分号(;)就会报错或者直接使用未声明的变量(在非严格模式中,js使用为使用未声明变量,系统会将其创建成一个全局变量)也会报错。使用的方法很简单,在JS文件或是函数的顶部添加"use strict"
即可启用严格模式。因为"use strict"
就是个字符串,因此其会被旧版浏览器安全地忽视。比如:
"use strict"; function strict(){ "use strict"; //... }
2.提供全局JSON对象——JSON.stringify/JSON.parse;
大家经常使用的序列化(JSON.stringify
)和反序列化(JSON.parse)对象为JSON格式。其实也是ES5提供一个全局的JSON
对象。(对于老的浏览器可以考虑使用json2.js插件来实现相同的功能)。
JSON.parse(text [, reviver])
JSON.parse反序列化的方法接受文本(JSON格式)转化为JSON对象,其中第二个参数是一个回调函数,主要是用来过滤返回值。如果我们要确保解析的值是个整数,我们可以使用reviver方法。比如:
var result = JSON.parse('{"a": 1, "b": "2"}', function(key, value){ if (typeof value == 'string'){ return parseInt(value); } else { return value; } })
JSON.stringify(value [, replacer [, space]])
如果我们需要改变值字符串化的方式,或是对我们选择的提供过滤(说白了也是过滤返回值),我们可以将其传给replacer函数。栗子,我们想过滤出即将被字符串化的对象中值大于18的值的属性:
var nums = { "first": 17, "second": 20, "third": 13 } var luckyNums = JSON.stringify(nums, function(key, value){ if (value > 18) { return undefined; } else { return value; } });
上面的代码中你会发现满足条件时给的是“undefined”的值,那为何结果里面没有undefined呢??其实是这样子的,如果replacer方法返回undefined, 则键值对就不会包含在最终的JSON中。最后的那个space参数个人感觉比较鸡肋,只是用来作返回结果的可读性帮助(缩进方式)。space参数可以是个数字,表明了作缩进的JSON字符串或字符串每个水平上缩进的空格数。如果参数是个超过10的数值,或是超过10个字符的字符串,将导致取数值10或是截取前10个字符。
var luckyNums = JSON.stringify(nums, function(key, value) { if (value> 20) { return undefined; } else { return value; } }, 2);
3、附加对象——添加到Object上的构造器
Object.getPrototypeOf Object.getOwnPropertyDescriptor Object.getOwnPropertyNames //几乎相同Object.keys但返回对象的所有属性名称(不只是可枚举的) Object.create //创建一个新对象,其原型等于proto的值 Object.defineProperty Object.defineProperties Object.seal //密封对象可防止其他代码删除或更改任何对象属性的描述符,以及添加新属性 Object.isSealed //密封对象可防止其他代码删除或更改任何对象属性的描述符,以及添加新属性 Object.freeze Object.preventExtensions //关闭可扩展性可能会阻止新属性添加到对象,锁定一个对象,防止属性增加。返回对象 Object.isFrozen //冻结物体几乎与密封物体相同,但是添加了不可修改的属性 Object.isExtensible //关闭可扩展性可能会阻止新属性添加到对象,确定对象当前可扩展性的一种方法,返回bool Object.keys //返回表示对象的所有可枚举属性名称的字符串数组 Object.hasOwnProperty //判断是否拥有某个属性
4、额外的数组——添加到Arrayprototype对象上
Array.prototype.indexOf //测试一个元素是否存在于一个集合中 Array.prototype.lastIndexOf //类似indexOf,除了它从数组的末尾开始搜索元素 Array.prototype.every //集合中的所有项目是否满足指定的条件 Array.prototype.some //集合中的某些或所有项目是否满足指定的条件 Array.prototype.forEach(function(item,index,Array)) Array.prototype.map //原始数组的转换或映射 Array.prototype.filter //过滤 Array.prototype.reduce //将一个数组减少为一个值 reduce(function (previous, current, index, array),回调函数接受四个参数:上一个值,当前值,索引,以及数组本身 Array.prototype.reduceRight //将一个数组减少为一个值,工作方式与以下相同reduce,除了它从最后处理数组之外 Array.isArray //直接将方法写在了构造器上,判断数组
5、Function.prototype.bind(thisArg [, arg1 [, arg2, …]])
Function.prototype.bind
返回一个新的函数对象,该函数对象的this绑定到了thisArg
参数上。其实就是改变this对象的绑定,这个bind与apply功能比较近。从本质上讲,这允许你在其他对象链中执行一个函数。
function locate(){ console.log(this.location); } function Maru(location){ this.location = location; } var kitty = new Maru("cardboard box"); var locateMaru = locate.bind(kitty); locateMaru();
在这个例子中,我们将Maru对象的上下文应用在location
函数中。因为location
是个全局对象的属性,其this
值就是全局对象(window
)。在这种情况下,我们向上寻找cat, 并不是Location
对象,因为我们可以通过绑定的总是kitty
的this
值创建一个新方法locateMaru
.