2010-11-29 4 views
1

イム、しかし、誰もがこの1で私を助けることができる場合、私は思っていた:ジョンResig氏高度なJavascriptの質問は、私の頭の上に少しで

から取ら

http://ejohn.org/apps/learn/#43

function highest(){ 
    return arguments.slice(1).sort(function(a,b){ 
    return b - a; 
    }); 
} 
assert(highest(1, 1, 2, 3)[0] == 3, "Get the highest value."); 
assert(highest(3, 1, 2, 3, 4, 5)[1] == 4, "Verify the results."); 

私はそれを考えました

Array.prototype.highest = function(){ 
    return arguments.slice(1).sort(function(a,b){ 
    return b - a; 
    }); 
} 
assert(highest(1, 1, 2, 3)[0] == 1, "Get the highest value."); 
assert(highest(3, 1, 2, 3, 4, 5)[1] == 1, "Verify the results."); 

これは私に未定義のエラーを与えています。

+1

、間違っては、なぜあなたは 'highest'への最初のパラメータを無視しているMath.max –

答えて

6

あなたは配列上でそれを呼び出すわけではありません。

assert([].highest(1, 1, 2, 3)[0] == 1, "Get the highest value."); 
assert([].highest(3, 1, 2, 3, 4, 5)[1] == 1, "Verify the results."); 

(ほとんど[]は任意の配列になります)。しかし、まだargumentsを配列に変換しておらず、またslicecallまたはapplyと呼んだこともありませんでした。それが運動の要点です。

また、配列の内容を使用していないので意味がありません。

したがって、解決策は次のとおりです。

function highest(){ 
    return Array.prototype.slice.call(arguments, 1).sort(function(a,b){ 
    return b - a; 
    }); 
} 
+1

を再発明されましたか? –

+1

@クレセント、これは元のチュートリアルの内容です。私はそれが 'スライス 'の単なる例だと思う。 –

2

あなたが関数を定義している方法は、すべてのアレイにメソッドを追加することによって動作します:

[1,2,3].highest() 

元の関数が呼び出されることを意図しています通常の関数として:

highest(1,2,3) 

とにかく、元のコードの問題は何も気にしないhこれ。問題は、argumentsは実際に配列ではないため、sliceを呼び出す前にArray.prototype.slice.call(arguments)を使用して変換する必要があることです。

正しい答えは次のとおりです。実際には

function highest(){ 
    return Array.prototype.slice.call(arguments).slice(1).sort(function(a,b){ 
    return b - a; 
    }); 
} 
+1

はい、あなたは絶対に正しいです!私は同じものを書こうと思っていました... "引数"は "配列"ではないので、メソッド "スライス"はありません...変換が必要です。 – Zango