我看到了at mdn应该使用的代码-如果没有indexOf实现的话。
该算法与ECMA-262中指定的算法相匹配.像他们说的
这是密码:
/*1*/ if (!Array.prototype.indexOf) {
/*2*/ Array.prototype.indexOf = function (searchElement , fromIndex) {
/*3*/ var i,
/*4*/ pivot = (fromIndex) ? fromIndex : 0,
/*5*/ length;
/*6*/
/*7*/ if (!this) {
/*8*/ throw new TypeError();
/*9*/ }
/*10*/
/*11*/ length = this.length;
/*12*/
/*13*/ if (length === 0 || pivot >= length) {
/*14*/ return -1;
/*15*/ }
/*16*/
/*17*/ if (pivot < 0) {
/*18*/ pivot = length - Math.abs(pivot);
/*19*/ }
/*20*/
/*21*/ for (i = pivot; i < length; i++) {
/*22*/ if (this[i] === searchElement) {
/*23*/ return i;
/*24*/ }
/*25*/ }
/*26*/ return -1;
/*27*/ };
/*28*/ }但我的问题是关于第7行:
如果我写:
[].indexOf - this是数组本身。(见鬼,它是附在Array.prototype.indexOf的第一位)。
我的意思是- this将永远是真实的价值。那么,,为什么存在这种检查呢?
此外- Resharper向我展示了这一点(这是完全合乎逻辑的):

为什么会有这张支票?我是不是漏掉了什么?
发布于 2013-12-03 14:40:20
不一定--这是因为indexOf()本机函数使用传递的直接this值,而不是转换为对象的值(等效于在严格模式下发生的事情),这样的shim需要检查这是否符合。例如,这段代码将引发一个TypeError
var a = Array.prototype.indexOf;
a();它将抛出一个TypeError,因为this值未转换为对象或更改为全局对象。在用户定义的非严格函数中,如果没有父对象,this的值就是全局对象,但在ES5严格模式下,它作为undefined本身传递。另一种情况是,当您专门使用null或undefined调用它时。
"use strict";
Array.prototype.indexOf.call(null); // TypeError, what else can we do?在ES5规范中,--此值引用作为thisArg传递的原始值,不作任何更改。在非严格模式下,用户定义函数中的代码无法访问this值,但是本机函数能够显式指定this值的使用,而不是this关键字的计算结果(在规范中称为ThisBinding )。在严格的模式下,他们对同一件事进行评估。
由于本机版本能够在非严格模式下访问this值的非装箱版本(直接传递给内部函数[[ToObject]],在试图转换null或undefined时抛出TypeError ),因此需要实现此检查以满足规范的要求。
注意:从技术上讲,问题中的代码示例并不完全符合ES5规范,因为this值可能是错误的,这将使其失败,即使理论上应该继续(如果false作为this值传递,则indexOf()的本机实现不会抛出)。此外,如果这个值实际上是未定义的或为null,则全局对象将被通过,因此它将通过if (!this)测试,即使它不应该通过。这不能简单地通过检查参数不是全局对象来解决,因为如果全局对象被显式传递(这是允许的),这将失败。
https://stackoverflow.com/questions/20354040
复制相似问题