20200227
Plan
- 强制类型转换
Notes
JSON.stringify 一个有循环引用的 obj 会怎么样?
a = { a: b };
b = { b: a };
JSON.stringify(b); // TypeError: Converting circular structure to JSON
结论 JSON.stringify 不能序列化循环引用的对象
b.toJSON = () => {
return { test: "test" };
};
JSON.stringify(b); // "{"test":"test"}"
JSON.stringify 中的 replacer
a = { a: "a", b: "b", c: "c" };
JSON.stringify(a, (k, v) => {
if (k === "c") {
return v;
}
});
预期 输出 "{"c":"c"}";
结果 undefined;
原因:
在开始时, replacer 函数会被传入一个空字符串作为 key 值,代表着要被 stringify 的这个对象。随后每个对象或数组上的属性会被依次传入。
因为第一次时,k 为空,这个时候我们没有返回任何值,所以导致下一步的遍历属性失败了。下一步的属性遍历应该是根据第一次 k 为空时返回的对象做的。改成下面这样就可以了:
a = { a: "a", b: "b", c: "c" };
JSON.stringify(a, (k, v) => {
console.log("k", v); // 第一个 v 是 {a: "a", b: "b", c: "c"},如果 a中有function或者symbol,这边并不会过滤
if (!k || k === "c") {
return v;
}
});
Number(obj)
- valueOf --> toString --> Error
Boolean
- document.all 是一个假值对象,由 DOM 提供,是一个外来值。
Boolean(document.all); // false