jQueryソース分析の$.map関数
4494 ワード
<pre name="code" class="javascript">// ,
// undefined, null undefined $.map() 。 if(value!=null)
var result = $.map( [1, 2, 3], $.noop );
document.writeln( result.length ); // 0
测试代码1:
var a = {'1':'gg','2':'love','4':'meimei',length:5}; // true,length 5 alert(Array.prototype.slice.call(a) instanceof Array); // undefined alert(Array.prototype.slice.call(a)[0]);
テストコード2://callback var result=$.map([1,2],function(ele,index,input) { // alert(input+" :"+arguments[2]) if(ele<=2)return " "+ele; } ,0) alert(result instanceof Array);// true,map Array 。 if if(elem<2) result " 1" alert(result[0]+result[1]);// " 1" " 2"
テストコード3:function Test() { alert("invoked!"); } alert( Test());// undefined, new , , undefined //$.map , , callback undefined //alert(undefined!=null)// false, callback ,if(value!=null) false, // value undefined,if ,
テストコード4:// ? var obj={name:"xx",sex:"female"}; //for(var i in obj){alert(i+"->"+obj[i])}// name->xx;sex->female alert($.map(obj,function(elem,index,input) { //alert(elem+"->"+elem[index]);// xx->undefined female->undefined // , obj[i] function , elem obj[i]; // : obj , , index //for ( i in elems ) { //value = callback( elems[ i ], i, arg ); // } },12)) // ? var arr=[1,2,3] $.map(arr,function(elem,index) { alert(elem+"->"+index);//1->0,2->1,3->2。index , elem arr[index]. map , ! })
テストコード5:$.map( [0,1,2], function(n){ return [ n, n + 1 ]; }); // :[0, 1, 1, 2, 2, 3] // return ret , :[[0,1], [1,2], [2,3]] // concat , .( , ; map return) var arr=[[0,1], [1,2], [2,3]]; // 6 alert(Array.prototype.concat.apply([],arr).length);
$.mapソース:まとめ:// arg is for internal usage only map: function( elems, callback, arg ) { var value, i = 0, length = elems.length, // , true false。 length , ( ) ( , // )。 , ! isArray = isArraylike( elems ), ret = []; // Go through the array, translating each of the items to their new values // , 0 , callback ,callback(elementOfArray,indexInArray) if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg );// , ! if ( value != null ) { ret.push( value ); } } } return concat.apply( [], ret ); }
(1)JSオリジナルのmapメソッドにもreturn文があり(forEachはなし)、オリジナルのjsにおけるコールバック関数の1番目のパラメータはキー値、2番目のパラメータはキー名、3番目のパラメータはオリジナルの配列である.jQueryでは主なコードがcallbackである.call(elem[i],i,args)すなわち、彼の最初のパラメータもキー値であり、2番目のパラメータもキー名であり、3番目のパラメータは追加のパラメータである(3番目のパラメータに違いがあることを示す).同時にthisにも違いがあり、JSのmapでthisはmap呼び出し時に渡される2番目のパラメータを指し、undefinedまたはnullに渡されるとwindowになりますが、ここでthisが指定されていない場合はwindowオブジェクトを指します!
インスタンスnext,prevなどのメソッドの構築には,jQueryを理解するためのコードがある.mapメソッドは特に有用です.のfnでは、jQueryを受け入れるために3つのパラメータが使用する.mapはこの関数fnに伝達するパラメータを与え,1つ目はDOM,2つ目は下付き,3つ目はここのuntilであり,同方向を遍歴したときに判断が終了する要素を表す.var ret = jQuery.map( this, fn, until );
nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }
この追加パラメータを用いてprevUntil,nextUntil,parentUntilインスタンス関数の構築を実現した.また、呼び出しオブジェクトのすべてのparentNodeを巡回すると、各呼び出しオブジェクトのDOMに対してDOMの集合が形成され、返される結果は[[elem],[elem],[elem]]タイプであるべきであり、この部分の機能はjQuery.mapで完成したvar arr=[[1,2],[3,4]]; var result=[].concat.apply([],arr); // [1, 2, 3, 4] console.log(result);
(2)Array.prototype.concat.apply([],arr)は複数の配列を結合して1つの配列オブジェクトになります!
(3)map関数は配列要素の修正を強調し(戻り値がundefinedでない場合にのみ結果配列に入れられる)、grepはフィルタリングを強調し(3番目のパラメータと比較して戻り値がtrueかfalseか)、eachは遍歴を強調し(return falseでループを終了する)