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;
    }
  • 相关阅读:
    常见图片格式PNG,JPEG,BMP,GIF区别总结
    sql在所有存储过程中查询包含某字符串的执行语句
    数字取整或保留小数四舍五入的正确写法
    SVG路径path的贝塞尔曲线指令
    查询总耗CPU最多与平均耗CPU最多的SQL语句
    MIME 参考手册
    SQL语句复制父子级表数据
    去掉数字格式结尾多余的零,补充数字格式结尾需要的零
    设置微信分享的标题 缩略图 连接 描述
    linux环境下php开启redis扩展(centos6.8)
  • 原文地址:https://www.cnblogs.com/baizx/p/1703956.html
Copyright © 2011-2022 走看看