我正在阅读JavaScriptCore的源代码,过了一会儿我偶然发现了这个问题。代码排序是有道理的,但是当使用“@”时会发生什么?
[...]
if (@isArray(currentElement)) {
constructor = currentElement.constructor;
[...]
if (@isArrayConstructor(constructor) && @Array !== constructor)
constructor = @undefined;
else if (@isObject(constructor)) {
constructor = constructor.@speciesSymbol;
if (constructor === null)
constructor = @Array;
}
}
[...]
我自己找到了答案。正如@ p-s-w-g指出的那样,那些是装饰者。我正在寻找的定义可以在以下位置找到:webkit / Source / JavaScriptCore / runtime / ArrayConstructor.h
inline bool isArray(ExecState* exec, JSValue argumentValue)
{
if (!argumentValue.isObject())
return false;
JSObject* argument = jsCast<JSObject*>(argumentValue);
if (argument->type() == ArrayType || argument->type() == DerivedArrayType)
return true;
if (argument->type() != ProxyObjectType)
return false;
return isArraySlow(exec, jsCast<ProxyObject*>(argument));
}