zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    bzoj1037: [ZJOI2008]生日聚会Party(DP)
    bzoj1034: [ZJOI2008]泡泡堂BNB(贪心)
    bzoj1025: [SCOI2009]游戏(数学 + 思维 + DP)
    第十章、嵌入式Linux的调试技术 读书笔记
    第九章、硬件抽象层:HAL 读书笔记
    第八章 让开发板发出声音:蜂鸣器驱动
    ANDROID深度探索(卷1)HAL与驱动开发 第七章
    ANDROID深度探索(卷1)HAL与驱动开发 第六章
    ANDROID深度探索(卷1)HAL与驱动开发 第五章
    ANDROID深度探索(卷1)HAL与驱动开发 第四章
  • 原文地址:https://www.cnblogs.com/baizx/p/1703956.html
Copyright © 2011-2022 走看看