天天看点

var d=Date() 与 var d=new Date的区别

以下源码都来自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)

    callData.native.function = callDate;

    return CallTypeHost;

后者对应的代码:

static JSObject* constructWithDateConstructor(ExecState* exec,

JSObject*, const ArgList& args)

    return constructDate(exec, args);

ConstructType DateConstructor::getConstructData(ConstructData&

constructData)

    constructData.native.function = constructWithDateConstructor;

    return ConstructTypeHost;

同样可以分析出var a=Array()和var a=new Array()是相同的

static JSObject* constructWithArrayConstructor(ExecState* exec,

    return constructArrayWithSizeQuirk(exec, args);

// ECMA 15.4.2

ConstructType ArrayConstructor::getConstructData(ConstructData&

    constructData.native.function = constructWithArrayConstructor;

static JSValuePtr callArrayConstructor(ExecState* exec, JSObject*,

JSValuePtr, const ArgList& args)

// ECMA 15.6.1

CallType ArrayConstructor::getCallData(CallData& callData)

    // equivalent to 'new Array(....)'

    callData.native.function = callArrayConstructor;

继续阅读