aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Array.slice và splice: end index khác deleteCount thế nào?

Suong Nguyen by Suong Nguyen
04/11/2026
in Đánh giá
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Hai method có tên gần giống nhau nhưng argument thứ hai và tác động lên dữ liệu khác nhau. Đọc nhầm slice(1, 2) thành “lấy hai phần tử” hoặc coi kết quả splice là mảng sau chỉnh sửa sẽ tạo lỗi dù code không ném exception.

Bài so sánh theo cùng tiêu chí: hợp đồng arguments, kết quả trả về, mutation, reference và chi phí tích hợp. Snippet đã chạy bằng Node.js 24.18.1, tài liệu MDN được đọc ngày 04/11/2026. Không có benchmark tốc độ hoặc bộ nhớ.

Chạy hai thao tác trên cùng dữ liệu đầu

Lưu thành arrays.cjs, chạy node arrays.cjs:

const assert = require('node:assert/strict');
const original = ['a', 'b', 'c', 'd'];

const selected = original.slice(1, 2);
assert.deepEqual(selected, ['b']);
assert.deepEqual(original, ['a', 'b', 'c', 'd']);
assert.notEqual(selected, original);

const editable = ['a', 'b', 'c', 'd'];
const removed = editable.splice(1, 2, 'x');
assert.deepEqual(removed, ['b', 'c']);
assert.deepEqual(editable, ['a', 'x', 'd']);
console.log(selected, removed, editable);

Các assertion đã qua. slice lấy từ index 1 đến trước index 2, nên chỉ lấy b. splice bắt đầu ở index 1 và xóa hai phần tử, rồi chèn x tại đó. Array trả về từ splice chứa phần bị lấy ra, trong khi editable mới là mảng đã chỉnh sửa.

Về khả năng bắt đầu và hệ sinh thái, cả hai đều có sẵn trong JavaScript, không cần package. Sự khác biệt cần ưu tiên ở đây là dữ liệu sau thao tác có đúng yêu cầu hay không; độ ngắn tên hàm không phải tiêu chí lựa chọn.

Một đối chiếu bằng lời để review

Với slice, argument thứ hai là mốc kết thúc không bao gồm vị trí đó. Nó phù hợp khi muốn một đoạn dữ liệu mới và giữ cấu trúc mảng gốc. Với splice, argument thứ hai là số phần tử xóa; các arguments tiếp theo là phần tử chèn vào. Nó phù hợp khi chủ ý chỉnh sửa mảng đang sở hữu.

Nếu cần cập nhật state theo cách tạo mảng mới, không gọi splice trực tiếp lên array state rồi chỉ truyền lại cùng reference. Nếu muốn dùng splice trên một bản sao do mình tạo, hãy làm rõ bước sao chép và giới hạn nông của bản sao ấy. Không phải mọi mutation đều sai, nhưng ownership phải dễ nhìn thấy.

Sao chép mảng không đồng nghĩa sao chép object con

Chạy snippet độc lập sau:

const assert = require('node:assert/strict');
const rows = [{id: 1, title: 'Draft'}, {id: 2, title: 'Ready'}];
const selected = rows.slice(0, 1);
assert.notEqual(selected, rows);
assert.equal(selected[0], rows[0]);
selected[0].title = 'Edited';
assert.equal(rows[0].title, 'Edited');
console.log(rows[0].title);

Kết quả đã kiểm tra là Edited. Array mới có danh tính riêng nhưng phần tử object vẫn cùng reference. Ví dụ này chỉ kiểm chứng plain object trong mảng đặc; nó không giới thiệu một giải pháp deep clone cho mọi kiểu dữ liệu.

Trong bài toán lấy một đoạn để hiển thị, có thể bạn không cần đổi object con. Nếu sau đó chỉnh nội dung, hãy quyết định bản cập nhật phải ảnh hưởng dữ liệu gốc hay tạo phiên bản mới, thay vì suy rằng slice đã cô lập mọi thứ.

Kiểm tra những biên dễ đọc nhầm

Thử khoảng rỗng, index cuối và các giá trị âm theo tài liệu trước khi đưa helper vào xử lý pagination. Đặt tên biến như endExclusive hoặc deleteCount giúp người gọi ít nhầm hơn một tên chung second.

Khi review kết quả splice, kiểm tra cả array trả về và array đầu vào sau thao tác. Chỉ assert phần bị xóa sẽ bỏ sót lỗi chèn nhầm vị trí. Với slice, kiểm tra mảng nguồn giữ nguyên và phần được chọn đúng khoảng.

Hai API không phải hai biến thể có thể thay nhau tùy ý. Chọn theo phép biến đổi cần thực hiện, rồi xác nhận mutation và reference đúng với nơi dữ liệu sẽ được dùng tiếp. Chưa có bằng chứng hiệu năng trong bài để xếp một cách luôn tốt hơn cách còn lại.

Nguồn tham khảo

  • MDN: Array.slice
  • MDN: Array.splice

Tags: ArrayĐánh giáJavaScript
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Array.some và every: chọn đúng câu hỏi, nhớ trường hợp mảng rỗng

by Suong Nguyen
03/11/2026
0

Kiểm chứng some và every bằng cùng bộ dữ liệu để phân biệt có ít nhất một, tất cả và điều kiện bắt buộc danh sách không rỗng.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Object.hasOwn và in: chọn theo thuộc tính riêng hay cả prototype

by Suong Nguyen
02/11/2026
0

Đối chiếu hasOwn, in và hasOwnProperty bằng cùng bộ case: kế thừa, undefined, object không prototype và method bị che.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Array.find và filter: chọn theo một hay nhiều kết quả

by Suong Nguyen
01/11/2026
0

So sánh kiểu kết quả, xử lý không tìm thấy và số lần gọi predicate để chọn find hoặc filter đúng nhu cầu.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

String.length và Buffer.byteLength: chọn phép đo cho UTF‑8

by Suong Nguyen
31/10/2026
0

So sánh độ dài chuỗi và số byte UTF‑8 bằng ví dụ tiếng Việt, emoji và JSON để chọn đúng đơn vị giới hạn.

Next Post
Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

Docker ARG và ENV: phân biệt tham số build với cấu hình image

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native ScrollView: tạo nút về đầu bằng ref và scrollTo
  • Array.isArray và instanceof: mảng từ realm khác được kiểm tra thế nào?
  • Android LayoutParams nhận pixel: đổi dp đúng một lần

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply