javascriptのforEach関数
6052 ワード
Base 2にforEachという関数を見つけました.私が見た中で一番いい実現です.掘り出して分析する.これは様々な一般的なオブジェクト、文字列、配列、およびクラスの配列を遍歴することができます.元のオブジェクトがこの関数を実行している場合、元のオブジェクトの関数を呼び出します.
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)
}
実行コード
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=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(「標準ブラウザで使ってください!)」
実行コード
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(;i
)
}
_.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(;i
)
}
_.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(「標準ブラウザで使ってください!)」
実行コード