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对象,因为我们可以通过绑定的总是kittythis值创建一个新方法locateMaru.

posted @ 2022-05-12 18:06  一马当先G  阅读(181)  评论(0编辑  收藏  举报