【问题标题】:Using the Javascript slice() method with no arguments使用不带参数的 Javascript slice() 方法
【发布时间】:2012-07-02 11:17:33
【问题描述】:

我目前正在通读这个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();
    }
}

【问题讨论】:

  • 没有一个称职的程序员会让代码变得比它需要的更复杂。
  • 这是必要的。在函数的开头使用slice 方法在函数修改之前备份原始数组项,这样作者即使在编辑之后和同时也可以访问原始数组的位置、键和值大批。在制作负责任的字符串操作界面时,这是必不可少的,例如您的示例插件。补充@alex 的评论,如果它在那里,那是有原因的。如果您需要更好地理解,请按 Ctrl+F 查找源并查找稍后访问它的位置。

标签: javascript jquery


【解决方案1】:

.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() - 对我来说它看起来更整洁。

【讨论】:

  • 鉴于 array.slice() claims to require at least one argument 这真的很令人困惑
  • @meawoppl - 我已经更新了我的答案,解释了为什么它可以在没有参数的情况下工作。
  • 感谢您的无参数解释,正在寻找那个
  • “我根本不打算切这个三明治”
  • 它做了一个浅拷贝,我刚刚读过这意味着复制的对象不仅仅是复制整个数组,它似乎复制了数组,但保留了所有旧的内存引用 - 所以你改变复制数组上的字符串值,它将是两个具有不同值的不同数组,因为字符串直接作为值存储,但是您更改对象上的属性并且它会同时更新两者。我认为你在这里想要的是一个深拷贝。
猜你喜欢
  • 2015-11-07
  • 1970-01-01
  • 2020-11-17
  • 2014-06-09
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 2014-04-27
相关资源
最近更新 更多