我与V8发动机试验。
在V8(full-codegen-x64.cc)存在此功能比较类型:
void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr,
Expression* sub_expr,
Handle<String> check)
所以,如果,例如:
typeof Obj == "object"
然后sub_expr与“typeof运算的OBJ”和检查是一个“对象”的表达对象 。
我怎样才能得到一个Expression对象JSObject,如果可能的话? - 不可能的(你不能表达是一件语法安德烈亚斯Rossberg的)
在无效FullCodeGenerator :: EmitLiteralCompareTypeof我们可以检查:
Obj is function __ CmpObjectType(rax, JS_FUNCTION_TYPE, rdx);
Obj is proxy function __ CmpInstanceType(rdx, JS_FUNCTION_PROXY_TYPE);
Obj is proxy __ CmpObjectType(rax, FIRST_NONCALLABLE_SPEC_OBJECT_TYPE, rdx);
and etc...
只是举例来说,如果我们将使用此代码:
__ CmpObjectType(rax, FIRST_NONCALLABLE_SPEC_OBJECT_TYPE, rdx);
__ j(equal, if_true);
then
typeof Proxy_Obj == 'string' ---> true
V8是怎么知道这件事? 难道是说- V8运行代码?