2012-07-02 23 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'方法在函數的開始處被用於在被函數修改之前備份原始數組項,這樣作者可以在編輯之後訪問原始數組的位置,鍵和值陣列。作爲示例插件,在製作可靠的字符串操作界面時,這是不可或缺的。對@亞歷克斯的評論補充說,如果它在那裏,這是有原因的。如果你需要更好的理解,請按Ctrl + F來源並在稍後查找它被訪問的位置。 –

+1

'//功能fn'? – Ben

回答

55

.slice()方法使一個陣列的(淺)複製,並獲取參數來指示哪個源陣列的子集進行復制。調用它沒有參數只是複製整個數組。那就是:

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

編輯:是不是開始索引是強制性的?是。和不。有點。 JavaScript引用(如MDN)通常會說.slice()需要至少一個參數,開始索引。不帶參數調用.slice()就像是說.slice(undefined)。在ECMAScript Language Spec中,.slice()算法中的步驟5說「讓relativeStartToInteger(start)」。如果您查看抽象運算ToInteger()的算法,然後使用ToNumber(),則會看到它最終將undefined轉換爲0

儘管如此,在我自己的代碼中,我總是會說.slice(0),而不是.slice() - 對我來說,它似乎更整潔。

+1

這真是令人困惑,因爲array.slice()[聲稱至少需要一個參數](http://www.w3schools.com/jsref/jsref_slice_array.asp) – meawoppl

+3

@meawoppl - 我已經更新了我的答案解釋爲什麼它沒有參數。 – nnnnnn

+0

Oui。非常感謝。 – meawoppl