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;
    }
  • 相关阅读:
    文件异步上传-ajaxFileUpload
    C# 结构体
    c# nullable类型有什么用
    跨平台理论杂记
    C#类型转换
    C# is as
    C# 类
    CLR的执行模型
    C# 与 LUA 的经验对比
    C#中的Decimal类型
  • 原文地址:https://www.cnblogs.com/baizx/p/1703956.html
Copyright © 2011-2022 走看看