JavaScript 对象与 C 对象间的转换关系
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
JavaScript 是一门弱类型的语言,变量的值的类型在运行时才确定,而且可以在运行时被修改为其他类型的变量;而 C 语言,是一门静态类型的语言,变量类型在编译时就已经确 定。因此,这两者之间变量的互访就有了一定的难度,SpiderMonkey 提供了一个通用的数据类型 jsval 来完成两者之间的交互。
事实上,在C代码中定义的jsval类型的变量可以是JavaScript中的字符串,数字,对象,布尔值,以及 null 或者 undefined。基于这个类型,SpiderMonkey 提供了大量的类型判 断及类型转换的宏和函数。可以参看下表:
JavaScript类型 | jsval 类型判断 | jsval 常量 | jsval 转化 |
---|---|---|---|
null | JSVAL_IS_NULL(v) | JSVAL_NULL | |
Undefined | JSVAL_IS_VOID(v) | JSVAL_VOID | |
Boolean | JSVAL_IS_BOOLEAN( v) | JSVAL_TRUE, JSVAL_FALSE, BOOLEAN_TO_JSVAL( b) | JSVAL_TO_BOOLEAN(v) |
number | JSVAL_IS_NUMBER(v ), JSVAL_IS_INT(v), JSVAL_IS_DOUBLE(v ) | INT_TO_JSVAL(i), DOUBLE_TO_JSVAL(d ) | JSVAL_TO_INT(v), JSVAL_TO_DOUBLE(v) |
string | JSVAL_IS_STRING(v ) | STRING_TO_JSVAL(s ) | JSVAL_TO_STRING(v), JS_GetStringChars(s |
), JS_GetStringLength( s) | |||
object | JSVAL_IS_OBJECT(v ) && JSVAL_IS_NULL(v) | OBJECT_TO_JSVAL(o ) | JSVAL_TO_OBJECT(v) |
应该注意的是,jsval 有一定的缺陷:
- jsval并非完全的类型安全,在进行类型转换之前,你需要明确被转换的对象的真正类型,比如一个变量的值为 number 类型,而对其做向字符串的转化,则可能引起程序 崩溃。解决方法是,在转换之前,先做判断。
- jsval 是 SpiderMonkey 垃圾回收机制的主要目标,如果 jsval 引用一个 JavaScript 对象,但是垃圾收集器无法得知这一点,一旦该对象被释放,jsval 就会引用到一个悬空指针。这样很容易使得程序崩溃。解决方法是,在引用了 JavaScript 对象之后,需 要显式的告知垃圾收集器,不引用时,再次通知垃圾收集器。
在线练习
{$ activeFileHint $}