JavaScript引擎中的数据表示(上)

时间:2021-10-29 来源:未知网络 作者:996建站网

这篇文章主要就谈一个问题,也是很多人很关心的,那就是在JavaScript引擎底层,是如何表示JavaScript语言的数据的。

JavaScript中的类型

ECMAScript语言标准当中有关类型的部分(6.1 ECMAScript Language Types )

规定了JavaScript语言有7种类型(其中symbol类型在ECMAScript 2015后引入)

他们分别是Undefined, Null, Boolean, Number, String,
Object, Symbol

这里我还想多说一句,JavaScript语言有一个typeof运算符,这个运算符很有趣,当执行typeof(val)时,返回的一个字符串代表了val的类型,这个返回的字符串却不和这七种类型一一对应,想必应该是JavaScript语言设计之初的缺陷吧。

标准提供了这个表格 Table 35: typeof Operator Results

val的类型结果Undefined"undefined"Null"object"Boolean"boolean"Number"number"String"string"Symbol"symbol"Object (普通对象,没有实现 [[Call]])"object"Object (标准规定的奇异对象,没有实现[[Call]])"object"Object (实现了[[Call]])"function"Object (标准之外的奇异对象,没有实现[[Call]])与具体的实现有关. 但一定不是 "undefined", "boolean", "function", "number", "symbol", 或者 "string".

(注:普通对象指通用方法的反应为默认行为的对象,奇异对象是指不是普通对象的对象)

实现javascript引擎的底层语言,多半是C/C++,C/C++只具有大小固定、类型固定的整数、浮点、数组和结构体类型,下面分析一下在C/C++中,JavaScript的这7种类型是怎么表示的。

动态类型的表示

在分析具体类型的实现之前,我们先看一个全局的内容,就是JavaScript区分与C/C++的一个核心点——JavaScript是动态类型的语言,每一个JavaScript对象的值并不是固定的类型。下面我们分析一下动态类型机制是怎么实现的。

在看主流引擎的实现之前,我们先脑补一下动态类型可能的实现方法,很容易想到,最简单的一种实现就是,一种基于多态的实现机制:

struct Value{
       virtual void print() const = 0;
};

struct Integer: public Value{
       int value = 0;
       virtual void print() override {
              std::cout<< value << endl;
       }
};

struct String: public Value{
       std::string value:
       virtual void print() override {
              std::cout<< value << endl
       }
};

JavaScript引擎中的数据表示(上)插图

微信扫一扫 关注公众号

微信扫一扫 使用小程序

百度扫一扫 使用小程序