JSON.stringify[]
là một hàm kinh điển trong Javascript để chuyển một Object sang JSON. Có rất nhiều thư viện sử dụng JSON.stringify[]
như const obj = { answer: 42 };
const clone = JSON.parse[JSON.stringify[obj]];
clone.answer; // 42
clone === obj; // false
1 trong Express , const obj = { answer: 42 };
const clone = JSON.parse[JSON.stringify[obj]];
clone.answer; // 42
clone === obj; // false
2 trong Axios và cả Webpack stats. Trong bài viết này mình sẽ trình bày một cách tổng quan về JSON.stringify[]
bao gồm cả các trường hợp lỗi.const obj = { answer: 42 };
const str = JSON.stringify[obj];
str; // '{"answer":42}'
typeof str; // 'string'
JSON.stringify[]
sử dụng chung với hàm
const obj = { answer: 42 };
const clone = JSON.parse[JSON.stringify[obj]];
clone.answer; // 42
clone === obj; // false
5, đây là cách ta sao chép một Object mà không ảnh hưởng đến Object cũ.const obj = { answer: 42 };
const clone = JSON.parse[JSON.stringify[obj]];
clone.answer; // 42
clone === obj; // false
Trường hợp đặc biệt và lỗi.
1. Khi một Object có một const obj = { answer: 42 };
const clone = JSON.parse[JSON.stringify[obj]];
clone.answer; // 42
clone === obj; // false
6 trỏ về chính nó, JSON.stringify[]
trả về 1 error
const obj = { answer: 42 };
const clone = JSON.parse[JSON.stringify[obj]];
clone.answer; // 42
clone === obj; // false
const obj = {};
obj.prop = obj;
// Throws "TypeError: TypeError: Converting circular structure to JSON"
JSON.stringify[obj];
2. Các trường hợp const obj = { answer: 42 };
const clone = JSON.parse[JSON.stringify[obj]];
clone.answer; // 42
clone === obj; // false
8 và const obj = { answer: 42 };
const clone = JSON.parse[JSON.stringify[obj]];
clone.answer; // 42
clone === obj; // false
9, JSON.stringify[]
sẽ trả về const obj = {};
obj.prop = obj;
// Throws "TypeError: TypeError: Converting circular structure to JSON"
JSON.stringify[obj];
1
const obj = { answer: 42 };
const clone = JSON.parse[JSON.stringify[obj]];
clone.answer; // 42
clone === obj; // false
const obj = { answer: 42 };
const clone = JSON.parse[JSON.stringify[obj]];
clone.answer; // 42
clone === obj; // false
const obj = {};
obj.prop = obj;
// Throws "TypeError: TypeError: Converting circular structure to JSON"
JSON.stringify[obj];
const obj = {
nan: parseInt['not a number'],
inf: Number.POSITIVE_INFINITY
};
JSON.stringify[obj] // '{"nan":null,"inf":null}'
3. Lọc bỏ hết tất cả các giá trị const obj = {};
obj.prop = obj;
// Throws "TypeError: TypeError: Converting circular structure to JSON"
JSON.stringify[obj];
2 hay const obj = {};
obj.prop = obj;
// Throws "TypeError: TypeError: Converting circular structure to JSON"
JSON.stringify[obj];
3
const obj = {};
obj.prop = obj;
// Throws "TypeError: TypeError: Converting circular structure to JSON"
JSON.stringify[obj];
const obj = {};
obj.prop = obj;
// Throws "TypeError: TypeError: Converting circular structure to JSON"
JSON.stringify[obj];
const obj = {
fn: function[] {},
undef: undefined
};
JSON.stringify[obj] // '{}'
Các tham số còn lại của JSON.stringify[]
JSON.stringify[]
nhận vào 3 tham số , đa phần chúng ta không biết đến 2 tham số còn lại.
Tham số thứ 2 là một hàm
const obj = {};
obj.prop = obj;
// Throws "TypeError: TypeError: Converting circular structure to JSON"
JSON.stringify[obj];
5, một hàm nhận vào 1 cặp const obj = {};
obj.prop = obj;
// Throws "TypeError: TypeError: Converting circular structure to JSON"
JSON.stringify[obj];
6 có thể sử dụng để thay đổi output sau cùng.const obj = {
a: 1,
b: 2,
c: 4,
d: {
e: 4
}
};
//Nếu là number thì tăng lên 1
JSON.stringify[obj, function replacer[key, val] {
if[typeof val === 'number'] {
return val + 1;
}
return val;
}]
// '{"a":2,"b":3,"c":4,"d":{"e":5}}'
Tham số thứ 3 là
const obj = {};
obj.prop = obj;
// Throws "TypeError: TypeError: Converting circular structure to JSON"
JSON.stringify[obj];
7, cho phép format lại đoạn code in ra console. Có nhiều cách để hiển thị ra thứ mà ta mong muốn.const obj = {
a: 1,
b: 2,
c: 4,
d: {
e: 4
}
};
JSON.stringify[obj];
// '{"a":1,"b":2,"c":3,"d":{"e":4}}'
JSON.stringify[obj, null, ' '];
// hoặc
JSON.stringify[obj, null, 2];
// {
// "a": 1,
// "b": 2,
// "c": 3,
// "d": {
// "e": 4
// }
// }
//Không nhất thiết phải là dấu khoảng trắng
JSON.stringify[obj, null, '__'];
// {
// __"a": 1,
// __"b": 2,
// __"c": 3,
// __"d": {
// ____"e": 4
// __}
// }
Ví dụ như ta có thể lược bỏ dữ liệu nhạy cảm như password ra khỏi Object bằng JSON.stringify[]
.password ra khỏi Object bằng JSON.stringify[]
.
const obj = {
name: 'John Doe',
password: 'isLuckyman',
nested: {
hashedPassword: 'c3RhcmdhemVy'
}
};
JSON.stringify[obj, function replacer[key, val] {
if[key.match[/password/i]] {
return undefined;
}
return val;
}];
// '{"name":"John Doe","nested": {}}'
Hàm toJSON[]
Khi đi qua hàm JSON.stringify[]
nếu bên trong Object có hàm
const obj = {
nan: parseInt['not a number'],
inf: Number.POSITIVE_INFINITY
};
JSON.stringify[obj] // '{"nan":null,"inf":null}'
0, thì nó sẻ trả về kết quả của hàm này.const obj = {
name: 'John Doe',
nested: {
test: 'nothing to show',
toJSON: [] => 'test'
}
};
JSON.stringify[obj];
// '{"name":"John Doe","nested":"test"}'
Rất nhiều thư viện sử dụng JSON.stringify[]
kết hợp
const obj = {
nan: parseInt['not a number'],
inf: Number.POSITIVE_INFINITY
};
JSON.stringify[obj] // '{"nan":null,"inf":null}'
0 để đảm bảo output lúc serialize ra đúng với mong muốn như Moment objects và Mongoose documents. Hy vọng bài viết sẽ giúp các bạn có thể hiểu rõ và sử dụng const obj = {
nan: parseInt['not a number'],
inf: Number.POSITIVE_INFINITY
};
JSON.stringify[obj] // '{"nan":null,"inf":null}'
3 hợp lý và hiệu quả.Tham khảo
- The code barbarian