我正在阅读这个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();
}
}
答案 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()
- 对我而言似乎更整洁。