vard=Date()與vard=newDate的區別
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;
}
相關文章
- date類與calendar的區別
- Oracle中Date和Timestamp的區別Oracle
- java:Date和DateTime區別Java
- java.util.Date和java.sql.Date有什麼區別?JavaSQL
- oracle中sysdate和current_date兩者的區別Oracle
- ??與?:的區別
- MM-DD-RRRR / MM-DD-YYYY 的區別 (Date format)ORM
- date型別型別
- MySQL的@與@@區別MySql
- mybatis #與$的區別MyBatis
- Null 與 “” 的區別Null
- &與&&, |與||區別
- in與exist , not in與not exist 的區別
- mysql資料庫date 、datetime、time、timestamp區別MySql資料庫
- CentOS 與 Ubuntu 的區別CentOSUbuntu
- artice與section的區別
- GET 與 POST 的區別
- WebSocket 與 Socket 的區別Web
- Postgresql與MySQL的區別MySql
- chown與chmod的區別
- LESS與SASS的區別
- free 與 CFRelease 的區別
- gulp與webpack的區別Web
- @Autowired 與@Resource的區別
- let與var的區別
- post與get的區別
- HashSet與HashMap的區別HashMap
- maven與ant的區別Maven
- __new()__ 與 __init()__的區別
- TCP與UDP的區別TCPUDP
- Mysql與mongodb的區別MySqlMongoDB
- typedef與define的區別
- Eureka與Zookeeper的區別
- buffer與cache的區別
- async與defer的區別
- synchronized與Lock的區別synchronized
- kill與pkill的區別
- int與Integer的區別