- 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}
网友评论