Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用不带参数的Javascript slice()方法_Javascript_Jquery - Fatal编程技术网

使用不带参数的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步说“让
相对启动
be
ToInteger(start)
”。如果您查看抽象操作的算法(它反过来使用),您将看到它最终将
undefined
转换为
0


不过,在我自己的代码中,我总是说
.slice(0)
,而不是
.slice()
——对我来说,这似乎更简洁。

没有一个称职的程序员会让代码变得比需要的更复杂。这是必要的。函数开始时使用
slice
方法在函数修改之前备份原始数组项,这样,即使在编辑数组之后和编辑数组时,作者也可以访问原始数组的位置、键和值。这在创建负责任的字符串操作界面时是必不可少的,例如您的示例插件。作为对@alex评论的补充,如果有,那是有原因的。Ctrl+F源代码,如果您需要更好的理解,请稍后查找访问它的位置。鉴于array.slice()@meawoppl-我更新了我的答案,解释了为什么它在没有参数的情况下工作。感谢没有参数的解释,我想知道“我要切这个三明治,一点也不”它创建了一个浅拷贝,我刚刚读到,这意味着复制的对象不仅仅是复制整个数组,它似乎复制了数组,但保留了所有旧的内存引用-因此在复制的数组上更改一个字符串值,它将是两个不同的数组,具有不同的值,因为字符串直接作为值存储,但是您更改了对象的属性,它会同时更新这两个属性。我想你想要的是一份深度拷贝。