20200227

@xiaojingzhao

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

More