前言
typeof
运算符在JavaScript中用来判断一个数据的类型,它返回一个字符串。比如,我们想知道123
的数据类型,我们可能这样写:
|
|
它会返回123
的数据类型,那么应该是”number”。除了”number”,typeof
运算符还会返回其他6种结果:
|
|
从上面的例子中可以看出,typeof
运算符使用十分简单。但是,这只是很少的一部分案例,它们很容易让人误解和混淆typeof
运算符究竟是怎样运作的。
typeof typeof 123
是什么类型?
|
|
typeof
运算符返回的值是什么类型?好的,typeof
操作符总是以字符串的形式返回传递给它的值的数据类型。如果去获取typeof
计算后返回的值,比如一个数字,它将会是"number"
。这意味着,无论结果是什么类型,我们去判断一个typeof [any operand]
,永远都是返回字符串。
typeof NaN
是什么类型?
|
|
NaN
代表某个值不是一个数字,但出乎意料的是,它是”number”类型。原因是这样的,在计算机内部,NaN
是以数字类型储存的。然而,它是一个不能用实际数字来表示的数值类型的值。所以它叫“Not a Number”,这并不意味着它不是数值类型。相反,它意味着这个值不能用数值表示。
这也解释了为什么NaN
的值都不相等。比如:
|
|
上面两个NaN的值不相等,因为它们不能用两个相同的数字来表示。
typeof [1, 2, 3]
是什么类型?
|
|
对数组使用typeof
会得到”object”。在JavaScript中, 数组其实是一个对象,只是拥有一些特殊的行为和能力。比如,数组拥有Array.prototype.length
属性,它将会返回数组有多少个元素。数组也有一些特殊的方法,比如:Array.prototype.push()
或Array.prototype.unshift()
(可以参考JavaScript数组方法)。
区别数组和对象,我们可以使用Array.isArray()
方法:
|
|
typeof null
是什么类型?
|
|
null
的值从技术上来说和object
和number
一样,都是最基本的值,按理来说,null
的类型也应该是”null”。然而并非如此,因为JavaScript最初设计时出了一点意外。
在JavaScript最初设计时,一个值有两个部分组成:它的类型标签和实际的值。有5个类型标签可以使用,而且对象类型的引用指向0
。null
的值始终指向NULL
指针,它在大部分平台都是用0x00
来表示。由于这种相似性,null
就用过0
类型标签来表示,所以符合对象的引用。
typeof class Foo {}
是什么类型?
|
|
最后,我们讲一下类(Classes)。类在ES6中的介绍是:一个更好的语法为原型继承服务。在将类之前,我们先创建一个可继承的对象,我们要用到函数。
|
|
使用类,我们可以用同样的方式创建一个类似的对象:
|
|
然而,JavaScript的类只是一个被语法糖包裹的函数方法。实际上创建了一个同样的函数,但是作者的写法不同,只是看起来个简洁。这就是为什么typeof
一个类,得到的仍然是”Function”。
本文作者:余震(Freak)
本文出处:Rockjins Blog
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN许可协议。转载请注明出处!