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)
{
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值