JavaScript Array.prototype.slice 核心用法与类型转换原理详解

作者:键盘侠

时间:2026-10-27

浏览:522

本文详细解析JavaScript中Array.prototype.slice的多种应用场景。重点介绍如何利用slice将函数arguments和DOM NodeList转换为真实数组,探讨其处理字符串、数字及普通对象的机制。通过代码示例展示slice在数组浅拷贝中的优势,并解释length属性对对象转换结果的影响。

文章目录

slice方法基础与arguments转换

在JavaScript开发中,经常可以看到使用Array.prototype.slice(arguments, 0)这种写法。它通常出现在函数定义内部,主要作用是将函数的arguments参数列表转换为一个真正的数组对象。以下是一个具体的应用示例:


代码实现如下:

var slice = Array.prototype.slice;
var toString = Object.prototype.toString;
(function() {
var args = arguments;
console.log(args, toString.call(args)); // [1, 2, 3] "[object Arguments]"
var argsArr = slice(args, 0);
console.log(argsArr, toString.call(argsArr)); // [1, 2, 3] "[object Array]"
}(1,2,3))

通过上述代码可以看出,函数的arguments对象在经过slice方法调用后,成功转换为了标准的Array类型。


DOM NodeList数组化

同样的技巧也可以用于将选中的DOM元素节点列表转换为数组:


代码示例如下:

slice.call(document.querySelectorAll("div"));

字符串与对象转换机制

进一步思考,slice方法是否也能将普通对象转换为数组呢?让我们通过以下例子来验证:


代码测试如下:

console.log(slice.call('string')); // ["s", "t", "r", "i", "n", "g"]
console.log(slice.call(new String('string'))); // ["s", "t", "r", "i", "n", "g"]

从结果可见,无论是原始字符串还是String对象,slice都会将其逐个字符拆分为数组元素。


然而,对于数字和布尔值,slice会返回一个空数组:


代码验证如下:

console.log(slice.call(33));
console.log(slice.call(true));

对于普通的对象,slice同样会返回空数组,除非该对象具备length属性:


代码测试如下:

console.log(slice.call({name: 'obj'})); // []
console.log(slice.call({0: 'zero', 1: 'one'})); // []
console.log(slice.call({0: 'zero', 1: 'one', name: 'obj', length: 2})); // ["zero", "one"]

数组浅拷贝应用

此外,slice方法还常被用来实现数组的浅拷贝(克隆):


代码示例如下:

var srcArr = [1,2,3];
var newArr = srcArr.slice(0);
console.log(srcArr, newArr); // [1,2,3] [1,2,3]
console.log(srcArr == newArr); // false

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章