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