Không. Object.freeze chỉ đóng băng nông (shallow): nó chặn thêm/xoá/sửa property ở tầng đầu tiên, nhưng object lồng bên trong vẫn sửa được vì frozen chỉ khoá tham chiếu, không khoá thứ mà tham chiếu trỏ tới.
js
const config = Object.freeze({
name: 'app',
db: { host: 'localhost' },
tags: ['a'],
});
config.name = 'other'; // bị bỏ qua (strict mode: TypeError)
config.db.host = 'prod'; // THÀNH CÔNG — object lồng không bị freeze
config.tags.push('b'); // THÀNH CÔNGDeep freeze phải duyệt đệ quy:
js
function deepFreeze(obj) {
for (const value of Object.values(obj)) {
if (value && typeof value === 'object' && !Object.isFrozen(value)) {
deepFreeze(value);
}
}
return Object.freeze(obj);
}Lưu ý !Object.isFrozen(value) để tránh lặp vô hạn khi có tham chiếu vòng.
Ba điểm hay bị hỏi thêm: freeze âm thầm thất bại ở non-strict mode nên bug khó thấy; kiểm tra bằng Object.isFrozen; và trong dự án thực tế thường dùng TypeScript readonly (kiểm tra lúc compile, không tốn runtime) hoặc thư viện immutable thay vì deep freeze toàn bộ state.