面试题:typeof 能判断哪些类型
考点:JS变量类型
typeof
运算符可以用于判断以下类型:
"undefined"
:表示未定义的值。"boolean"
:表示布尔值。"number"
:表示数字。"string"
:表示字符串。"bigint"
:表示大整数类型(ES2020新增)。"symbol"
:表示符号类型(ES2015新增)。"object"
:表示对象或null
。"function"
:表示函数类型。
以下是一些示例:
console.log(typeof undefined); // 输出 "undefined"
console.log(typeof true); // 输出 "boolean"
console.log(typeof 123); // 输出 "number"
console.log(typeof "Hello"); // 输出 "string"
console.log(typeof BigInt(10)); // 输出 "bigint"
console.log(typeof Symbol('foo')); // 输出 "symbol"
console.log(typeof {}); // 输出 "object"
console.log(typeof null); // 输出 "object"(这是一个历史遗留问题)
console.log(typeof function() {}); // 输出 "function"复制代码
需要注意的是,typeof null
返回的是 "object"
,这是由于历史原因造成的。实际上,null
是一个原始值,而不是对象。
typeof null
历史遗留,为什么不解决掉?
typeof null
返回 "object"
的历史遗留问题是因为 JavaScript 最早的实现中,将 JavaScript 值的类型信息存储在一个叫做 "类型标签" 的内部字段中。在该实现中,使用的类型标签将对象和 null 都标记为 0,因此 typeof null
返回的是 "object"
。
然而,当 JavaScript 发展和演变时,解决这个问题变得更加困难。由于 JavaScript 在全球范围内广泛使用,并且有大量的现有代码和库依赖于这种行为,修改 typeof null
的返回值可能会导致现有的代码出现意外的行为或破坏现有的功能。
因此,为了保持向后兼容性,JavaScript 的标准化组织(TC39)决定保留了这个历史遗留问题,并将其视为一个特殊情况。虽然它并不符合直觉,但开发者们已经习惯了这种行为,并且知道如何正确处理 null 值。
虽然不能修改 typeof null
的返回值,但可以通过其他方式来判断一个值是否为 null,例如使用严格相等 ===
运算符:
console.log(value === null); // 判断一个值是否为 null复制代码
另外,为了更准确地判断一个值的类型,可以使用其他方式,如 instanceof
运算符、Object.prototype.toString.call()
方法等。
总之,尽管 typeof null
返回 "object"
是一个历史遗留问题,但由于兼容性和现有代码的考虑,无法进行修改。开发者们需要了解这个特殊情况,并使用其他方法来判断一个值是否为 null。
什么是类型标签
类型标签是一种在 JavaScript 内部使用的机制,用于标识和区分不同值的类型。它是 JavaScript 引擎用来跟踪和管理值的类型信息的一种数据结构。
在早期的 JavaScript 实现中,每个 JavaScript 值都会分配一个类型标签。这个标签存储在值的内部,用于表示该值的类型。类型标签的值是一个数字,不同的数字代表不同的类型。
例如,在某些实现中,类型标签 0 可能表示对象类型,标签 1 可能表示字符串类型,标签 2 可能表示数字类型,以此类推。当 JavaScript 引擎需要确定一个值的类型时,它会根据该值的类型标签来执行相应的操作。
然而,随着 JavaScript 的发展和演变,引入了其他的类型表示方式,如 typeof
运算符、instanceof
运算符、Object.prototype.toString.call()
方法等。这些方式更加灵活和精确,因此类型标签的概念在现代 JavaScript 中已经不再被直接暴露给开发者。
尽管类型标签不再被直接使用,但它仍然是 JavaScript 引擎内部用于管理值类型的一部分。类型标签的存在为引擎提供了一种在运行时有效地处理不同类型的值的机制。不同的 JavaScript 引擎可能会使用不同的方式来实现类型标签,但这些实现细节对开发者来说是透明的。