【问题标题】:Why does this piece of javascript gives different results?为什么这段 javascript 会给出不同的结果?
【发布时间】:2015-11-16 00:51:50
【问题描述】:
function H() {

 }

H.prototype.K = function() {
      console.log(Array.prototype.slice.call(arguments, 1)); //gives [20, 30, 40]
      console.log(Array.prototype.slice(arguments, 1)); //gives []
   }

 H.prototype.K(10, 20, 30, 40)

为什么直接调用 slice 会给出空数组?如果我可以直接调用函数K,为什么不能直接调用slice?

【问题讨论】:

  • 鉴于您致电H.prototype.K(...),您似乎不了解如何使用原型继承的一些基础知识。应该很少这样做。
  • This answer 可能会帮助您更好地理解这样做的原因。
  • Array.prototype.slice(arguments, 1) 等价于Array.prototype.slice.call(Array.prototype, arguments, 1)。请注意,call 始终接受上下文作为第一个参数。这应该更容易追踪行为..
  • 因为Array.prototype是一个空数组。

标签: javascript prototype call slice


【解决方案1】:

Array.prototype.slice(arguments, 1) 似乎正在通过Array.prototype 呼叫.slice()

见Array.prototype.slice(),Function.prototype.call()

arr.slice([begin[, end]])

参数

开始

从零开始提取的索引。作为负指数, begin 表示从序列末尾的偏移量。切片(-2) 提取序列中的最后两个元素。如果省略了开始, 切片从索引 0 开始。


console.log(Array.prototype); // `[]` 
console.log(Array.prototype.slice()); // `[]`
console.log(Array.prototype.slice([10, 20, 30, 40], 1)); // `[]`
console.log(Array.prototype.slice.call([10, 20, 30, 40] , 1)); // `[20, 30, 40]`
console.log([].slice([10, 20, 30, 40], 1)); // `[]`
console.log([].slice.call([10, 20, 30, 40] , 1)); // `[20, 30, 40]`

【讨论】:

  • 抱歉延迟回复。
【解决方案2】:

当您直接调用该函数时,它会获得不同的上下文。当作为方法调用时,上下文是 arguments 数组,但当您直接调用它时,上下文将是 Array.prototype 对象。

第二次调用不会尝试从arguments 数组中获取项目,它会尝试从Array.prototype 数组(充当空数组)中获取项目,使用arguments 作为第一个索引和@ 987654326@ 为长度。

【讨论】:

  • “上下文”是Array.prototype,它是一个数组(或者看起来很像)。
  • 好吧,我将参数保存到本地 args 并在 args 上执行 slice,仍然得到空数组。
  • @HarshSavla:你是如何将参数保存到 args 的?如果你只是将参数分配给一个变量,那么你只是对同一个对象有另一个引用。
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2014-02-01
  • 2021-08-26
  • 2012-09-27
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多