JavaScript 1.6 引入了若干新特性:E4X,新的Array
方法,及数组和字符串泛型。
1. 数组扩展
七个新的Array
方法可以分成两类:项(item)的定位方法和迭代方法。
项定位方法为:
1.1 indexOf()
: 返回指定项首次出现的索引,没有的话,返回 -1。
语法:array.indexOf(searchElement[, fromIndex])
参数:
searchElement 需在数组中搜索的元素
fromIndex 开始搜索的位置,默认为 0。
描述:在数组中索引元素时,使用全等(===)
兼容性:于 ECMA-262 标准中添加,部分浏览器可能会不支持。您可以添加以下代码来进行支持。该算法严格遵循 ECMA-262 第五版,但必须保证
Object
, TypeError
, Number
, Math.floor
, Math.abs
, Math.max
可用。 if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { "use strict"; if (this === void 0 || this === null) { throw new TypeError(); } var t = Object(this); var len = t.length >>> 0; if (len === 0) { return -1; } var n = 0; if (arguments.length > 0) { n = Number(arguments[1]); if (n !== n) { // shortcut for verifying if it's NaN n = 0; } else if (n !== 0 && n !== Infinity && n !== -Infinity) { n = (n > 0 || -1) * Math.floor(Math.abs(n)); } } if (n >= len) { return -1; } var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); for (; k < len; k++) { if (k in t && t[k] === searchElement) { return k; } } return -1; } }
1.2 lastIndexOf()
: 返回指定项最后一次出现的索引。语法:array.lastIndexOf
(searchElement[, fromIndex])
参数:
searchElement 需在数组中搜索的元素
fromIndex 开始搜索的位置,默认为 0。
描述:在数组中索引元素时,使用全等(===)
兼容性:于 ECMA-262 标准中添加,部分浏览器可能会不支持。您可以添加以下代码来进行支持。该算法严格遵循 ECMA-262 第五版,但必须保证
Object
, TypeError
, Number
, Math.floor
, Math.abs
, Math.min
可用。if (!Array.prototype.lastIndexOf) { Array.prototype.lastIndexOf = function(searchElement /*, fromIndex*/) { "use strict";if (this === void 0 || this === null) throw new TypeError(); var t = Object(this); var len = t.length >>> 0; if (len === 0) return -1; var n = len; if (arguments.length > 1) { n = Number(arguments[1]); if (n !== n) n = 0; else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) n = (n > 0 || -1) * Math.floor(Math.abs(n)); } var k = n >= 0 ? Math.min(n, len - 1) : len - Math.abs(n); for (; k >= 0; k--) { if (k in t && t[k] === searchElement) return k; } return -1; }; } </pre>
迭代方法包括:
1.3 every()
: 在数组中的每个项上运行一个函数,若所有结果都返回真值,此方法亦返回真值。语法:array.every(callback[, thisObject])
参数:
callback
为每个元素执行的测试函数 arguments[0]: 当前元素值
arguments[1]: 当前元位置
arguments[2]: 当前数组
thisObject
callback 中的 this
.兼容性:于 ECMA-262 标准中添加,部分浏览器可能会不支持。您可以添加以下代码来进行支持。该算法严格遵循 ECMA-262 第五版,但必须保证
Object
, TypeError
可用,且 fun.call
指向 Function.prototype.call
。if (!Array.prototype.every) { Array.prototype.every = function(fun /*, thisp */) { "use strict";if (this === void 0 || this === null) throw new TypeError(); var t = Object(this); var len = t.length >>> 0; if (typeof fun !== "function") throw new TypeError(); var thisp = arguments[1]; for (var i = 0; i < len; i++) { if (i in t && !fun.call(thisp, t[i], i, t)) return false; } return true;
};
}
1.4 filter()
: 在数组中的每个项上运行一个函数,并将函数返回真值的项作为数组返回。语法:array.filter(callback[, thisObject])
参数:
callback
为每个元素执行的函数 arguments[0]: 当前元素值
arguments[1]: 当前元位置
arguments[2]: 当前数组
thisObject
callback 中的 this
.兼容性:于 ECMA-262 标准中添加,部分浏览器可能会不支持。您可以添加以下代码来进行支持。该算法严格遵循 ECMA-262 第五版,但必须保证
Object
, TypeError
, Array.prototype.push 可用,且 fun.call
指向 Function.prototype.call
。
if (!Array.prototype.filter) { Array.prototype.filter = function(fun /*, thisp */) { "use strict";if (this === void 0 || this === null) throw new TypeError(); var t = Object(this); var len = t.length >>> 0; if (typeof fun !== "function") throw new TypeError(); var res = []; var thisp = arguments[1]; for (var i = 0; i < len; i++) { if (i in t) { var val = t[i]; // in case fun mutates this if (fun.call(thisp, val, i, t)) res.push(val); } } return res;
};
}
1.5 forEach()
: 在数组中的每个项上运行一个函数。
语法:array.forEach(callback[, thisArg])
参数:
callback
为每个元素执行的函数 arguments[0]: 当前元素值
arguments[1]: 当前元位置
arguments[2]: 当前数组
thisArg
callback 中的 this
.兼容性:于 ECMA-262 标准中添加,部分浏览器可能会不支持。您可以添加以下代码来进行支持。该算法严格遵循 ECMA-262 第五版,但必须保证
Object
, TypeError
可用,且 fun.call
指向 Function.prototype.call
。// Production steps of ECMA-262, Edition 5, 15.4.4.18 // Reference: http://es5.github.com/#x15.4.4.18 if ( !Array.prototype.forEach ) {Array.prototype.forEach = function( callback, thisArg ) { var T, k; if ( this == null ) { throw new TypeError( " this is null or not defined" ); } // 1. Let O be the result of calling ToObject passing the |this| value as the argument. var O = Object(this); // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". // 3. Let len be ToUint32(lenValue). var len = O.length >>> 0; // Hack to convert O.length to a UInt32 // 4. If IsCallable(callback) is false, throw a TypeError exception. // See: http://es5.github.com/#x9.11 if ( {}.toString.call(callback) != "[object Function]" ) { throw new TypeError( callback + " is not a function" ); } // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. if ( thisArg ) { T = thisArg; } // 6. Let k be 0 k = 0; // 7. Repeat, while k < len while( k < len ) { var kValue; // a. Let Pk be ToString(k). // This is implicit for LHS operands of the in operator // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. // This step can be combined with c // c. If kPresent is true, then if ( k in O ) { // i. Let kValue be the result of calling the Get internal method of O with argument Pk. kValue = O[ k ]; // ii. Call the Call internal method of callback with T as the this value and // argument list containing kValue, k, and O. callback.call( T, kValue, k, O ); } // d. Increase k by 1. k++; } // 8. return undefined }; } </pre>
1.6 map()
: 在数组中的每个项上运行一个函数,并将全部结果作为数组返回。语法:array.map(callback[, thisArg])
参数:
callback
为每个元素执行的函数 arguments[0]: 当前元素值
arguments[1]: 当前元位置
arguments[2]: 当前数组
thisArg
callback 中的 this
.兼容性:于 ECMA-262 标准中添加,部分浏览器可能会不支持。您可以添加以下代码来进行支持。该算法严格遵循 ECMA-262 第五版,但必须保证
Object
, TypeError
, Array 可用,且 fun.call
指向 Function.prototype.call
。// Production steps of ECMA-262, Edition 5, 15.4.4.19 // Reference: http://es5.github.com/#x15.4.4.19 if (!Array.prototype.map) { Array.prototype.map = function(callback, thisArg) {var T, A, k; if (this == null) { throw new TypeError(" this is null or not defined"); } // 1. Let O be the result of calling ToObject passing the |this| value as the argument. var O = Object(this); // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". // 3. Let len be ToUint32(lenValue). var len = O.length >>> 0; // 4. If IsCallable(callback) is false, throw a TypeError exception. // See: http://es5.github.com/#x9.11 if ({}.toString.call(callback) != "[object Function]") { throw new TypeError(callback + " is not a function"); } // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. if (thisArg) { T = thisArg; } // 6. Let A be a new array created as if by the expression new Array(len) where Array is // the standard built-in constructor with that name and len is the value of len. A = new Array(len); // 7. Let k be 0 k = 0; // 8. Repeat, while k < len while(k < len) { var kValue, mappedValue; // a. Let Pk be ToString(k). // This is implicit for LHS operands of the in operator // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. // This step can be combined with c // c. If kPresent is true, then if (k in O) { // i. Let kValue be the result of calling the Get internal method of O with argument Pk. kValue = O[ k ]; // ii. Let mappedValue be the result of calling the Call internal method of callback // with T as the this value and argument list containing kValue, k, and O. mappedValue = callback.call(T, kValue, k, O); // iii. Call the DefineOwnProperty internal method of A with arguments // Pk, Property Descriptor {Value: mappedValue, Writable: true, Enumerable: true, Configurable: true}, // and false. // In browsers that support Object.defineProperty, use the following: // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true }); // For best browser support, use the following: A[ k ] = mappedValue; } // d. Increase k by 1. k++; } // 9. return A return A;
};
}
1.7 some():
在数组中的每个项上运行一个函数,若存在任意的结果返回真,则返回真值。语法:array.some(callback[, thisObject])
参数:
callback
为每个元素执行的测试函数 arguments[0]: 当前元素值
arguments[1]: 当前元位置
arguments[2]: 当前数组
thisObject
callback 的当前域 this
.兼容性:于 ECMA-262 标准中添加,部分浏览器可能会不支持。您可以添加以下代码来进行支持。该算法严格遵循 ECMA-262 第五版,但必须保证
Object
, TypeError
可用,且 fun.call
指向 Function.prototype.call
。if (!Array.prototype.some){ Array.prototype.some = function(fun /*, thisp */){ "use strict";if (this === void 0 || this === null) throw new TypeError(); var t = Object(this); var len = t.length >>> 0; if (typeof fun !== "function") throw new TypeError(); var thisp = arguments[1]; for (var i = 0; i < len; i++){ if (i in t && fun.call(thisp, t[i], i, t)) return true; } return false;
};
}
2. 数组及字符串泛型
您有时也许会想在字符串类型上使用数组拥有的方法。这样做的话,您实际上将字符串视如一个字符数组。例如,想要检查变量 str 中是否每个字符都是字母,您可以这样写:
function isLetter(character) { return (character >= "a" && character <= "z"); }if (Array.prototype.every.call(str, isLetter))
alert("The string '" + str + "' contains only letters!");
这种写法有点浪费,故JavaScript 1.6引入了泛型的简洁写法:
if (Array.every(str, isLetter)) alert("The string '" + str + "' contains only letters!");
类似地,您可以简单地将对任何对象应用字符串方法:
var num = 15; alert(String.replace(num, /5/, '2'));
3. For each ... in
for each...in
类似于 for...in
, 但是迭代的是对象的属性值,并非他的名字。
示例:
var sum = 0; var obj = {
prop1: 5,
prop2: 13,
prop3: 8
};
for each (var item in obj) { sum += item; } print(sum); // prints "26", which is 5+13+8