String{ +0x00 map +0x04 hash +0x08 length +0x0C value ......}
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|------------------------- |... |-------------------------
FixedArray
是V8实现的一个类似于数组的类,它表示一段连续的内存
FixedArray{ // 大小随数据而定 +0x00 map +0x04 length data}
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;
}
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|-------------------------
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);
联系客服