Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Node: JavaScript 类型系统之概述 #8

Open
XiaoDHuang opened this issue Dec 24, 2019 · 0 comments
Open

Node: JavaScript 类型系统之概述 #8

XiaoDHuang opened this issue Dec 24, 2019 · 0 comments

Comments

@XiaoDHuang
Copy link
Owner

XiaoDHuang commented Dec 24, 2019

JavaScript 类型系统之概述

1. javaScript typeof 基本类型系统

javaScript基本类型就是typeof 能够识别的7种“语言层面的”数据类型

  • undefined
  • string
  • number
  • boolean
  • symbol
  • object
  • function

2 typeof 所能识别数据类型分成两大类

  • 值类型(undefined\string\number\boolean\symbol)
  • 引用类型(object\function) \对象类型

3 undefined 与 null 表达非值与非对象的概念

  • undefined

undefined用于表达一个值 / 数据不存在,也就是“非值(non-value)”,例如 return 没有返回值,或变量声明了但没有绑定数据。"值 + 非值“ 的概念上就构成了一个完整的类型系统

  • null

在对象类型系统中, null用于表达一个对象不存在,也就是“非对象”,例如在原型继承中上溯原型链直到根类——根类没有父类,因此它的原型就指向null
null并不在基本类型系统中,它只是在“对象类型系统”中的、一个特殊对象的字面量表示

typeof null   // object

4. 存在差异的两套类型规范

ECMAScript 约定:null是值,是非对象类型的, 而typoof 运算 null 为 object
从ECMAScript ed5开始,“基本类型”与“内部类型”就分别被称为语言类型与规范类型了。

4.1 为什么未存在差异???

在这两种类型系统中,JavaScript语言认为null是个是引用类型(Object)的值,而ECMAScript认为null是个原始类型(Primitive types)的值。

5. JavaScript语言类型系统

6 ECMAScript规范类型系统

6.1 语言类型

  • Primitive values(原始值)
    • 一般的值(Values)与原始值(Primitive values)之间的关系
    • 原始值定义

    所有 5 种能放入私有槽(亦即是说它们有相应的包装类)的值(Values),都是原始值;并且,再加上两个特殊值 undefined 和 null,那么就是所谓原始值(Primitive values)的完整集合了。

  • 对象

6.2 规范类型

  • 引用类型 (Reference Specification Type )(ECMAScript 2015 Section 6.2.3)

7. 值与对象之间的转换

  • 从值 x 到引用,调用 Object(x) 函数

    • Objext(x) 如果x是 null、undefined, 将被转换为一个一般的、空白的对象,与new Object或一个空白字面量对象(也就是{ })的效果一样。
    • Objext(x) x是一个对象,那么它只会返回原对象,而不会做任何操作
    • 如果x是string\boolean\symbol\number\BigInt Object(x)转换得到的对象实例中添加一个内部槽,存放这个x的值。(其实就是4 种值类型的包装类的实例, 可以看做普通对象添加一个PrimitiveValue内部槽而已)
          Object(123) // [object Number]
          Object('123') // [object String]
          Object(true) // [object Boolean]
          Object(Symbol() //[object Symbol]"
          ...
          obj = Object(x);
      
           // 等效于(如果能操作内部槽的话)
          obj.[[PrimitiveValue]] = x;
  • 从引用 x 到值,调用 x.valueOf() 方法;或调用 4 种值类型的包装类函数,例如 Number(x),或者 String(x) 等等。

  • 总结

从typeof(x)的 7 种结果类型来看,其中 string、boolean、number、bigint 和 symbol 的值类型与对象类型转换,就是将该值存入私有槽,或者从私有槽中把相应的值取出来就好了。

回顾总结

  • 语言中的引用类型和值类型,以及 ECMAScript 中的原始值类型(Primitive values)之间存在区别;
  • 语言中的所谓“引用类型”,与 ECMAScript 中的“引用(规范类型)”是完全不同的概念;
  • 所有值通过包装类转换成对象时,这个对象会具有一个内部槽,早期它统一称为[[PrimitiveValue]],而后来 JavaScript 为每种包装类创建了一个专属的;
  • 使用 typeof(x) 来检查 x 的数据类型,在 JavaScript 代码中是常用而有效方法;
  • 原则上来说,系统只处理 boolean/string/number 三种值类型(bigint 可以理解为 number 的特殊实现),其中 boolean 与其他值类型的转换是按对照表来处理的。

参考资料

@XiaoDHuang XiaoDHuang changed the title Node: JavaScript类型系统??? Node: JavaScript 类型系统之概述 Dec 30, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant