打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
v8引擎的几个数据结构和基本概念(荐)
1、String
String{    +0x00   map    +0x04   hash    +0x08   length    +0x0C   value    ......}
2、Array
Array{              //大小 0x18     +0x00   map    +0x04   empty_fixed_array    +0x08   data pointer     // fixed array    +0x0c   array length}

Arrays in V8 are represented by the v8::internal::JSArray class, and have the following layout (all object layouts assume 64-bit):

 0x0|-------------------------    |kMapOffset 0x8|-------------------------    |kPropertiesOffset0x10|-------------------------    |kElementsOffset0x18|-------------------------    |kLengthOffset0x20|-------------------------

These have a pointer to a variable sized v8::internal::FixedArray or av8::internal::FixedDoubleArray (in the kElementsOffset field), which holds the actual elements:

 0x0|-------------------------    |kMapOffset 0x8|-------------------------    |kLengthOffset0x10|-------------------------    |element 00x18|-------------------------    |element 10x20|-------------------------    |element 20x28|-------------------------    |...    |-------------------------
3、FixedArray
FixedArray是V8实现的一个类似于数组的类,它表示一段连续的内存
FixedArray{      // 大小随数据而定    +0x00   map    +0x04   length    data}


4、Uint32Array
Uint32Aray{    //(TypedArray)    大小 0x28    +0x00   map    +0x04   empty_fixed_array    +0x08   ArrayPointer     +0x0c   ArrayBuffer Pointer    +0x10   0    +0x14   ArrayBuffer size    +0x18   NaN    +0x1c   ArrayLength    +0x20   0    +0x24   0}
5、Int32Array
Struct Int32Array     allocated at Custom Heap
{
    void* pvftable;
    DOWRD var_2;
    DOWRD var_3;
    DOWRD var_4;
    DOWRD var_5;
    DOWRD var_6;
    DOWRD size;            //条目的个数,字节数等于这项的值*4
    void* pTypeArrayData;     //Arraybuffer Data
    void* pArrayBuffer;   //Arraybuffer Object
    DWORD var_10;
    DWORD var_11;
    DWORD var_12;
}


6、ArrayBuffer
ArrayBuffer{    //  大小 0x20    +0x00   map,指针    +0x04   empty_fixed_array,prototype指针    +0x08   empty_fixed_array,elements指针    +0x0c   buffer_size,    +0x10   backing_store,指针    +0x14   4,byte_length,定义的缓冲区字节长度    +0x18   0    +0x1c   0}
Struct ArrayBuffer      allocated at Custom Heap
{
    void* pvftable;
    DOWRD var_2;
    DOWRD var_3;
    DOWRD var_4;
    void* pTypeArrayData;       //Arraybuffer Data
    DWORD size;                 //array bytes
    DWORD var_10;
    DWORD var_11;
}

JSArrayBuffer

ArrayBuffers are represented by v8::internal::JSArrayBuffer and look like:

 0x0|-------------------------    |kMapOffset 0x8|-------------------------    |kPropertiesOffset0x10|-------------------------    |kElementsOffset0x18|-------------------------    |kByteLengthOffset0x20|-------------------------    |kBackingStoreOffset0x28|-------------------------    |kAllocationBaseOffset0x30|-------------------------    |kAllocationLengthOffset0x38|-------------------------    |kBitFieldSlot0x40|-------------------------
7、map
这里的Map并不是哈希的意思,更接近于地图的意义,用来操作FixedArray表示的这段内存。V8根据constant_properties的length,去开辟相应大小空间的Map:

map{        //  大小 0x2c
+0x00 map +0x04 istance_size // byte +0x05 InObjectProperties_or_ConstructorFunctionIndex //byte +0x06 unused +0x07 visitorId //byte +0x08 instance_type //byte +0x09 bit_field //byte +0x0a bit_field2 //byte +0x0b unused +0x0c bit_field3 //byte +0x10 prototype +0x14 constructor +0x18 transitor_or_protytypeInfo +0x1c discriptor +0x20 CodeCache +0x24 DependentCode +0x28 WeakCellCache}


8、全局对象描述

全局对象是预定义的对象,作为 JavaScript 的全局函数和全局属性的占位符。通过使用全局对象,可以访问所有其他所有预定义的对象、函数和属性。全局对象不是任何对象的属性,所以它没有名称。

在顶层 JavaScript 代码中,可以用关键字 this 引用全局对象。但通常不必用这种方式引用全局对象,因为全局对象是作用域链的头,这意味着所有非限定性的变量和函数名都会作为该对象的属性来查询。例如,当JavaScript 代码引用 parseInt() 函数时,它引用的是全局对象的 parseInt 属性。全局对象是作用域链的头,这意味着在顶层 JavaScript 代码中声明的所有变量都将成为全局对象的属性。

全局对象只是一个对象,而不是类。既没有构造函数,也无法实例化一个新的全局对象。

在 JavaScript 代码嵌入一个特殊环境中时,全局对象通常具有环境特定的属性。实际上,ECMAScript 标准没有规定全局对象的类型,JavaScript 的实现或嵌入的 JavaScript 都可以把任意类型的对象作为全局对象,只要该对象定义了这里列出的基本属性和函数。例如,在允许通过 LiveConnect 或相关的技术来脚本化 Java 的 JavaScript 实现中,全局对象被赋予了这里列出的 java 和 Package 属性以及 getClass() 方法。而在客户端 JavaScript 中,全局对象就是 Window 对象,表示允许 JavaScript 代码的 Web 浏览器窗口。

例子

在 JavaScript 核心语言中,全局对象的预定义属性都是不可枚举的,所有可以用 for/in 循环列出所有隐式或显式声明的全局变量,如下所示:var variables = "";for (var name in this) {variables += name + "<br />";}document.write(variables);

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
javascript对象的基本知识
博客园 - 鸟食轩 - 比较JavaScript中的集合及其检索效率
JavaScript中var arr=new Array()和var arr=[] 的区别 | 司马...
javascript中instanceof和typeof的用法区别
JavaScript Array(数组)对象
AAuto,PHP,Javascript语法比较
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服