ECMAScriptECMAScript伍新特征总括

虽说ECMAScript五早就改成标准生产来了,但在此之前因为一向用的是ECMAScript叁,并且工作中老是要求包容IE的低版本,所以用的相比少。近来市镇上绝大部分浏览器都能包容ECMAScript五(IE8除了),逐步的就用的相比多了。前些天根本是把ECMAScript5中新增奶的特色及艺术总括一下,已备需要时有利于查询。

ECMAScript伍的包容性可参见http://kangax.github.io/compat-table/es5/

从严情势(Strict Mode)是ECMAScript
5的新特点,它同意你把任何程序,恐怕某些函数,放置在“严刻”的操作语境中。那种严酷的语境会幸免少数特定的操作并抛出更加多的十三分。严谨方式下第1变化有:

  1. 未使用var成立的变量会报错
  2. 函数顶层的this不在指向window,而是undefined
  3. 强制为eval创制新成效域
  4. 取缔用delete删除变量
  5. 禁绝利用arguments,callee,caller属性
  6. 明确命令禁止行使width语句
  7. 取缔函数参数重名
  8. 禁相对象属性重名
  9. 明确命令禁止接纳8进制数字
  10. 不一致意在非函数的代码块内注脚函数。
  11. 新增保留字:implements, interface, let, package, private, protected,
    public, static, yield。

Object新增方法:

Object.create()

创办3个颇具钦定原型且可选用性地蕴藏内定属性的靶子

Object.create(proto, [ propertiesObject ])

proto:三个对象,作为新创制对象的原型。大概为 null。
propertiesObject:可选。该参数对象是一组属性与值,该目的的质量名称将是新创立的靶子的性质名称,值是性质描述符。注意:该参数对象不能够是
undefined,别的只有该对象中自小编持有的可枚举的天性才有效,也正是说该指标的原型链上属性是无济于事的。
示例:

//Shape - superclass
function Shape() {
  this.x = 0;
  this.y = 0;
}

Shape.prototype.move = function(x, y) {
    this.x += x;
    this.y += y;
    console.info("Shape moved.");
};

// Rectangle - subclass
function Rectangle() {
  Shape.call(this); //call super constructor.
}

Rectangle.prototype = Object.create(Shape.prototype);

var rect = new Rectangle();
rect instanceof Rectangle //true.
rect instanceof Shape //true.
rect.move(1, 1); //Outputs, "Shape moved."

Object.getPrototypeOf()

回来该目的的原型(也等于该对象内部属性[[prototype]]的值)

Object.getPrototypeOf(object)

在 ES伍 中,假使参数不是五个指标类型,将抛出2个 TypeError
相当。在ES陆中,参数被胁持转换为Object。
示例:

var proto = {};
var obj = Object.create(proto);
Object.getPrototypeOf(obj) === proto; // true

Object.getOwnPropertyNames()

归来八个由内定对象的享有本身性质的属性名(蕴含不胜枚举属性)组成的数组。

Object.getOwnPropertyNames(obj)

obj:1个对象,其本人的可枚举和熟视无睹属性的称号被再次来到。
示例:

var arr = ["a", "b", "c"];
console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"]

Object.defineProperty()

直白在三个对象上定义三个新属性,或许涂改二个曾经存在的性质,
并重回这几个目的。

Object.defineProperty(obj, prop, descriptor)

obj:须求定义属性的目的。
prop:需定义或修改的习性的名字。
descriptor:将被定义或修改的属性的讲述符。
示例:

Object.defineProperty(obj, "key", {
  enumerable: false,
  configurable: false,
  writable: false,
  value: "static"
});

Object.defineProperties()

在一个对象上丰盛或改动1个依然多少个自有总体性,并赶回该对象。

Object.defineProperties(obj, props)

obj:将要被添加属性或改动属性的靶子
props:该目标的二个或多个键值对定义了即将为对象添加或修改的性质的求实安顿
示例:

