這種說法以偏概全
基礎數據類型按值訪問,引用數據類型按引用訪問
反例:string通常是引用訪問指針
不一樣數據類型用不一樣的存取方式,具體實現看js解釋器是怎麼設定的code
//存取方式 typedef union JSValueUnion { int32_t int32; double float64; void *ptr; } JSValueUnion; //數據類型 enum { /* all tags with a reference count are negative */ JS_TAG_FIRST = -11, /* first negative tag */ JS_TAG_BIG_DECIMAL = -11, JS_TAG_BIG_INT = -10, JS_TAG_BIG_FLOAT = -9, JS_TAG_SYMBOL = -8, JS_TAG_STRING = -7, JS_TAG_MODULE = -3, /* used internally */ JS_TAG_FUNCTION_BYTECODE = -2, /* used internally */ JS_TAG_OBJECT = -1, JS_TAG_INT = 0, JS_TAG_BOOL = 1, JS_TAG_NULL = 2, JS_TAG_UNDEFINED = 3, JS_TAG_UNINITIALIZED = 4, JS_TAG_CATCH_OFFSET = 5, JS_TAG_EXCEPTION = 6, JS_TAG_FLOAT64 = 7, /* any larger tag is FLOAT64 if JS_NAN_BOXING */ }; //js變量 typedef struct JSValue { JSValueUnion u; int64_t tag; } JSValue;
#define JS_VALUE_GET_INT(v) ((v).u.int32) //若是tag是boolean就用int32讀取 switch(tag) { case JS_TAG_BOOL:res = JS_VALUE_GET_INT(val); ...
#define JS_VALUE_GET_PTR(v) ((v).u.ptr) #define JS_VALUE_GET_STRING(v) ((JSString *)JS_VALUE_GET_PTR(v)) //若是tag是string就用指針讀取 switch(tag) { case JS_TAG_STRING: { JSString *p = JS_VALUE_GET_STRING(v); ...