ECMAScript 中的类型
ECMAScript 的类型其实细分为 语言类型 和 规范类型。
规范类型
规范类型 对应的是 元值,它被用于在算法中描述 ECMAScript 语言结构的语义和 ECMAScript语言类型。规范类型包括引用、列表、完结、属性描述式、属性标示、词法环境、 环境纪录。这块的姿势相当硬核感兴趣的同学可以查阅w3c类型
语言类型
语言类型是我们大部分场景下更关注也是更常用到的点,本文也主要介绍语言类型,下文中的类型也指代语言类型 ECMAScript语言类型 包括 Undefined、Null、Boolean、String、Number、Object 以及ES6中引入的Symbol类型。
对类型使用typeof
typeof undefined === "underfined"; // true
typeof true === "boolean"; // true
typeof 42 === "number"; // true
typeof "42" === "string"; // true
typeof { life:42 } === "object"; //true
typeof Symbol() === "symbol"; // true
特殊情况
// function 和 array 是object的子类型 对他们使用typeof有如下返回
typeof function(){} // "function"
typeof [] // "object"
// null是基本类型 但是由于语言设计层面的一些历史问题 对他使用 typeof 会返回 object
typeof null === "object"; //true
综上,我们发现 无法通过单一的typeof来判断值的类型。 扩展: (!a && typeof a === "object"); // 判断null (!a && typeof a === "object"); // 判断null
值和类型
JavaScript 中的变量是没有类型的,只有值才有。变量可以随时持有任何类型的值。
undefined 和 undeclared
var a;
console.log(a); // 已声明未赋值 undefined
console.log(b);// 未声明直接使用 referenceError: b is not defined
typeof(a);// undefined
typeof(b);// undefined
特殊安全防范机制
typeof对于undefined 和 undeclared返回的结果都是undefined,这是因为typeof有一个特殊的安全防范 机制。
因为多个脚本 文件会在共享的全局命名空间中加载变量,所以安全防范机制对在浏览器中运行的 JavaScript 代码来说还是很有帮助的,
举一个例子:
// 这样会抛出错误
if (DEBUG) {
console.log( "Debugging is starting" );
}
// 这样是安全的
if (typeof DEBUG !== "undefined") {
console.log( "Debugging is starting" );
}
其他安全防范机制
检查是否是全局对象的属性
if(window.DEBUG){
//
}
if(!window.atob){
//
}
原理: 访问对象上不存在的属性时不会报 refrence错误 问题: 在不同环境之下 全局对象并不相同