当前位置 博文首页 > jcLee95的博客:JavaScript中的类型、面向对象编程 深度解析
CSDN:jcLee95
邮箱:291148484@163.com
我在之前很多博文中已经提到,Javascript不像Java、Python等语言“一切皆对象”。在Javascript中并非
一切皆对象,基本类型如boolean
、number
、string
、undefined
、null
、就不是对象,它们只表示类型与对象也没什么关系。在后文你会看到一些相似的东西,如Boolean
、Number
、Sstring
、Object
等,它们也表示类型,属于"引用类型"。这些引用类型们却是"对象",称之为"内置对象"或"内置函数"。JavaScript中的简单基本类型如:
简单基本类型 | 备注 |
---|---|
boolean | 布尔值类型,表示两个值:“true” 或 “false” |
number | 数值类型 |
string | 字符串值类型 |
undefined | 未定义类型 |
null | 空类型,表示一个空对象的指针但本身不是对象 |
symbol | 表示独一无二的值(ES6新增) |
bigint | 表示大于 2 53 ? 1 2^{53} - 1 253?1 的整数(ES7新增) |
object | 表示非原始类型,也就是除number ,string ,boolean ,symbol ,bigint , null 或undefined 之外的类型。 |
需要指出,在JavaScript中使用小写字母开头表示简单基本类型,这些简单基本类型除了object都不是对象类型,而仅仅表示一系列具有某种特征的值的类型。比如:
let a = "Hello World!"
该语句的右侧"Hello World!
"的类型就是简单基本类型string
,这不是对象,而是一个不可变的值,或者称“字面量”。因此变量a的类型为string
:
typeof a
Out[]:
string
有一个具有迷惑性的事情是,既然string
类型只是一个值类型(字面量),那么就不应该具有对象所具有的属性啊。这时不可思议的事情发生了:
a.length
Out[]:
12
JavaScript语言中,在一些特定情况下,比如使用相应的属性时,值类型量会自动转换为对应的内置类型
以使用相应属性。
也就是说,虽然a的类型为string
,但执行“a.length”时,将产生一个对应的为内置类型String
的变量代替它执行之,这也不会改变a本身的类型。这是作者在Node.js环境中运行的结果:
再举一个例子,number
与Number
。
let a = 10;
let b = Number(10);
let c = new Number(10);
在上面的JavaScript语句中,变量a、b中存储的都是number类型的值,这些number类型的值都不是对象。变量c中存储的类似于如Java等其它语言中类的实例对象,但实际上在JavaScript中,c为由new
绑定到被调用函数的this后返回一个对象,与Java等语言中类的构造方法完全是两码事。
可以看出字面量10所对应的基本类型为"number",,它并非"Number"对象的实例。而由 new关键字
返回的对象如new Number(10)
对应的typeof返回的结果表现为"[Number: 10]
",它是"Number"对象的实例。那么本例中Number(...)
与new Number(...)
到底有什么不同呢?我们先抛出这个问题,后续我们在对关键字new的讲解中继续讨论之。
顺便指出,以下是某教程的截图,其内容是不准确的:
另外需要特别指出的是:
typeof null
Out[]:
object
这是来自于JavaScript自身的bug之一,并不是null为object类型。再次强调,null
并非对象(object)类型也不具备对象的特点。为什么会有这个bug呢?其实null值表示一个空对象指针,正因为如此在JavaScript语言底层的二进制表示中,object类型前三位都是0,恰巧null类型的前三位也是0,typeof
在判断时就直接依此判成了object。
cs文内参考链接:typeof操作符的返回值