arguments对象的学习笔记-一个例子
由一个例子引出的思考:
//#47: We can use call and apply to build a solution. //源码网址:http://ejohn.org/apps/learn/#47 //作者:John Resig. function multiMax(multi){ // Make an array of all but the first argument var allButFirst = Array().slice.call( arguments, 1 ); // Find the largest number in that array of arguments var largestAllButFirst = Math.max.apply( Math, allButFirst ); // Return the multiplied result return multi * largestAllButFirst; } assert( multiMax(3, 1, 2, 3) == 9, "3*3=9 (First arg, by largest.)" );
自写demo:
1 function multiMax(multi){ 2 var data = arguments; 3 var allButFirst = function(){ 4 return Array().slice.call(data).slice(1); 5 }; 6 var largestAllButFirst = allButFirst().sort( 7 function(a,b){ 8 return b-a; 9 })[0]; 10 return multi * largestAllButFirst; 11 } 12 console.log( multiMax(3, 1, 2, 3) );
>> 9
1,Array().slice.call()是什么?
slice方法返回一个新数组;
Array().slice.call(array) 相当于 [].slice.call(array) 相当于 array.slice()
2,为什么直接call(arguments)不可以?
因为allButFirst 函数和multiMax函数的arguments对象是不一样的
3,为什么不可以这样写 Array().slice(1).call(data);
因为call本身就是调用,这样其实是==data.slice(1)();
关于 call()方法、arguments对象;Array().slice方法 的疑问:
funcA.call(thisArg,arg1,arg2);
在thisArg下,传入参数arg1,arg2,调用funcA。
thisArg.funcA(arg1,arg2);
var a="window"; var b ={ funcB: function(){ console.log(this.a); } }; var c = { a:"c"; }; b.funcB.call(window); b.funcB.call(c);
不能说是谁调用了它(window调用它),而是“让this指向了谁”
Array() 就是 [] ? 表达的是这个意思(new Array())
关于sort()的疑问:
function highest(){
return Array().slice.call((arguments).sort(function(a,b){
return b - a;
});
}
自写demo:
1 var values = [0,1,2,3,4]; 2 values.sort(function(a,b){ 3 return b - a; 4 }); 5 console.log(values);
>>[4, 3, 2, 1,0]
能明白是让它降序输入,但这是怎么执行的呢?
里面是个算法:
添加console.log(a+"<>"+b);可看到sort()的排序算法:
values.sort(function(a,b){
console.log(values);
console.log(a+"<>"+b);
return b - a;
});
[0, 1, 2, 3, 4]
0<>1
[1, 0, 2, 3, 4]
0<>2
[1, 0, 0, 3, 4]
1<>2
[2, 1, 0, 3, 4]
0<>3
[2, 1, 0, 0, 4]
1<>3
[2, 1, 1, 0, 4]
2<>3
[3, 2, 1, 0, 4]
0<>4
[3, 2, 1, 0, 0]
1<>4
[3, 2, 1, 1, 0]
2<>4
[3, 2, 2, 1, 0]
3<>4
[4, 3, 2, 1, 0]
不知道是什么算法?
浙公网安备 33010602011771号