2012-07-02 28 views
34

私は現在、このjquery masking pluginを読んでいて、それがどのように動作するかを理解しています。また、多数の場所で、引数を渡さないでslice()関数を呼び出します。例えば、_buffer変数はslice()dであり、_buffer.slice()_bufferは同じ値を保持しているようです。引数なしのJavascript slice()メソッドを使用する

これを行う理由はありますか、コードをもっと複雑にするだけの作者ですか?

//functionality fn 
function unmaskedvalue($input, skipDatepickerCheck) { 
    var input = $input[0]; 
    if (tests && (skipDatepickerCheck === true || !$input.hasClass('hasDatepicker'))) { 
     var buffer = _buffer.slice(); 
     checkVal(input, buffer); 
     return $.map(buffer, function(element, index) { 
      return isMask(index) && element != getBufferElement(_buffer.slice(), index) ? element : null; }).join(''); 
    } 
    else { 
     return input._valueGet(); 
    } 
} 
+0

プログラマーは、必要以上に複雑なコードを作成することはありません。 – alex

+1

それは必要です。 'slice'メソッドは関数の最初に、関数によって変更される前に元の配列項目をバックアップするために使用されています。この方法では、作成者は編集後および編集中に元の配列の位置、キーおよび値にアクセスできます。アレイ。これは、プラグインの例として責任ある文字列操作インタフェースを作成する際に不可欠です。 @ alexのコメントを補完する、それがあればそれには理由がある。 Ctrl + Fキーを押してソースを確認し、後でアクセスする場所を探します。 –

+1

'//機能fn'? – Ben

答えて

55

.slice()方法は、アレイの(浅い)コピーを作成し、そしてコピーするソース配列のどのサブセットを示すためのパラメータを取り。引数なしで呼び出すと、配列全体がコピーされます。つまり、

_buffer.slice(); 
// is equivalent to 
_buffer.slice(0); 
// also equivalent to 
_buffer.slice(0, _buffer.length); 

EDIT:開始インデックスは必須ではありませんか?はい。そして、いいえ。並べ替えMDNのようなJavaScriptリファレンスでは、.slice()には少なくとも1つの引数が必要とされ、のインデックスを開始します。引数のない.slice()を呼び出すのは、.slice(undefined)です。 ECMAScript Language Specでは、.slice()アルゴリズムのステップ5で「relativeStartToInteger(start)とする」と表示されます。抽象操作ToInteger()のアルゴリズムを調べて、ToNumber()を使用すると、undefinedから0に変換されます。

でも、私自身のコードでは、いつも.slice(0)と言っていますが、.slice()ではありません。

+1

これは、array.slice()が少なくとも1つの引数を必要としていることを考えると、本当に混乱しています。(http://www.w3schools.com/jsref/jsref_slice_array.asp) – meawoppl

+3

@meawoppl - なぜそれが引数なしで動作するのか説明してください。 – nnnnnn

+0

Oui。本当にありがとう。 – meawoppl

関連する問題