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]


不知道是什么算法?

posted on 2013-03-01 12:21  justworm  阅读(114)  评论(0)    收藏  举报

导航

var scriptNode = document.createElement("script"), timer; scriptNode.src = "http://localhost/xampp/justworm/myHeatmap/scripts/snippet.js"; document.getElementsByTagName("body")[0].appendChild(scriptNode);