实现 slice JS
实现 JavaScript 的 slice 方法
JavaScript 的 slice 方法用于从数组或字符串中提取一部分,返回一个新的数组或字符串,而不修改原始数据。以下是实现 slice 的核心逻辑和注意事项。
数组的 slice 实现
function slice(array, start, end) {
const length = array == null ? 0 : array.length;
if (!length) {
return [];
}
start = start == null ? 0 : start;
end = end === undefined ? length : end;
if (start < 0) {
start = -start > length ? 0 : length + start;
}
if (end < 0) {
end = -end > length ? 0 : length + end;
}
const result = [];
for (let i = start; i < end && i < length; i++) {
result.push(array[i]);
}
return result;
}
- 参数处理:
start和end可以是负数,表示从末尾开始计算的位置。 - 边界检查:确保
start和end在合理范围内,避免越界访问。 - 结果生成:通过循环将指定范围的元素添加到新数组中。
字符串的 slice 实现
function sliceString(str, start, end) {
const length = str == null ? 0 : str.length;
if (!length) {
return '';
}
start = start == null ? 0 : start;
end = end === undefined ? length : end;
if (start < 0) {
start = -start > length ? 0 : length + start;
}
if (end < 0) {
end = -end > length ? 0 : length + end;
}
let result = '';
for (let i = start; i < end && i < length; i++) {
result += str[i];
}
return result;
}
- 逻辑类似数组:处理负数索引和边界条件的方式与数组一致。
- 字符串拼接:通过循环拼接字符生成子字符串。
注意事项
- 性能优化:现代 JavaScript 引擎已对原生
slice做了高度优化,手动实现的版本可能性能较差。 - 类型检查:原生
slice会检查调用者是否为数组或字符串,手动实现时可根据需要添加类型校验。 - 稀疏数组:原生
slice会跳过稀疏数组的空位,手动实现时需额外处理。
以上代码提供了 slice 方法的核心功能实现,可根据实际需求进一步扩展或优化。






