🎶 Sym - 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台

📕 思源笔记 - 一款桌面端笔记应用,支持 Windows、Mac 和 Linux

🎸 Solo - B3log 分布式社区的博客端节点,欢迎加入下一代社区网络

♏ Vditor - 一款浏览器端的 Markdown 编辑器

JavaScript 1.6

JavaScript 1.6 引入了若干新特性:E4X,新的Array方法,及数组和字符串泛型。

1. 数组扩展

七个新的Array方法可以分成两类:项(item)的定位方法和迭代方法。

项定位方法为:

1.1 indexOf(): 返回指定项首次出现的索引,没有的话,返回 -1。
语法:array.indexOf(searchElement[, fromIndex])
参数:
       searchElement    需在数组中搜索的元素
       fromIndex          开始搜索的位置,默认为 0。
描述:在数组中索引元素时,使用全等(===)
兼容性:于 ECMA-262 标准中添加,部分浏览器可能会不支持。您可以添加以下代码来进行支持。该算法严格遵循 ECMA-262 第五版,但必须保证  ObjectTypeErrorNumber, 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 第五版,但必须保证  ObjectTypeErrorNumber, Math.floor, Math.absMath.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 &gt;&gt;&gt; 0;  
    if (len === 0)  
      return -1;  
  
    var n = len;  
    if (arguments.length &gt; 1)  {  
      n = Number(arguments[1]);  
      if (n !== n)  
        n = 0;  
      else if (n !== 0 &amp;&amp; n !== (1 / 0) &amp;&amp; n !== -(1 / 0))  
        n = (n &gt; 0 || -1) * Math.floor(Math.abs(n));  
    }  
  
    var k = n &gt;= 0  
          ? Math.min(n, len - 1)  
          : len - Math.abs(n);  
  
    for (; k &gt;= 0; k--)  {  
      if (k in t &amp;&amp; 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 第五版,但必须保证  ObjectTypeError 可用,且 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 &gt;&gt;&gt; 0;  
if (typeof fun !== "function")  
  throw new TypeError();  

var thisp = arguments[1];  
for (var i = 0; i &lt; len; i++)  {  
  if (i in t &amp;&amp; !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 第五版,但必须保证  ObjectTypeError, 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 &gt;&gt;&gt; 0;  
if (typeof fun !== "function")  
  throw new TypeError();  

var res = [];  
var thisp = arguments[1];  
for (var i = 0; i &lt; 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 第五版,但必须保证  ObjectTypeError 可用,且 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 &gt;&gt;&gt; 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 &lt; len  
    while( k &lt; 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 第五版,但必须保证  ObjectTypeError, 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 &gt;&gt;&gt; 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 &lt; len  
while(k &lt; 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 第五版,但必须保证  ObjectTypeError 可用,且 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 &gt;&gt;&gt; 0;
if (typeof fun !== "function")
  throw new TypeError();

var thisp = arguments[1];
for (var i = 0; i &lt; len; i++){
  if (i in t &amp;&amp; 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

欢迎注册黑客派社区,开启你的博客之旅。让学习和分享成为一种习惯!

推荐阅读
留下你的脚步