65

我目前正在通读这个jquery masking plugin以尝试了解它是如何工作的,并且在许多地方,作者调用了slice()没有参数传递给它的函数。例如,这里的_buffer变量是slice()d,_buffer.slice()并且_buffer似乎保持相同的值。

这样做有什么理由,还是作者只是让代码比它应该的更复杂?

 //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();
    }
}
4

1 回答 1

104

.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中,算法的第 5 步.slice()说“Let relativeStartbe ToInteger(start)”。如果您查看抽象操作的算法,ToInteger()然后使用它ToNumber(),您会发现它最终转换undefined0.

尽管如此,在我自己的代码中,我总是会说.slice(0),不是.slice()- 对我来说它看起来更整洁。

于 2012-07-02T01:31:48.040 回答