使用不带参数的Javascript slice()方法
我目前正在通读这篇文章,试图了解它是如何工作的,在许多地方,作者调用了使用不带参数的Javascript slice()方法,javascript,jquery,Javascript,Jquery,我目前正在通读这篇文章,试图了解它是如何工作的,在许多地方,作者调用了slice()函数,不向其传递任何参数。例如,这里的\u buffer变量是slice()d,而\u buffer.slice()和\u buffer似乎持有相同的值 这样做有什么原因吗,或者作者只是让代码变得比应该的更复杂 //functionality fn function unmaskedvalue($input, skipDatepickerCheck) { var input = $input[0];
slice()
函数,不向其传递任何参数。例如,这里的\u buffer
变量是slice()
d,而\u buffer.slice()
和\u 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();
}
}
.slice()
方法生成数组的(浅层)副本,并使用参数指示要复制的源数组子集。不带参数调用它只会复制整个数组。即:
_buffer.slice();
// is equivalent to
_buffer.slice(0);
// also equivalent to
_buffer.slice(0, _buffer.length);
编辑:开始索引不是必须的吗?对不,有点。JavaScript引用(如)通常表示.slice()
至少需要一个参数,即开始索引。不带参数调用.slice()
就像说.slice(未定义)
。在中,.slice()
算法中的第5步说“让相对启动
beToInteger(start)
”。如果您查看抽象操作的算法(它反过来使用),您将看到它最终将undefined
转换为0
不过,在我自己的代码中,我总是说
.slice(0)
,而不是.slice()
——对我来说,这似乎更简洁。没有一个称职的程序员会让代码变得比需要的更复杂。这是必要的。函数开始时使用slice
方法在函数修改之前备份原始数组项,这样,即使在编辑数组之后和编辑数组时,作者也可以访问原始数组的位置、键和值。这在创建负责任的字符串操作界面时是必不可少的,例如您的示例插件。作为对@alex评论的补充,如果有,那是有原因的。Ctrl+F源代码,如果您需要更好的理解,请稍后查找访问它的位置。鉴于array.slice()@meawoppl-我更新了我的答案,解释了为什么它在没有参数的情况下工作。感谢没有参数的解释,我想知道“我要切这个三明治,一点也不”它创建了一个浅拷贝,我刚刚读到,这意味着复制的对象不仅仅是复制整个数组,它似乎复制了数组,但保留了所有旧的内存引用-因此在复制的数组上更改一个字符串值,它将是两个不同的数组,具有不同的值,因为字符串直接作为值存储,但是您更改了对象的属性,它会同时更新这两个属性。我想你想要的是一份深度拷贝。