var obj = {};
Object.defineProperties(obj, {
  "property1": {
    value: true,
    writable: true
  },
  "property2": {
    value: "Hello",
    writable: false
  }
});
console.log(obj) //{property1:true,property2:"Hello"}

Object.getOwnPropertyDescriptor()

内定对象上三个自有属性对应的性质描述符(自有属性指的是平素给予该指标的习性,不须要从原型链上实行搜索的天性)。假如钦赐的属性存在于对象上,则赶回其性情描述符(property
descriptor),不然重回 undefined。

Object.getOwnPropertyDescriptor(obj, prop)

obj:在该指标上查看属性
prop:三特品质名称,该属性的性质描述符将被再次来到
示例:

var o, d;
o = { bar: 42 };
d = Object.getOwnPropertyDescriptor(o, "bar");
console.log(d);//{ configurable: true, enumerable: true, value: 42, writable: true }

Object.seal()

能够让3个指标密封,并回到被密封后的靶子。密封对象是指这一个不能够添加新的习性,无法去除已有总体性,以及不能够改改已有质量的可枚举性、可配置性、可写性,但大概能够修改已有总体性的值的对象。

Object.seal(obj)

Object.freeze()

能够冻结二个指标,冻结指的是不能向这几个指标添加新的习性,不可能修改其已有总体性的值,无法去除已有总体性,以及不可能修改该对象已有品质的可枚举性、可配置性、可写性。也正是说,这么些指标永远是不可变的。该方法再次回到被冷冻的对象。

Object.freeze(obj)

Object.preventExtensions()

让3个对象变的不可扩充,也正是永远不能够再添加新的性质。

Object.preventExtensions(obj)

Object.isExtrensible()

判断八个对象是不是是可扩张的(是还是不是足以在它上边添加新的质量)。

Object.isExtensible(obj)

示例:

// 新对象默认是可扩展的.
var empty = {};
Object.isExtensible(empty); // === true
// ...可以变的不可扩展.
Object.preventExtensions(empty);
Object.isExtensible(empty); // === false

Object.isSealed()

看清二个对象是或不是是密封的(sealed)。

Object.isSealed(obj)

示例:

// 新建的对象默认不是密封的.
var empty = {};
Object.isSealed(empty); // === false

// 如果你把一个空对象变的不可扩展,则它同时也会变成个密封对象.
Object.preventExtensions(empty);
Object.isSealed(empty); // === true

Object.isFrozen()

认清贰个对象是还是不是被冷冻(frozen)。

Object.isFrozen(obj)

Object.keys()

回去一个由给定对象的自家可枚举属性组成的数组,数组中属性名的排列顺序和平运动用
for…in 循环遍历该目的时回来的1壹1致 (两者的最首要差异是 三个 for-in
循环还会枚举其原型链上的属性)。

Object.keys(obj)

示例:

var arr = ["a", "b", "c"];
console.log(Object.keys(arr));// [ '0', '1', '2' ]

Object.prototype新增方法

Object.prototype.isPrototypeOf()

用以测试贰个对象是还是不是存在于另八个目的的原型链上。

Obj.prototype.isPrototypeOf(object)

object:在该目的的原型链上搜寻
示例:

var arr = [];
console.log(arr instanceof Array);//true
console.log(Array.prototype.isPrototypeOf(arr));//true

isPrototypeOf 和 instanceof operator 是不壹样的。在表明式 object
instanceof AFunction 中,检验的是 AFunction.prototype 是否在object
的原型链中,而不是检查评定 AFunction 本身。

Object.prototype.propertyIsEnumerable()

回到1个布尔值,声明钦赐的属性名是不是是当前目的可枚举的自家性质。

obj.propertyIsEnumerable(prop)

示例:

var o = {};
o.prop = 'is enumerable';
o.propertyIsEnumerable('prop');   //  返回 true

Function.prototype新增方法

Function.prototype.bind()

