这种说法以偏概全
根底数据类型按值拜访,援用数据类型按援用拜访
反例: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);             ...