javascriptのforEach関数

6052 ワード

Base 2にforEachという関数を見つけました.私が見た中で一番いい実現です.掘り出して分析する.これは様々な一般的なオブジェクト、文字列、配列、およびクラスの配列を遍歴することができます.元のオブジェクトがこの関数を実行している場合、元のオブジェクトの関数を呼び出します.

    function forEach(object, block, context, fn) {
      if (object == null) return;
      if (!fn) {
        if (typeof object == "function" && object.call) {
          //      
          fn = Function;
        } else if (typeof object.forEach == "function" && object.forEach != arguments.callee) {
          //         forEach  ,       forEach  (       Array  )
          object.forEach(block, context);
          return;
        } else if (typeof object.length == "number") {
          //          IE     
          _Array_forEach(object, block, context);
          return;
        }
      }
      _Function_forEach(fn || Object, object, block, context);
    };

    function _Array_forEach(array, block, context) {
      if (array == null) return;
      var i = 0,length = array.length;
      if (typeof array == "string") {
        for (; i < length; i++) {
          block.call(context, array.charAt(i), i, array);
        }
      }else{
        for (;i < length; i++) {
          block.call(context, array[i], i, array);
        }
      }
    };

  
      _Function_forEach = function(fn, object, block, context) {
        //    fn  Function
        for (var key in object) {
           //       
           if (object.hasOwnProperty(key)) {
            //     block(object[key], key)
            block.call(context, object[key], key, object);
          }
        }
      };
 
原作者のいくつかの例(私はFQをかき集めました!):

  function print(el,index){
    alert(index+"  :  "+el)
  }
  forEach ([1, 2, 3], print);
  forEach ({a: "aa", b: "bb",c: "cc"}, print);
  forEach ("    ", print);
  forEach(document.styleSheets,function(el){
    if(el.href) alert(el.href)
  });
function forEach(object、block、context、fn){
if(object==null)return;
if(!fn){
if(typeof object="function"&object.call){
//通常のオブジェクトを巡回
fn=Function;
}else if(typeof object.forEach==「function」&&object.forEach!=argments.callee){
//もし目標がすでにforEach方法を実現しているなら、それ自身のforEach方法を使用する(標準的な遊覧器のArayオブジェクトのような)
object.forEach(block、context);
return;
}else if(typeof object.length==「number」){
//クラス配列オブジェクトまたはIEの配列オブジェクトである場合
_Aray forEach(object、block、context);
return;
)
)
_FunctionuforEach(fn𞓜Object、object、block、context)

function_Aray_forEach(array、block、context){
if(array==null)return;
var i=0、length=array.length;
if(typeof array==「string」)
array=array.split(");
for(;iblock.call(context,array[i],i,array);
)

_.Function_forEach=function(fn,object,block,context)
//ここのfnは常にFunctionです.
for(var key in object){
//ローカル属性のみを巡回
if(object.hasOwn Property){
//block(object[key],key)に相当します.
block.call(context,object[key],key,object);
)
)

function print(el,index){
alert(index+「:」+el)
)
forEach([1,2,3],print);
forEach({a:「aa」、b:「bb」、c:「cc」、print)
forEach(「司徒正美」、print)
forEach(document.style Sheets,function){
if(el.href)alert(el.href)

実行コード

    function Person(name, age) {
      this.name = name || "";
      this.age = age || 0;
    };
  
    
    var fred = new Person("Fred", 38);
    fred.language = "English";//    
    fred.wife = "Wilma";//    
    forEach(fred,print)
  
function forEach(object、block、context、fn){
if(object==null)return;
if(!fn){
if(typeof object="function"&object.call){
//通常のオブジェクトを巡回
fn=Function;
}else if(typeof object.forEach==「function」&&object.forEach!=argments.callee){
//もし目標がすでにforEach方法を実現しているなら、それ自身のforEach方法を使用する(標準的な遊覧器のArayオブジェクトのような)
object.forEach(block、context);
return;
}else if(typeof object.length==「number」){
//クラス配列オブジェクトまたはIEの配列オブジェクトである場合
_Aray forEach(object、block、context);
return;
)
)
_FunctionuforEach(fn𞓜Object、object、block、context)

function_Aray_forEach(array、block、context){
if(array==null)return;
var i=0、length=array.length;
if(typeof array==「string」)
array=array.split(");
for(;iblock.call(context,array[i],i,array);
)

_.Function_forEach=function(fn,object,block,context)
//ここのfnは常にFunctionです.
for(var key in object){
//ローカル属性のみを巡回
if(object.hasOwn Property){
//block(object[key],key)に相当します.
block.call(context,object[key],key,object);
)
)

function print(el,index){
alert(index+「:」+el)
)
function Person(name,age){
this.name=name 124";
this.age=age 1240

var fred=new Person(「Fred」、38)
fred.langage=「English」極晩バインディング
fred.wife=「Wilma」極晩バインディング
forEach(fred、print)
実行コード
Base 2ではunbindという方法も提供されています.元のオブジェクトのforEach方法を剥離して呼び出します.

    var _slice = Array.prototype.slice;
    function unbind(fn) {
      return function(context) {
        return fn.apply(context, _slice.call(arguments, 1));
      };
    };
try{
var_slice=Aray.prototype.slice;
function unbind(fn){
return function(context){
return fn.apply(context,cau slice.cal(argments,1);


function print(el,index){
alert(index+「:」+el)
)
var each=unbind(Aray.prototype[「forEach」)
var a={cc:function(e){alert}
each([[11111],22222]],a.c]//最後のaがあってもいいですか?
}catch(e){alert(「標準ブラウザで使ってください!)」
実行コード