你不知道的javascript(中卷)

  • javascript中变量没有类型,值有类型。
  • typeof 的怪异之处:typeof null === 'object' typeof a === 'undefined' (这里a为没有声明的变量)
  • 使用typeof来检测环境中是否有不存在的变量,这是一种安全机制。常用于为某种缺失的功能编写polyfill的时候可以用上。
let a;
if (atob) {   // 如果atob没有声明的话,这样会出现reference error。
   atob(a);
} else {
  atob = function () { ... }
}
// 可以使用:
let a;
if (typeof atob !== 'undefined') {   // atob没有声明,也不会出现reference error。
   atob(a);
} else {
  atob = function () { ... }  // 注意不要用var声明需要polyfill的方法,可能会报错。
}

安全机制来讲,还可以通过检测某个属性是否是window对象的属性进行检测。像下面一样(不过下面的写法只适合于浏览器):

let a;
if(window.atob) {
  atob(a);
} else {
 atob = function () { ... }
}
  • JSON安全值:安全的JSON值是指能够呈现为有效JSON格式的值。
    不安全的JSON值: undefined、function、symbol(ES6+)和包含循环引用的对象都不符合JSON结构标准,其他支持JSON的语言无法处理它们。
    处理不安全的JSON值:对含有非法JSON值的对象做字符串化,或者对象中的某些值无法被序列化时,就需要定义toJSON()方法来返回一个安全的JSON值。
    例如:
var o = {};
var a = {
   b: 42,
   c: o,
   d: function () {}
};
// 在o中创建一个循环引用
o.e = a;
// 循环引用在这里会产生错误
// JSON.stringify( a );
// 自定义的JSON序列化
a.toJSON = function () {
  // 序列化仅包含b
 return { b: this.b}; // toJSON()方法是返回一个可以被JSON.stringify安全序列化的值
};
JSON.stringify( a ); // { "b": 42}

你可能感兴趣的:(你不知道的javascript(中卷))