Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 757|回复: 0

ECMAScript5 新特性(四)

[复制链接]

该用户从未签到

发表于 2011-10-29 08:22:50 | 显示全部楼层 |阅读模式
  
Function 17: Array.prototype.lastIndexOf
用法和16相似,取得最后一次出现的index
如果浏览器没有实现此方法,你可以通过这种方式实现


java代码
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)   
                    n = 0;   
                else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))   
                    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;   
      };   
}   
  
Function 17: Array.prototype.lastIndexOf   
用法和16相似,取得最后一次出现参数的index   
如果浏览器没有实现此方法,你可以通过这种方式实现   
    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 > 0) {   
                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);   
  
            while (k >= 0) {   
                if (k in t && t[k] === searchElement)   
                        return k;   
                    }   
                    return -1;   
          };   
    }  

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)
                    n = 0;
                  else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
                    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;
      };
}

Function 17: Array.prototype.lastIndexOf
用法和16相似,取得最后一次出现参数的index
如果浏览器没有实现此方法,你可以通过这种方式实现
    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 > 0) {
                  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);

            while (k >= 0) {
                  if (k in t && t[k] === searchElement)
                        return k;
                    }
                    return -1;
            };
    }


Function 18: Array.prototype.every

对于数组中的每一项都执行某个callback function,这个function的参数为当前数组元素,当前元素index,整个数组。当function中返回为false的时候,停止循环数组。仅当返回为true的时候继续循环

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

function isBigEnough(element, index, array) {
    return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// passed is true
当浏览器没有实现此方法时,可以用以下方式代替

Js代码
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, t))   
                        return false;   
            }   
  
            return true;   
    };   
}  

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, t))
                        return false;
            }

            return true;
      };
}



Function 19: Array.prototype.some
大致意思和every有些相似,当数组中有一个元素符合要求,就会返回true。所以callback中,一旦返回true,就不再循环,返回false则继续循环。

Js代码
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  

    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


当浏览器不支持的时候,你可以用以下代码代替

Java代码
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, t))   
                return true;   
            }   
  
            return false;   
    };   
}  

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, t))
                return true;
            }

            return false;
      };
}


Function 20: Array.prototype.forEach

此函数对数组的所有元素循环执行一个callback function

Js代码
       function printElt(element, index, array) {   
    print("[" + index + "] is " + element); // assumes print is already defined   
}   
[2, 5, 9].forEach(printElt);   
// Prints:   
// [0] is 2   
// [1] is 5   
// [2] is 9  

        function printElt(element, index, array) {
        print("[" + index + "] is " + element); // assumes print is already defined
    }
    [2, 5, 9].forEach(printElt);
    // Prints:
    // [0] is 2
    // [1] is 5
    // [2] is 9
当浏览器没有实现的时候,你可以通过如下方法代替



Js代码
if (!Array.prototype.forEach) {   
    Array.prototype.forEach = 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, t);   
            }   
    };   
}  

if (!Array.prototype.forEach) {
      Array.prototype.forEach = 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, t);
            }
      };
}  

Function 21: Array.prototype.map
循环数组每个元素,用于执行callback,之后返回循环结果作为一个新数组,而原数组不变.
Sample1:

Js代码
function makePseudoPlural(single) {   
    return single.replace(/o/g, "e");   
}   
  
var singles = ["foot", "goose", "moose"];   
var plurals = singles.map(makePseudoPlural);   
// plurals is ["feet", "geese", "meese"]   
// singles is unchanged<SPAN style="WHITE-SPACE: normal"> </SPAN>  

function makePseudoPlural(single) {
      return single.replace(/o/g, "e");
}

var singles = ["foot", "goose", "moose"];
var plurals = singles.map(makePseudoPlural);
// plurals is ["feet", "geese", "meese"]
// singles is unchanged  
Sample2


Js代码
var numbers = [1, 4, 9];   
var roots = numbers.map(Math.sqrt);   
// roots is now [1, 2, 3]   
// numbers is still [1, 4, 9]  

var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
// roots is now [1, 2, 3]
// numbers is still [1, 4, 9]

如果浏览器没有实现,则可以用如下方法代替

Java代码
if (!Array.prototype.map) {   
    Array.prototype.map = 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 = new Array(len);   
            var thisp = arguments[1];   
        for (var i = 0; i < len; i++) {   
                   if (i in t)   
                         res = fun.call(thisp, t, i, t);   
        }   
  
        return res;   
};  

if (!Array.prototype.map) {
      Array.prototype.map = 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 = new Array(len);
            var thisp = arguments[1];
         for (var i = 0; i < len; i++) {
                     if (i in t)
                         res = fun.call(thisp, t, i, t);
        }

        return res;
};



Function 22: Array.prototype.filter

从数组中筛选出符合callback条件的元素,如果callback中返回true,则此元素会被加入到新数组中

Js代码
function isBigEnough(element, index, array) {   
    return (element >= 10);   
}   
// 12, 130, 44   
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);  

function isBigEnough(element, index, array) {
    return (element >= 10);
}
// 12, 130, 44
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
如果浏览器没有实现,则可以用如下方式代替:

Js代码
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; // in case fun mutates this   
                    if (fun.call(thisp, val, i, t))   
                        res.push(val);   
                }   
        }   
        return res;   
    };   
}  

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; // in case fun mutates this
                    if (fun.call(thisp, val, i, t))
                          res.push(val);
                }
        }
        return res;
    };
}  

