我使用了一个特定的框架,在我的代码中,我有一个函数作为参数。
我想检查这个函数是否是一个特定的匿名函数,我没有访问原始函数本身的权限来获得适当的引用。
我正在为自己创建一些调试工具(非生产),我想检查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提到的荣誉完全相同的源代码。
2条答案
按热度按时间juud5qan1#
从ES 2018开始,规范要求
toString()
的返回值与声明的源代码完全相同,包括任何空格和/或注解-或者,如果主机由于某种原因没有源代码,则要求返回本机函数字符串。可以在兼容性表中找到对此修订行为的支持。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString
如果我理解正确,自2018年以来,所有浏览器和运行时环境都必须返回相同的字符串。
*toString()JavaScript输出是否“保证”在每个浏览器/实现中都相同?"
是的,从2018年开始。
5n0oy7gb2#
Function.prototype.toString
函数是规范的一部分,但它不够严格,无法保证完整的字符串比较(就像您所做的那样)能够正常工作。规范唯一强制的是输出是
NativeFunction
的有效字符串表示,因此两个实现可以在输出不同字符串(例如:不同的缩进,回车等)时遵守此规范。