bind()方法会创设一个新函数。当那一个新函数被调用时,bind()的率先个参数将用作它运转时的
this, 之后的一种类参数将会在传递的实参前传出作为它的参数。

fun.bind(thisArg[, arg1[, arg2[, ...]]])

thisArg:当绑定函数被调用时,该参数会作为原函数运营时的 this
指向。当使用new 操作符调用绑定函数时,该参数无效。
arg壹, arg二,
…:当绑定函数被调用时,这么些参数将放置实参此前传递给被绑定的点子。

示例:

this.x = 9; 
var module = {
  x: 81,
  getX: function() { return this.x; }
};
module.getX(); // 返回 81
var retrieveX = module.getX;
retrieveX(); // 返回 9, 在这种情况下,"this"指向全局作用域
// 创建一个新函数,将"this"绑定到module对象
// 新手可能会被全局的x变量和module里的属性x所迷惑
var boundGetX = retrieveX.bind(module);
boundGetX(); // 返回 81

Array新增方法:

Array.isArray()

该格局适用于规定传递的值是还是不是为Array。

Array.isArray(obj)

示例:

Array.isArray([1, 2, 3]);  // true
Array.isArray({foo: 123}); // false
Array.isArray("foobar");   // false
Array.isArray(undefined);  // false

地方方法:

Array.prototype.indexOf()

回来在数组中能够找到给定成分的率先个目录,借使不设有,则赶回-一。

arr.indexOf(searchElement)

示例:

var a = [2, 9, 9]; 
a.indexOf(2); // 0 

Array.prototype.lastIndexOf()

回去钦赐成分(也即有效的 JavaScript
值或变量)在数组中的最终2个的目录,如果不设有则赶回
-一。从数组的前边向前查找,从 fromIndex 处伊始。

arr.lastIndexOf(searchElement[, fromIndex = arr.length - 1])

searchElement:被寻找的因素。
fromIndex:从此地方上马逆向查找。暗中同意为数组的长度减
一,即全体数组都被搜寻。如若该值大于或等于数组的尺寸,则全体数组会被搜寻。假如为负值,将其视为从数组末尾向前的撼动。即使该值为负,数组还是会被从后迈入查找。借使该值为负时,其相对值大于数经理度,则方法重返-一,即数组不会被搜寻。

示例:

var array = [2, 5, 9, 2];
var index = array.lastIndexOf(2);//3

迭代格局:

Array.prototype.every()

测试数组的有所因素是不是都因而了点名函数的测试。
every 方法为数组中的每一个成分执行1次 callback 函数,直到它找到叁个使
callback 重返 false(表示可转移为布尔值 false
的值)的因素。假使发现了3个这么的要素,every 方法将会马上回去
false。不然,callback 为每1个成分重回 true,every 就会回去 true。

arr.every(callback[, thisArg])

callback:用来测试种种成分的函数。
thisArg:执行 callback 时使用的 this 值。

示例:

function isBigEnough(element, index, array) {
  return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);// false
passed = [12, 54, 18, 130, 44].every(isBigEnough);// true

Array.prototype.some()

测试数组中的有个别因素是不是由此了点名函数的测试。
some 为数组中的每一个要素执行一次 callback 函数,直到找到叁个驱动
callback 重临三个“真值”(即可转换为布尔值 true
的值)。假诺找到了这么叁个值,some 将会即时赶回 true。不然,some 重回false。

arr.some(callback[, thisArg])

示例:

function isBigEnough(element, index, array) {
  return (element >= 10);
}
var passed = [2, 5, 8, 1, 4].some(isBigEnough);
// passed is false
passed = [12, 5, 8, 1, 4].some(isBigEnough);
// passed is true

Array.prototype.filter()

行使钦点的函数测试全数因素,并创办二个包蕴全数通过测试的因素的新数组。
filter 为数组中的每一个成分调用三回 callback 函数,并选用具有使得 callback
再次来到 true 或 等价于 true 的值 的成分创制1个新数组。

