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;
    }
  • 相关阅读:
    strftime和strptime函数对时间的转换操作
    第四章文件和目录学习笔记
    getenv和putenv在获取和设置环境变量中的使用
    SQL 常用语句以及函数(个人收藏)
    详测 Generics Collections TQueue (2): Create、Count、Clear、TrimExcess
    详测 Generics Collections TQueue (1): Enqueue、Dequeue、Peek
    详测 Generics Collections TList (9): BinarySearch
    详测 Generics Collections TList (8): Sort
    详测 Generics Collections TList (4): AddRange、InsertRange、DeleteRange
    详测 Generics Collections TList (7): Items、Contains
  • 原文地址:https://www.cnblogs.com/baizx/p/1703956.html
Copyright © 2011-2022 走看看