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

我目前正在通读这个 Jquery 掩码插件,试图了解它是如何工作的,在许多地方,作者调用的 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();
}
}
31479 次浏览

.slice()方法对数组进行(浅层)复制,并接受参数来指示要复制源数组的哪个子集。不带参数的调用只是复制整个数组。那就是:

_buffer.slice();
// is equivalent to
_buffer.slice(0);
// also equivalent to
_buffer.slice(0, _buffer.length);

编辑: 起始索引不是强制性的吗?是的。也不是。算是吧。JavaScript 引用(如 .slice()0)通常说,.slice()至少需要一个参数,即 .slice()1索引。在没有参数的情况下调用 .slice()就像是在说 .slice(undefined)。在 .slice()2中,.slice()算法的第5步是“让 relativeStart成为 ToInteger(start)”。如果您查看抽象操作 .slice()3的算法,该操作反过来又使用 .slice()4,您将看到它最终将 undefined转换为 0

尽管如此,在我自己的代码中,我总是说 .slice(0),而不是 .slice()——对我来说,它看起来更简洁。

array.slice() = 数组浅拷贝数组浅拷贝,是 Array. slice ()的缩写形式

这样做有什么原因吗,还是作者只是让代码变得比应该的更复杂?

是的,在下列情况下(我们不知道它们是否适用于所提供的守则) ,可能有一个原因:

  • checkVal()getBufferElement()修改传递给它们的数组的内容(分别作为第二个和第一个参数)。在这种情况下,代码作者希望在调用 unmaskedvalue()时防止修改 全局变量 _buffer的内容。
  • 传递给 $.map的函数异步运行。在这种情况下,代码作者希望确保传递的回调可以像在 unmaskedvalue()执行期间那样访问数组内容(例如,另一个事件处理程序可以在 unmaskedvalue()执行之后和 $.map的回调执行之前修改 _buffer内容)。

如果以上都不是,那么,是的,代码在不使用 .slice()的情况下同样可以工作。在这种情况下,代码作者可能希望采取安全措施,避免将来代码更改的 bug,这些更改可能会导致不可预见的 _buffer内容修改。

注:

当说: 防止 < strong > 全局变量 _buffer的内容被修改时,它意味着实现以下目标:

  • _buffer[0].someProp = "new value"将反映在复制的数组中。
  • _buffer[0] = "new value" 将不会反映在复制的数组中.

(为了防止上面第一个项目符号中的更改,可以使用 阵列深度克隆阵列深度克隆,但这不在讨论的上下文中)

注二:

在 ES6

var buffer = _buffer.slice();

也可以写成

var buffer = [..._buffer];