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
Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Phỏng vấn JavaScript: object mặc định của tham số được tạo khi nào?

Suong Nguyen by Suong Nguyen
10/11/2026
in Phỏng vấn
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Hai lần gọi hàm không truyền state có dùng chung object mặc định hay không? Câu hỏi này dễ bị trả lời theo thói quen từ ngôn ngữ khác. Trong JavaScript, biểu thức default parameter được đánh giá khi lời gọi cần giá trị mặc định; nhưng điều đó không có nghĩa mọi biểu thức mặc định đều tạo một object mới.

Bài đối chiếu tài liệu ngày 10/11/2026 và chạy ví dụ trên Node.js 24.18.1. Các đoạn code chỉ tạo object và bộ đếm trong bộ nhớ, không gọi API, timer hoặc đo hiệu năng. Mục tiêu là phân biệt thời điểm đánh giá biểu thức với việc object nào được chia sẻ.

Object literal được tạo riêng ở mỗi lần cần default

function createTask(state = {attempts: 0}) {
  return {state};
}

const first = createTask();
const second = createTask();
first.state.attempts += 1;
console.log(first.state === second.state);
console.log(first.state.attempts, second.state.attempts);

Kết quả là false và cặp 1, 0. Mỗi lời gọi thiếu state đánh giá một object literal mới, nên thay đổi state của first không làm state của second thay đổi. Wrapper {state} ở giá trị trả về là một object khác nữa; cần xác định đúng tầng object khi kiểm tra identity.

Default parameters trên MDN mô tả thời điểm đánh giá này. Đừng suy rằng default được dựng một lần rồi giữ nguyên chỉ vì biểu thức nằm ngay trong chữ ký hàm.

Biểu thức trả về một object dùng chung vẫn là dùng chung

const sharedState = {attempts: 0};
function createSharedTask(state = sharedState) {
  return {state};
}

const sharedFirst = createSharedTask();
const sharedSecond = createSharedTask();
sharedFirst.state.attempts += 1;
console.log(sharedFirst.state === sharedSecond.state);
console.log(sharedSecond.state.attempts);

Kết quả là true và 1. Biểu thức default vẫn được đánh giá ở lời gọi, nhưng nó đọc biến sharedState, vốn trỏ đến cùng một object. “Đánh giá lại biểu thức” và “cấp phát object mới” là hai việc khác nhau. Muốn biết có chia sẻ hay không, đọc biểu thức thực sự trả về gì.

Tương tự, nếu caller chủ động truyền cùng một object vào createTask nhiều lần, các task sẽ nhận cùng tham chiếu đó. Default không tự clone đối số đã có. Đây có thể là ý định đúng hoặc là nguồn lỗi, tùy hợp đồng ownership của hàm.

Theo dõi một biểu thức mặc định có lời gọi hàm

let nextSequence = 0;
function allocateSequence() {
  nextSequence += 1;
  return nextSequence;
}
function createRecord(sequence = allocateSequence()) {
  return {sequence};
}

console.log(createRecord().sequence);
console.log(createRecord(99).sequence);
console.log(createRecord(undefined).sequence);
console.log(nextSequence);

Bốn dòng là 1, 99, 2 và 2. Đối số 99 khiến biểu thức default không được dùng ở lời gọi ấy; undefined yêu cầu lấy giá trị mặc định. Bộ đếm là dữ liệu thử để quan sát thời điểm gọi, không phải bộ sinh ID phù hợp cho production, lưu trữ lâu dài hoặc xử lý đồng thời.

Nếu biểu thức mặc định có tác dụng phụ như đọc trạng thái hoặc tăng bộ đếm, test cần ghi nhận số lần nó chạy. Không chỉ kiểm tra object cuối cùng vì cùng một giá trị trả về có thể che việc một tác vụ phụ đã được gọi nhiều hơn dự kiến.

Default không thay cho kiểm tra đối số

Ví dụ đầu mặc định một state khi thiếu dữ liệu, nhưng vẫn nhận nguyên đối số caller đưa vào. Truyền null không tự tạo {attempts: 0}. Một object không có attempts hoặc có attempts sai kiểu cũng cần một quy tắc xử lý riêng nếu hàm thực tế sẽ thao tác lên nó.

Hãy xác định hàm có nhận ownership của state hay chỉ đọc nó. Nếu nhiệm vụ là cập nhật mà không sửa input, cần cách tạo kết quả khác phù hợp; default parameter không tự đảm bảo tính bất biến. Cũng không gọi một bản sao nông là đã tách mọi object lồng bên trong.

Cách giải thích và kiểm tra trong phỏng vấn

Một câu trả lời có thể đi qua ba bước: lời gọi nào cần default, biểu thức nào được đánh giá và tham chiếu nào được kết quả ấy giữ. Dự đoán identity trước, sau đó mới chạy code và sửa một thuộc tính để quan sát sự chia sẻ.

Thử riêng hai lời gọi bỏ đối số, hai lời gọi truyền cùng object và một lời gọi dùng undefined. Với biểu thức tạo sequence, thêm một đối số tường minh để chứng minh default không chạy ở mọi lần gọi. Cách phân tích này giúp tránh cả hai kết luận quá rộng: “default object luôn chia sẻ” và “default luôn clone dữ liệu”.

Nguồn tham khảo

  • MDN: Default parameters, evaluated at call time

Tags: Default parametersJavaScriptPhỏng vấn
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Phỏng vấn JavaScript: throw trong async function đi vào catch nào?

by Suong Nguyen
09/11/2026
0

Theo dõi lỗi ném trước await trong async function, bắt rejection đúng chỗ và dùng assert.rejects để kiểm tra hợp đồng lỗi.

Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Phỏng vấn JavaScript: vì sao regex.test cùng chuỗi lại đổi kết quả?

by Suong Nguyen
08/11/2026
0

Theo dõi lastIndex của regex có cờ g, giải thích lỗi lọc dữ liệu bị bỏ xen kẽ và viết validator không giữ con trỏ tìm kiếm.

Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

JavaScript Set với object: cùng id vẫn có thể là hai phần tử

by Suong Nguyen
07/11/2026
0

Phân biệt trùng tham chiếu với trùng khóa nghiệp vụ, rồi viết phép loại trùng theo id với chính sách giữ bản ghi đầu tiên.

Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Array.reduce thiếu initialValue: mảng rỗng lỗi, một phần tử không gọi callback

by Suong Nguyen
06/11/2026
0

Theo dõi accumulator và chỉ số callback để chọn initialValue đúng kiểu, thay vì chỉ thêm 0 cho hết lỗi mảng rỗng.

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 Text selectable: cho người dùng chọn và sao chép mã hiển thị
  • Phỏng vấn JavaScript: object mặc định của tham số được tạo khi nào?
  • Android runOnUiThread và Handler.post: chạy ngay hay đưa vào hàng đợi?

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