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;
    }
  • 相关阅读:
    HDU
    CodeForces
    CodeForces
    TensorFlow下利用MNIST训练模型并识别自己手写的数字
    李宏毅机器学习笔记2:Gradient Descent(附带详细的原理推导过程)
    李宏毅机器学习笔记1:Regression、Error
    tensorflow相关API的学习
    解决winscp中普通用户无法上传、删除、移动文件
    2019最新最全HUSTOJ本地及云端服务器搭建(基于腾讯云服务器)
    解决Ubuntu无法进行SSH连接的问题(以及如何使用SSH)
  • 原文地址:https://www.cnblogs.com/baizx/p/1703956.html
Copyright © 2011-2022 走看看