当我尝试运行时
function isRegExp(value) {
return toString.call(value) === '[object RegExp]';
}
在IE< = 11(试过11和9)中,我得到TypeError: Invalid calling object
。此代码适用于较新版本以及其他浏览器。
首先,我很困惑。此函数与AngularJS function相同,Angular声称支持IE 9+。当我使用它时,相同的代码行如何导致错误(从而导致我的调用函数中断),当我假设它们已经测试过它时?
其次,我很好奇究竟是什么导致了这个问题。这个值可以是Javascript中的任何东西,它似乎只是打破了我发送它的一些东西(当给出一个简单的数组时,它似乎没有破坏,但似乎很难与数组的对象数组一起使用对象......等等。
答案 0 :(得分:6)
如果你想做与Angular完全相同的事情,你应该这样做:
function isRegExp(value) {
return Object.prototype.toString.call(value) === '[object RegExp]';
}
注意this section of code,用于定义快捷方式toString
。
示例:
var toString = Object.prototype.toString;
function isRegExp(value) {
return toString.call(value) === '[object RegExp]';
}
snippet.log(isRegExp(/foo/)); // true
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
执行此toString
而不是instanceof
或类似的事情的原因是Object.prototype.toString
的行为定义得非常明确in the spec,这项技术即使在您正在测试的RegExp
对象来自另一个窗口,而在这种情况下使用instanceof
不起作用。以下示例显示:http://jsbin.com/sehivi