ECMAScript5 신규 기능 (4)

26605 단어 브라우저prototype

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


 
이 함수는 두 개의 매개 변수가 있는데, 첫 번째는callbackfunction이고, 두 번째는 초기 값이다.
Callback function 형식:
.reduce(function(previousValue, currentValue, index, array){//...})
 
 
previousValuecurrentValue
 Array.prototype.length – 1
previousValuecurrentValue
 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


 
이 함수는 두 개의 매개 변수가 있는데, 첫 번째는callbackfunction이고, 두 번째는 초기 값이다.
 
Callback function 형식:
.reduce(function(previousValue, currentValue, index, array){
  // ...
})

 
 
 
 
previousValuecurrentValue
 Array.prototype.length – 1
previousValuecurrentValue
 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;
  	};
}
 
 

좋은 웹페이지 즐겨찾기