首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript的indexOf shim澄清?

Javascript的indexOf shim澄清?
EN

Stack Overflow用户
提问于 2013-12-03 14:37:46
回答 1查看 625关注 0票数 2

我看到了at mdn应该使用的代码-如果没有indexOf实现的话。

该算法与ECMA-262中指定的算法相匹配.像他们说的

这是密码:

代码语言:javascript
复制
/*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向我展示了这一点(这是完全合乎逻辑的):

为什么会有这张支票?我是不是漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-03 14:40:20

不一定--这是因为indexOf()本机函数使用传递的直接this值,而不是转换为对象的值(等效于在严格模式下发生的事情),这样的shim需要检查这是否符合。例如,这段代码将引发一个TypeError

代码语言:javascript
复制
var a = Array.prototype.indexOf;
a();

它将抛出一个TypeError,因为this值未转换为对象或更改为全局对象。在用户定义的非严格函数中,如果没有父对象,this的值就是全局对象,但在ES5严格模式下,它作为undefined本身传递。另一种情况是,当您专门使用nullundefined调用它时。

代码语言:javascript
复制
"use strict";
Array.prototype.indexOf.call(null); // TypeError, what else can we do?

在ES5规范中,--此值引用作为thisArg传递的原始值,不作任何更改。在非严格模式下,用户定义函数中的代码无法访问this值,但是本机函数能够显式指定this值的使用,而不是this关键字的计算结果(在规范中称为ThisBinding )。在严格的模式下,他们对同一件事进行评估。

由于本机版本能够在非严格模式下访问this值的非装箱版本(直接传递给内部函数[[ToObject]],在试图转换nullundefined时抛出TypeError ),因此需要实现此检查以满足规范的要求。

注意:从技术上讲,问题中的代码示例并不完全符合ES5规范,因为this值可能是错误的,这将使其失败,即使理论上应该继续(如果false作为this值传递,则indexOf()的本机实现不会抛出)。此外,如果这个值实际上是未定义的或为null,则全局对象将被通过,因此它将通过if (!this)测试,即使它不应该通过。这不能简单地通过检查参数不是全局对象来解决,因为如果全局对象被显式传递(这是允许的),这将失败。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20354040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档