粗看ECMAScript5新特性

哥自学JavaScript是在10年那会,记得当时看的一本叫做<<JavaScript学习指南(第2版)>>外国人写的书,中文翻译的不咋地,还有错别字,它是ECMAScript3的标准.

昨天才知道原来去年6月已经发布了最新的标准:ECMAScirpt5.一番浏览,做了小小的总结.

Strict Mode

即严格模式.其新增变化如下:

  1. 未使用var创建的变量会报错
  2. 函数顶层的this不在指向window,而是undefined
  3. 强制为eval创建新作用域
  4. 禁止用delete删除变量
  5. 禁止使用arguments,callee,caller属性
  6. 禁止使用width语句
  7. 禁止函数参数重名
  8. 禁止对象属性重名
  9. 禁止使用八进制数字
  10. 不允许在非函数的代码块内声明函数

并且新增保留字:

implements, interface, let, package, private, protected, public, static, yield.

哥觉得这应该是新标准中最出彩的了.这大大减少了对js代码的调试找错的时间,比如之前this指向window,但这对于v8渲染器来说是无效的,只对IE有效.

Object新特性

Object.create()

创建一个具有指定原型且可选择性地包含指定属性的对象

Object.create(proto, [ propertiesObject ])

示例:

//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)

Object.getOwnPropertyNames()

返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性)组成的数组.

Object.getOwnPropertyNames(obj)

Object.defineProperty()

直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象.

Object.defineProperty(obj, prop, descriptor)

Object.defineProperties()

在一个对象上添加或修改一个或者多个自有属性,并返回该对象.

Object.defineProperties(obj, props)

Object.getOwnPropertyDescriptor()

指定对象上一个自有属性对应的属性描述符(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性).如果指定的属性存在于对象上,则返回其属性描述符(property descriptor),否则返回 undefined.

Object.getOwnPropertyDescriptor(obj, prop)

Object.seal()

可以让一个对象密封,并返回被密封后的对象.密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可能可以修改已有属性的值的对象.

Object.seal(obj)

Object.freeze()

可以冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性.也就是说,这个对象永远是不可变的.该方法返回被冻结的对象.

Object.freeze(obj)

Object.preventExtensions()

让一个对象变的不可扩展,也就是永远不能再添加新的属性.

Object.preventExtensions(obj)

Object.isExtrensible()

判断一个对象是否是可扩展的(是否可以在它上面添加新的属性).

Object.isExtensible(obj)

Object.isSealed()

判断一个对象是否是密封的(sealed).

Object.isSealed(obj)

Object.isFrozen()

判断一个对象是否被冻结(frozen).

Object.isFrozen(obj)

Object.keys()

返回一个由给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for…in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性).

Object.keys(obj)

Array新特性

Array.isArray()

该方法适用于确定传递的值是否为Array.

Array.isArray(obj)

Array.prototype.indexOf()

返回在数组中可以找到给定元素的第一个索引,如果不存在,则返回-1.

arr.indexOf(searchElement)

Array.prototype.lastIndexOf()

返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1.从数组的后面向前查找,从 fromIndex 处开始.

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

Array.prototype.every()

测试数组的所有元素是否都通过了指定函数的测试.
every 方法为数组中的每个元素执行一次 callback 函数,直到它找到一个使 callback 返回 false(表示可转换为布尔值 false 的值)的元素.如果发现了一个这样的元素,every 方法将会立即返回 false.否则,callback 为每一个元素返回 true,every 就会返回 true.

arr.every(callback[, thisArg])

示例:

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 的值 的元素创建一个新数组.

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 方法会给原数组中的每个元素都按顺序调用一次 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])

示例:

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

console.log(sum);// 6

Array.prototype.reduceRight()

reduceRight() 方法接受一个函数作为累加器(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()

返回自1970年1月1日 00:00:00 UTC到当前时间的毫秒数.

var timeInMs = Date.now();

IE8及以下可以用以下代码来兼容:

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(协调世界时),加一个后缀“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()

解析一个JSON字符串,构造由字符串描述的JavaScript值或对象.可以提供可选的reviver函数以在返回之前对所得到的对象执行变换.

JSON.parse(text[, reviver])

text:要被解析成JavaSctipt值的字符串,查看 JSON 对象学习的JSON 语法的说明.
reviver: 可选,如果是一个函数,则规定了原始值如何被解析改造,在被返回之前.

示例:

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}