当前位置 博文首页 > jcLee95的博客:JavaScript中的类型、面向对象编程 深度解析

    jcLee95的博客:JavaScript中的类型、面向对象编程 深度解析

    作者:[db:作者] 时间:2021-09-18 15:47

    JavaScript中的类型、对象、原型、类
    以及面向对象编程深度解析

    CSDN:jcLee95
    邮箱:291148484@163.com


    1. Javascript 基本类型(即数据类型)

    我在之前很多博文中已经提到,Javascript不像Java、Python等语言“一切皆对象”。在Javascript中并非一切皆对象,基本类型如booleannumberstringundefinednull、就不是对象,它们只表示类型与对象也没什么关系。在后文你会看到一些相似的东西,如BooleanNumberSstringObject等,它们也表示类型,属于"引用类型"。这些引用类型们却是"对象",称之为"内置对象"或"内置函数"。JavaScript中的简单基本类型如:

    简单基本类型备注
    boolean布尔值类型,表示两个值:“true” 或 “false”
    number数值类型
    string字符串值类型
    undefined未定义类型
    null空类型,表示一个空对象的指针但本身不是对象
    symbol表示独一无二的值(ES6新增)
    bigint表示大于 2 53 ? 1 2^{53} - 1 253?1 的整数(ES7新增)
    object表示非原始类型,也就是除numberstringbooleansymbolbigint, nullundefined之外的类型。

    需要指出,在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环境中运行的结果:
    在这里插入图片描述
    再举一个例子,numberNumber

    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。

    文内参考链接typeof操作符的返回值

    cs