写该博客的缘由主要是为了让本身再巩固所学知识与记录,方便之后查阅。更勉励将来的本身每周坚持更新至少写两篇博客(去转载也好啊,嘿嘿嘿)!git
最近不少框架或者说git上的一些项目介绍都会介绍说使用了ES五、ES6的语法,甚至今年开始有的还介绍说用了ES7了,那咱们就来看下这些ES五、六、7系列都须要掌握哪些知识点。今天咱们就先来掌握下ES5与咱们写的常规的js的特性。github
ES5经过对现有JavaScript方法添加语句和原生ECMAScript对象作合并实现标准化。ES5还引入了一个语法的严格变种,被称为”严格模式(strict mode)”。面试
关于完整列表:请参考官方ECMAScript语言规范;json
关于兼容性问题:目前五大浏览器都对ES5兼容,具体能够查看Juriy Zaytsev很赞的 ECMAScript 5 兼容性表。数组
ES5总结来讲,新的特性就是以下5点:浏览器
1、严格模式——use strict安全
严格模式(“use strict”)是一种限制性更强语言变种的方式,简单点讲就是严格检查语法、拼写等规则,好比你少告终束符分号(;)就会报错或者直接使用未声明的变量(在非严格模式中,js使用为使用未声明变量,系统会将其建立成一个全局变量)也会报错。使用的方法很简单,在JS文件或是函数的顶部添加"use strict"
便可启用严格模式。由于"use strict"
就是个字符串,所以其会被旧版浏览器安全地忽视。咱们来举个栗子:app
"use strict";
function strict(){ "use strict"; //... }
二、提供全局JSON对象——JSON.stringify/JSON.parse;框架
你们常用的序列化(JSON.stringify
)和反序列化(JSON.parse)对象为JSON格式。其实也是ES5提供一个全局的JSON
对象。(对于老的浏览器能够考虑使用json2.js插件来实现相同的功能)。ecmascript
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; } }) >> result.b 2
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; } }); >> luckyNums '{"first": 17, "third": 13}'
上面的代码中你会发现知足条件时给的是“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); >> luckyNums '{ "first":7, "third":14 }'
三、附加对象——添加到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 //判断是否拥有某个属性
这些新增的好处之一是对象的属性有了更多控制,例如哪些是容许被修改的,哪些是能够枚举的,哪些是能够删除的等。要用的时候直接拿起来用就好了。
四、额外的数组——添加到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 //直接将方法写在了构造器上,判断数组
同上,要用的时候直接拿来用就行
五、Function.prototype.bind(thisArg [, arg1 [, arg2, …]])
Function.prototype.bind
返回一个新的函数对象,该函数对象的this绑定到了thisArg
参数上。其实就是改变this对象的绑定,这个bind与apply功能比较近,也是不少公司喜欢拿来笔试或面试的题目。下次咱们专门写一篇比较介绍下吧!
参考学习张大佬的博客:http://www.zhangxinxu.com/wordpress/2012/01/introducing-ecmascript-5-1/