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

Zam*_*ezi 1 javascript internet-explorer angularjs

当我试图跑

function isRegExp(value) { 
  return toString.call(value) === '[object RegExp]'; 
} 
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jos*_*sep 6

如果你想做与Angular完全相同的事情你应该像这样做:

function isRegExp(value) { 
  return Object.prototype.toString.call(value) === '[object RegExp]'; 
} 
Run Code Online (Sandbox Code Playgroud)

请注意定义快捷方式的此部分代码toString.

例:

var toString = Object.prototype.toString;
function isRegExp(value) { 
  return toString.call(value) === '[object RegExp]'; 
}
snippet.log(isRegExp(/foo/)); // true
Run Code Online (Sandbox Code Playgroud)
<!-- 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>
Run Code Online (Sandbox Code Playgroud)

做这toString件事而不是instanceof或类似的原因Object.prototype.toString在规范中非常明确地定义了行为,并且这种技术即使在RegExp你正在测试的对象来自另一个窗口时instanceof也能工作,而在这种情况下使用不起作用.这是一个示例:http://jsbin.com/sehivi