var new_arrary = arr.filter(callback[, thisArg])

示例:

function isBigEnough(value) {
  return value >= 10;
}

var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);//[12, 130, 44]

Array.prototype.forEach()

格局对数组的各类成分执行贰回提供的函数。

array.forEach(callback[, thisArg])

示例:

var a = ['a', 'b', 'c'];

a.forEach(function(element) {
    console.log(element);
});
// a
// b
// c

forEach() 为各类数组成分执行callback函数;不像map() 大概reduce()
,它总是回到 undefined值,并且不可链式调用。

Array.prototype.map()

开创多少个新数组,其结果是该数组中的各类成分调用一个提供的函数。
map 方法会给原数组中的每一种成分都按顺序调用1次 callback 函数。callback
每一趟执行后的再次来到值(包罗 undefined)组合起来形成一个新数组。

var new_array = arr.map(callback[, thisArg])

示例:

var numbers = [1, 5, 10, 15];
var roots = numbers.map(function(x) {
    return x * 2;
});
// roots is now [2, 10, 20, 30]
// numbers is still [1, 5, 10, 15]

归并方法:

Array.prototype.reduce()

对累加器和数组的每一种值 (从左到右)应用三个函数,以将其缩减为单个值。

arr.reduce(callback,[initialValue])

callback:执行数组中种种值的函数,包涵五个参数
accumulator:上二遍调用回调重回的值,也许是提供的初步值(initialValue)
currentValue:数组中正在处理的要素
currentIndex:数据中正在处理的要素索引,假使提供了 initialValue
,从0初阶;否则从一初始
array:调用 reduce 的数组
initialValue:可挑选,其值用于第叁遍调用 callback 的首先个参数。

示例:

var sum = [0, 1, 2, 3].reduce(function(acc, val) {
  return acc + val;
}, 0);

console.log(sum);// 6

Array.prototype.reduceRight();

reduceRight()
方法接受1个函数作为累加器(accumulator),让每一种值(从右到左,亦即从尾到头)缩减为三个值。(与
reduce() 的履行方向相反)

arr.reduceRight(callback[, initialValue])

示例:

var flattened = [[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) {
    return a.concat(b);
}, []);
// flattened is [4, 5, 2, 3, 0, 1]

String

String.trim()

会去除贰个字符串两端的空白字符。

var newStr = str.trim()

示例:

var orig = '   foo  ';
console.log(orig.trim()); // 'foo'

Date

Date.now()

归来自壹玖陆七年11月二15日 00:00:00 UTC到当下光阴的阿秒数。

var timeInMs = Date.now();

IE八及以下能够用于下代码来合作:

if (!Date.now) {
  Date.now = function now() {
    return new Date().getTime();
  };
}

Date.prototype.toISOString()

回去三个 ISO(ISO 8601 Extended Format)格式的字符串:
YYYY-MM-DDTHH:mm:ss.sssZ。时区总是UTC(协调世界时),加1个后缀“Z”标识。

dateObj.toISOString()

示例:

var today = new Date("05 October 2011 14:48 UTC");
console.log(today.toISOString()); // 返回2011-10-05T14:48:00.000Z

JSON

JSON.parse()

浅析1个JSON字符串,构造由字符串描述的JavaScript值或对象。能够提供可选的reviver函数以在回到在此之前对所取得的指标执行变换。

JSON.parse(text[, reviver])

text:要被解析成JavaSctipt值的字符串,查看 JSON 对象学习的JSON
语法的表明。
reviver:
可选,如果是3个函数,则规定了原始值怎样被分析改造,在被再次回到在此之前。

示例:

JSON.parse('{"name" : "jesse","age":25 }');//{ name: 'jesse', age: 25 }

JSON.stringfy()

JSON.stringify() 方法将JavaScript值转换为JSON字符串

JSON.stringify(value[, replacer [, space]])

示例:

JSON.stringify({ name: 'jesse', age: 25 });//{"name":"jesse","age":25}