乐趣区

从QuickJS的JSValue了解变量存取方式

这种说法以偏概全
根底数据类型按值拜访,援用数据类型按援用拜访
反例:string 个别是援用拜访

js 变量

不同数据类型用不同的存取形式,具体实现看 js 解释器是怎么设定的

// 存取形式
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;

以 boolean 为例

#define JS_VALUE_GET_INT(v) ((v).u.int32)

// 如果 tag 是 boolean 就用 int32 读取
switch(tag) {case JS_TAG_BOOL:res = JS_VALUE_GET_INT(val);    
    ...

以 string 为例

#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); 
            ...
退出移动版