Function 23: Array.prototype.reduce

这个函数有两个参数,第一个为callback function,第二个为初始值。
Callback function的格式为:
.reduce(function(previousValue, currentValue, index, array){ // ...})


如果没有设置初始值, previousValue从第一个元素开始, currentValue从第二个元素开始循环。
总共循环Array.prototype.length – 1次。
如果设置了初始值,previousValue从初始值开始,currentValue从第一个元素开始循环。
总共循环Array.prototype.length次。
最后返回最后一次callback function调用的结果.
Sample:Js代码 var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });   // total == 6     var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {       return a.concat(b);   });   // flattened is [0, 1, 2, 3, 4, 5]  var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });
// total == 6

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

如果浏览器没有实现,则可用以下代码代替





Js代码
if (!Array.prototype.reduce) {   
    Array.prototype.reduce = function(fun /*, initialValue */) {   
            "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();   
  
            // no value to return if no initial value and an empty array   
            if (len == 0 && arguments.length == 1)   
                   throw new TypeError();   
  
            var k = 0;   
            var accumulator;   
            if (arguments.length >= 2) {   
                   accumulator = arguments[1];   
            } else {   
                   do {   
                    if (k in t) {   
                        accumulator = t[k++];   
                        break;   
                    }   
  
                    // if array contains no values, no initial value to return   
                        if (++k >= len)   
                        throw new TypeError();   
                    } while (true);   
            }   
  
            while (k < len) {   
                    if (k in t)   
                    accumulator = fun.call(undefined, accumulator, t[k], k, t);   
                    k++;   
            }   
  
            return accumulator;   
    };   
}  

if (!Array.prototype.reduce) {
      Array.prototype.reduce = function(fun /*, initialValue */) {
            "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();

            // no value to return if no initial value and an empty array
            if (len == 0 && arguments.length == 1)
                     throw new TypeError();

            var k = 0;
            var accumulator;
            if (arguments.length >= 2) {
                     accumulator = arguments[1];
            } else {
                     do {
                    if (k in t) {
                          accumulator = t[k++];
                          break;
                    }

                    // if array contains no values, no initial value to return
                            if (++k >= len)
                          throw new TypeError();
                      } while (true);
            }

            while (k < len) {
                      if (k in t)
                    accumulator = fun.call(undefined, accumulator, t[k], k, t);
                      k++;
            }

            return accumulator;
    };
}  


Function 24: Array.prototype.reduceRight

这个函数有两个参数,第一个为callback function,第二个为初始值。

Callback function的格式为:
.reduce(function(previousValue, currentValue, index, array){
  // ...
})



如果没有设置初始值, previousValue从最后一个元素开始, currentValue从倒数第二个元素开始循环。
总共循环Array.prototype.length – 1次。
如果设置了初始值,previousValue从初始值开始,currentValue从最后一个元素开始循环。
总共循环Array.prototype.length次。
最后返回最后一次callback function调用的结果.Sample:
Js代码 var total = [0, 1, 2, 3].reduceRight(function(a, b) { return a + b; });   //total == 6     var flattened = [[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) {       return a.concat(b);   }, []);   // flattened is [4, 5, 2, 3, 0, 1]  var total = [0, 1, 2, 3].reduceRight(function(a, b) { return a + b; });
//total == 6

var flattened = [[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) {
      return a.concat(b);
}, []);
// flattened is [4, 5, 2, 3, 0, 1]
如果浏览器没有实现,则可以用如下代码代替
Js代码 if (!Array.prototype.reduceRight) {       Array.prototype.reduceRight = function(callbackfn /*, initialValue */) {               "use strict";                 if (this === void 0 || this === null)                       throw new TypeError();                 var t = Object(this);               var len = t.length >>> 0;               if (typeof callbackfn !== "function")                       throw new TypeError();                 // no value to return if no initial value, empty array               if (len === 0 && arguments.length === 1)                       throw new TypeError();                 var k = len - 1;               var accumulator;               if (arguments.length >= 2) {                       accumulator = arguments[1];               } else {                       do {                           if (k in this) {                           accumulator = this[k--];                           break;                       }                         // if array contains no values, no initial value to return                           if (--k < 0)                                   throw new TypeError();                        } while (true);               }                 while (k >= 0) {                         if (k in t)                       accumulator = callbackfn.call(undefined, accumulator, t[k], k, t);                         k--;               }             return accumulator;       };   }  if (!Array.prototype.reduceRight) {
      Array.prototype.reduceRight = function(callbackfn /*, initialValue */) {
            "use strict";

            if (this === void 0 || this === null)
                      throw new TypeError();

            var t = Object(this);
            var len = t.length >>> 0;
            if (typeof callbackfn !== "function")
                      throw new TypeError();

            // no value to return if no initial value, empty array
            if (len === 0 && arguments.length === 1)
                      throw new TypeError();

            var k = len - 1;
            var accumulator;
            if (arguments.length >= 2) {
                      accumulator = arguments[1];
            } else {
                      do {
                            if (k in this) {
                          accumulator = this[k--];
                          break;
                    }

                    // if array contains no values, no initial value to return
                            if (--k < 0)
                                  throw new TypeError();
                       } while (true);
            }

            while (k >= 0) {
                        if (k in t)
                    accumulator = callbackfn.call(undefined, accumulator, t[k], k, t);
                        k--;
            }

        return accumulator;
      };
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-15 00:41 , Processed in 0.382881 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表