javascript splice负数与变数

上代碼

const pressed=[]
const code='hello'


window.addEventListener('keyup',(e)=>{
  console.log(e.key)
  pressed.push(e.key)
  pressed.splice(-code.length-1, pressed.length-code.length)  //? - 5
  console.log(pressed)
  console.log(pressed.length-code.length)
  
  
  if(pressed.join('').includes(code)){
     console.log('chun chun')
     cornify_add()
     }
})

功能大约是监听keyup的动作, 按了什么键就补进array那个键, 直到array的长度到达code的长度,

例如:

['a']   //按a
['a','b'] //按b
['a','b','c'] //按c
['a','b','c','d'] //按d
['a','b','c','d','e'] //按e
['a','b','c','d','h'] //按h
['a','b','c','h','e'] //按e
['a','b','h','e','l'] //按l
['a','h','e','l','l'] //按l
['h','e','l','l','o'] //按o
//这时候触动cornify特效

也可以看線上演示codepen

其中splice的部分一直都搞不懂,
array的splice()方法是这样的

arr.splice(index, how-many, what)

但在上例, 我现在直接在console上调适

-code.length-1 是 -6

pressed.length-code.length則是從-4 開始到 0

那么我直接 var arr = ['s','t','r','i','n','g']

arr.splice(-6,-1) 却返回空数组

但查看一下arr还是 ['s','t','r','i','n','g']

照理来说splice应该会改变原阵列? 直接变成返回的阵列?

还是我有哪边理解错误的地方

有大神可以解惑吗?

阅读 7.5k
5 个回答

第二个参数是删除多少个, 0和负数表示不删除
pressed.splice(-code.length-1, pressed.length-code.length)
这行代码 只在 pressed 的长度大于 code的长度时起作用 , 效果就是保证pressed的长度不大于code

怎么说呢,你要先理解每个参数的意义
index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX 可选。向数组添加的新项目。
而你这个地方用的-6啊,数组没那么长的,当然返回空,至于-1,没试过,反正0就是不删除,1是删除一个
arr.splice(-6,-1) 却返回空数组

应该是splice第二个参数你传的-1的原因,所以返回的是空数组
你试试不传第二个参数就能理解了

新手上路,请多包涵

第二个参数传正整数才会删除元素,你没有删除任何东西,而splice返回的是被删除的元素组成的数组,你没删掉东西返回的肯定是空数组,而原数组肯定没变啊。
splice方法直接对原数组进行增加删除操作,但是返回值并不是原数组而是被删除的元素组成的数组。

参数为正数的时候就很好理解,关键看参数为负数的情况:
var arr = ['s','t','r','i','n','g'];
arr.splice(start, howmany, item);

  1. start的值-1到-6依次从数组尾部‘g’, 'n' ..., 's'开始,并且小于-6时都是从's'开始
  2. howmany为负的时候和0一样,不删除任何元素,没有删除元素的时候返回的都是空数组,所以arr.splice(-6,-1)返回空数组没问题
  3. arr.splice(-6, -1),第二个元素为负,不删除也任何元素,所以和原数组是一样的

补充一点: start为‘0’‘-0’是一样的,都是从正数第一个元素开始

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题