IE< = 11不喜欢toString.call(value)

时间:2014-11-21 03:37:42

标签: javascript angularjs internet-explorer

当我尝试运行时

function isRegExp(value) { 
  return toString.call(value) === '[object RegExp]'; 
} 

在IE< = 11(试过11和9)中,我得到TypeError: Invalid calling object。此代码适用于较新版本以及其他浏览器。

首先,我很困惑。此函数与AngularJS function相同,Angular声称支持IE 9+。当我使用它时,相同的代码行如何导致错误(从而导致我的调用函数中断),当我假设它们已经测试过它时?

其次,我很好奇究竟是什么导致了这个问题。这个值可以是Javascript中的任何东西,它似乎只是打破了我发送它的一些东西(当给出一个简单的数组时,它似乎没有破坏,但似乎很难与数组的对象数组一起使用对象......等等。

1 个答案:

答案 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