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

hfyxw5xn  于 4个月前  发布在  Java
关注(0)|答案(2)|浏览(45)

我使用了一个特定的框架,在我的代码中,我有一个函数作为参数。
我想检查这个函数是否是一个特定的匿名函数,我没有访问原始函数本身的权限来获得适当的引用。
我正在为自己创建一些调试工具(非生产),我想检查func.toString()的值是否为:
function(){return undefined }
.来检查它是否是这个特定的函数,并处理一些特殊情况。

问题

toString() JavaScript的输出是否“保证”在每个浏览器/实现中都是相同的?或者其他浏览器是否会对其进行不同的格式设置,删除不必要的空格,或者根本不返回输出?

备注

我知道这些在任何正常情况下都是可怕的做法,但这将是在调试工具,只有我或我的团队中的人将使用.在理论上,我们也控制我们使用的浏览器,但我更感兴趣的是从理论的Angular 来看.

密码

这不是问题的必要条件,而是为了给予更多的背景。
代码是一个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( '---------------------------' );
    }
};

字符串
Package :

<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提到的荣誉完全相同的源代码。

juud5qan

juud5qan1#

从ES 2018开始,规范要求toString()的返回值与声明的源代码完全相同,包括任何空格和/或注解-或者,如果主机由于某种原因没有源代码,则要求返回本机函数字符串。可以在兼容性表中找到对此修订行为的支持。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString
如果我理解正确,自2018年以来,所有浏览器和运行时环境都必须返回相同的字符串。

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

是的,从2018年开始。

5n0oy7gb

5n0oy7gb2#

Function.prototype.toString函数是规范的一部分,但它不够严格,无法保证完整的字符串比较(就像您所做的那样)能够正常工作。
规范唯一强制的是输出是NativeFunction的有效字符串表示,因此两个实现可以在输出不同字符串(例如:不同的缩进,回车等)时遵守此规范。

相关问题