vard=Date()與vard=newDate的區別

nkbai發表於2009-12-30
以下原始碼都來自webkit:
var d=Date() 與 var d=new Date的區別
前者只是一個普通的函式呼叫,是通過JSValue.getCallData來執行的,而後者是建立一個物件是通過
JSValue.getConstructData來執行的
因此兩者可能存在本質的區別,區別在於呼叫返回時callData.native.function指向何處
通過對javascript core的分析可知,前者只是返回一個string,而後者則是建立了一個date物件
前者對應程式碼:
static JSValuePtr callDate(ExecState* exec, JSObject*, JSValuePtr,
const ArgList&)
{
    DBUG_ENTER();
    time_t localTime = time(0);
    tm localTM;
    getLocalTime(&localTime, &localTM);
    GregorianDateTime ts(localTM);
    return jsNontrivialString(exec, formatDate(ts) + ” ” +
formatTime(ts, false));
}

CallType DateConstructor::getCallData(CallData& callData)
{
    DBUG_ENTER();
    callData.native.function = callDate;
    return CallTypeHost;
}
後者對應的程式碼:
static JSObject* constructWithDateConstructor(ExecState* exec,
JSObject*, const ArgList& args)
{
    DBUG_ENTER();
    return constructDate(exec, args);
}

ConstructType DateConstructor::getConstructData(ConstructData&
constructData)
{
    DBUG_ENTER();
    constructData.native.function = constructWithDateConstructor;
    return ConstructTypeHost;
}

同樣可以分析出var a=Array()和var a=new Array()是相同的
static JSObject* constructWithArrayConstructor(ExecState* exec,
JSObject*, const ArgList& args)
{
    DBUG_ENTER();
    return constructArrayWithSizeQuirk(exec, args);
}

// ECMA 15.4.2
ConstructType ArrayConstructor::getConstructData(ConstructData&
constructData)
{
    DBUG_ENTER();
    constructData.native.function = constructWithArrayConstructor;
    return ConstructTypeHost;
}

static JSValuePtr callArrayConstructor(ExecState* exec, JSObject*,
JSValuePtr, const ArgList& args)
{
    DBUG_ENTER();
    return constructArrayWithSizeQuirk(exec, args);
}

// ECMA 15.6.1
CallType ArrayConstructor::getCallData(CallData& callData)
{
    DBUG_ENTER();
    // equivalent to `new Array(….)`
    callData.native.function = callArrayConstructor;
    return CallTypeHost;
}

相關文章