代码之家  ›  专栏  ›  技术社区  ›  Dirk Boer

toString()JavaScript输出是否“保证”在每个浏览器/实现中都相同?

  •  0
  • Dirk Boer  · 技术社区  · 2 年前

    我正在使用一个特定的框架,在我的代码中的某个地方,我有一个函数作为参数。

    我想检查该函数是否是该框架之外的特定匿名函数。我无法访问原始函数本身以获得适当的引用。

    我正在为自己创建一些调试工具(非生产),我想检查的值 func.toString() 是:

    function(){return undefined }

    …来检查它是否是这个特定的功能,并处理一些特殊情况。

    问题

    是 toString() JavaScript输出在某种程度上“保证”在每个浏览器/实现中都是一样的?或者可能是其他浏览器,即格式化不同,删除不必要的空格,或者根本不返回输出?

    笔记

    我知道这些在任何正常情况下都是糟糕的做法,但这将出现在只有我或我的团队中的人才会使用的调试工具中。理论上,我们也控制我们使用的浏览器,但从理论角度来看,我更感兴趣。

    代码

    不是这个问题所必需的,而是为了提供更多的上下文。

    该代码是一个knockout.js调试绑定处理程序,在这里我可以很容易地看到 element 是

    ko.bindingHandlers.debug = 
    {
        init: function(element:HTMLElement, valueAccessor:Action, allBindingsAccessor, viewModel, bindingContext:KnockoutBindingContext) 
        {
            let value = valueAccessor();
    
            // only "real way" to check for undefined, if the propery itself would be undefined
            // the normal use of valueAcessor() would also return undefined, so we can't differentiate between
            // an unexisting property or deliberately leaving out the property
            if ( valueAccessor.toString() == 'function(){return undefined }' )
                value = bindingContext.$data;
    
            console.log( '----- Knockoutbinding -----' );
            console.log( element );
            console.log( value );
            console.log( '---------------------------' );
        }
    };
    

    用途:

    <div data-bind="debug: window.innerHeight">          <!-- 450 -->
    <div data-bind="debug: window.nonExistingProperty">  <!-- undefined -->
    <div data-bind="debug: $data"></div>                 <!-- current context -->
    <div data-bind="debug"></div>                        <!-- current context (new) -->
    

    使现代化

    我只是做了一些简单的测试,Chrome、Firefox和Edge似乎至少遵守了@jabaa提到的完全相同的源代码。

    2 回复  |  直到 2 年前
        1
  •  2
  •   jabaa    2 年前

    自ES2018以来,规范要求的返回值为 toString() 要与声明的源代码完全相同,包括任何空格和/或注释,或者,如果主机由于某种原因没有可用的源代码,则需要返回本机函数字符串。可以在兼容性表中找到对此修订行为的支持。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString

    如果我理解正确的话,自2018年以来,所有浏览器和运行时环境都必须返回相同的字符串。

    *toString()JavaScript输出是否“保证”在每个浏览器/实现中都相同?"

    是的,从2018年开始。

        2
  •  2
  •   Guerric P    2 年前

    这个 Function.prototype.toString 函数是的一部分 specification ,但它还不够严格,无法保证完整的字符串比较(就像您所做的那样)会起作用。

    规范唯一强制执行的是,输出是的有效字符串表示形式 NativeFunction 因此,在输出不同的字符串(例如:不同的缩进、回车等)时,两个实现可以符合此规范