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

use*_*596 53 javascript jquery

我正在阅读这个jquery masking插件,试图理解它是如何工作的,并且在许多地方,作者调用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

nnn*_*nnn 87

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

_buffer.slice();
// is equivalent to
_buffer.slice(0);
// also equivalent to
_buffer.slice(0, _buffer.length);
Run Code Online (Sandbox Code Playgroud)

编辑:是不是必须的起始索引?是.和不.有点.JavaScript引用(如MDN)通常说.slice()需要至少一个参数,即起始索引..slice()没有争论的召唤就像说.slice(undefined).在ECMAScript语言规范中,.slice()算法中的步骤5显示"Let relativeStartbe ToInteger(start)".如果你看一下抽象操作的算法ToInteger(),而后者又会使用ToNumber(),你会看到它最终转换undefined0.

不过,在我自己的代码中,我会一直说.slice(0),不是.slice()- 对我而言似乎更整洁.

  • "我根本不会切这个三明治" (9认同)
  • @meawoppl - 我已经更新了我的答案来解释为什么它没有参数. (4认同)
  • 感谢您的无参数解释,正在寻找 (3认同)
  • 鉴于array.slice()声称需要至少一个参数,这实在令人困惑(http://www.w3schools.com/jsref/jsref_slice_array.asp) (2认同)
  • 它做了一个浅拷贝,我刚刚读到这意味着复制的对象不仅仅是复制整个数组,它似乎复制了数组,但保留了所有旧的内存引用 - 所以你更改复制的数组上的字符串值并且它将是两个具有不同值的不同数组,因为字符串直接存储为值,但是您更改对象上的属性并且它会更新两者。我认为你想要的是一个深拷贝。 (2认同)