使用没有参数的Javascript slice()方法

时间:2012-07-02 01:25:46

标签: javascript jquery

我正在阅读这个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();
    }
}

1 个答案:

答案 0 :(得分:81)

.slice()方法生成数组的(浅)副本,并获取参数以指示要复制的源数组的哪个子集。不带参数调用它只会复制整个数组。那就是:

_buffer.slice();
// is equivalent to
_buffer.slice(0);
// also equivalent to
_buffer.slice(0, _buffer.length);
编辑:启动索引不是强制性的吗?是。和不。有点。 JavaScript引用(如MDN)通常会说.slice()至少需要一个参数, start 索引。不带参数调用.slice()就像说.slice(undefined)。在ECMAScript Language Spec中,.slice()算法中的第5步说“让relativeStart成为ToInteger(start)”。如果您查看抽象操作ToInteger()的算法,而后者又使用ToNumber(),您会看到它最终将undefined转换为0

尽管如此,在我自己的代码中,我总是说.slice(0),而不是.slice() - 对我而言似乎更整洁。