哥自学JavaScript是在10年那会,记得当时看的一本叫做<<JavaScript学习指南(第2版)>>
外国人写的书,中文翻译的不咋地,还有错别字,它是ECMAScript3的标准.
昨天才知道原来去年6月已经发布了最新的标准:ECMAScirpt5.一番浏览,做了小小的总结.
Strict Mode
即严格模式.其新增变化如下:
- 未使用var创建的变量会报错
- 函数顶层的this不在指向window,而是undefined
- 强制为eval创建新作用域
- 禁止用delete删除变量
- 禁止使用arguments,callee,caller属性
- 禁止使用width语句
- 禁止函数参数重名
- 禁止对象属性重名
- 禁止使用八进制数字
- 不允许在非函数的代码块内声明函数
并且新增保留字:
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}