`
rainsilence
  • 浏览: 158927 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ECMAScript5 新特性(四)

阅读更多

 

Function 17: Array.prototype.lastIndexOf

用法和16相似,取得最后一次出现的index

如果浏览器没有实现此方法,你可以通过这种方式实现

 

 

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的时候继续循环

 

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

 

 当浏览器没有实现此方法时,可以用以下方式代替

 

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;
  	};
}

 

 

 

Function 19: Array.prototype.some

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

 

	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

 

 

 

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

 

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;
  	};
}

 

 

 

Function 20: Array.prototype.forEach

 

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

 

        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

 

 当浏览器没有实现的时候,你可以通过如下方法代替

 

 

 

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], i, t);
    		}
  	};
}
 

 

Function 21: Array.prototype.map

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

Sample1:

 

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

 

 

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

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

 

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[i] = fun.call(thisp, t[i], i, t);
    	}

    	return res;
};

 

 

 

Function 22: Array.prototype.filter

 

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

 

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

 

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

 

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;
	};
}
 

 

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:
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]
 

 

 

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

 

 

 

 

 

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
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]
 
如果浏览器没有实现,则可以用如下代码代替
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;
  	};
}
 

 

分享到:
评论
1 楼 panxi620 2011-05-11  
虽然是教学,但是能否下次贴字上来大些,很伤眼睛

相关推荐

    ECMAscript常用新特性积累1

    ECMAscript常用新特性积累1

    ECMAScript 6新特性

    本人看过《深入浅出ES6》后把一百多页去除水分,总结成十来页的文档,方便快速入门。

    ECMAScript6 新特性范例大全

    本文没有详细描述这些新特性,因为网上都已经有很多相关的介绍了。主要针对ES6 新特性收集了相关范例代码,他可以让你快速了解这个新的javascript规范

    浅谈ECMAScript6新特性之let、const

    下面小编就为大家带来一篇浅谈ECMAScript6新特性之let、const。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    ECMAScript Second Edition javascript新特性2018年7月最新版本

    ECMAScript Second Edition javascript新特性2018年7月最新版本

    JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性

    通常而言,JavaScript由ECMAScript核心、BOM和DOM三部分构成,前面的文章将ECMAScript核心部分粗略的过了一

    ECMAScript 6 入门.epub 201806

    《ECMAScript 6 入门》是一本开源的 JavaScript 语言教程,全面介绍 ECMAScript 6 新引入的语法特性。 本书覆盖 ES6 与上一个版本 ES5 的所有不同之处,对涉及的语法知识给予详细介绍,并给出大量简洁易懂的示例代码...

    ECMAScript 6入门.pdf

    《ECMAScript 6入门》是一本开源的JavaScript语言教程,全面介绍ECMAScript 6新引入的语法特性。

    ECMAScript6入门.zip

    《ECMAScript 6入门》是一本开源的JavaScript语言教程,全面介绍ECMAScript 6新引入的语法特性。 本书力争覆盖ES6与ES5的所有不同之处,对涉及的语法知识给予详细介绍,并给出大量简洁易懂的示例代码。 本书为中级...

    ES6(ECMAScript 6)新特性之模板字符串用法分析

    主要介绍了ES6(ECMAScript 6)新特性之模板字符串用法,简单介绍了ES6模板字符串的概念、功能并结合实例形式分析了ES6模板字符串的用法,需要的朋友可以参考下

    ECMAScript6入门

    《ECMAScript6入门》全面介绍了ECMAScript6新引入的语法特性,覆盖了ECMAScript6与ECMAScript5的所有不同之处,对涉及的语法知识给予了详细介绍,并给出了大量简洁易懂的示例代码。, 《ECMAScript6入门》为中级难度...

    ECMAScript 6 入门.epub

    《ECMAScript 6 入门》是一本开源的 JavaScript 语言教程,全面介绍 ECMAScript 6 新引入的语法特性。 本书覆盖 ES6 与上一个版本 ES5 的所有不同之处,对涉及的语法知识给予详细介绍,并给出大量简洁易懂的示例...

    ECMAScript 5严格模式(Strict Mode)介绍

    严格模式(Strict Mode)是ECMAScript 5的新特性,它允许你把整个程序,或者某个函数,放置在“严格”的操作语境中。这种严格的语境会防止某些特定的操作并抛出更多的异常。 虽然ECMAScript 5对ECMAScript 3是向下...

    ECMAScript6的新特性箭头函数(Arrow Function)详细介绍

    箭头函数是ECMAScript 6最受关注的更新内容之一。它引入了一种用「箭头」(=&gt;)来定义函数的新语法,它…它碉堡了~。箭头函数与传统的JavaScript...只能使用显式命名或其他ES6新特性来完成。这些差异的存在是有理可循的

    一本开源的 JavaScript 语言教程,全面介绍 ECMAScript 6 新增的语法特性

    一本开源的 JavaScript 语言教程,全面介绍 ECMAScript 6 新增的语法特性

    ECMAscript2018规范

    资源名称:ECMAscript2018规范内容简介:ECMAscript 2018(第九版 JS)已于 6 月底正式发布,带来了许多新特性。ECMAscript 2018 于今年2月出炉草案,TC39 技术委员会每两个月开会一次,讨论当前...

    ECMAScript 基础知识

    JavaScript的核心之一ECMAScript的语言特性和Java、C、Perl都有许多相似之处,其中不少特性都是从这些语言借鉴而来,同时它们之间也存在许多差异。下面列举一些ECMAScript的基本特性。 –和Java一样,ECMAScript区分...

Global site tag (gtag.js) - Google Analytics