【读书笔记】你不知道的Javascript(中卷)---类型

285 阅读2分钟

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错误 问题: 在不同环境之下 全局对象并不相同