为什么JavaScript的slice方法使用负数参数时计数逻辑似乎不同?
slice负数参数返回结果原理解答
核心规则
JavaScript中String.prototype.slice()的负数参数会按如下规则转换为正索引再执行截取:转换后正索引 = 字符串总长度 + 负数参数
截取逻辑和正参数完全一致:左闭右开,包含起始索引对应字符,不包含结束索引对应字符。
你的代码计算过程
你使用的字符串为:
let str = "Apple, Banana, Kiwi";
首先计算该字符串总长度:str.length = 19
现在对slice(-12, -6)的两个参数做转换:
- 起始参数-12 → 19 + (-12) = 7
- 结束参数-6 → 19 + (-6) = 13
转换后代码等价于你之前成功截取到Banana的写法:
str.slice(7,13)
所以返回结果自然为Banana。
常见误解原因
你预估会得到带空格的Banan,通常是负数索引计数错误导致:
负数索引是从字符串最后一个字符开始倒序标记的:str.slice(-1)对应最后一个字符i(Kiwi的末尾i),倒推到-6对应的是Banana后的逗号,-12对应的是Banana的首字符B,截取区间刚好覆盖完整的Banana,没有前置空格,也不会丢失末尾的a。
内容的提问来源于stack exchange,提问作者chris13
相关产品推荐
相关产品推荐

