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