首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String.prototype.replace === String.replace

String.prototype.replace === String.replace
EN

Stack Overflow用户
提问于 2011-10-18 21:07:25
回答 4查看 1.6K关注 0票数 1

当我使用call()apply()时,我遇到了一个问题。

代码语言:javascript
复制
console.log(String.prototype.replace === String.replace);//false

我认为String.replace应该等同于String.prototype.replace,因为它们是同一个对象。

然而,它们是不同的。

当我运行下面的代码时会发生什么:

代码语言:javascript
复制
var s = "a b c";
String.replace.call(s,'a','A');//return "a" 

为什么这段代码不抛出错误,而是返回值呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-18 22:24:44

我认为这里有很多混杂的信息。首先,我们要澄清的是String构造函数does not have a replace method

所以,无论火狐中的String.replace是什么,它都是非标准的,因此你应该远离它。A quick test in Chrome表明String.replace确实不存在于此。

不幸的是,我无法告诉你String.replace在火狐中是从哪里来的。The documentation没有提到这一点。但它似乎不是继承的属性,因为String.hasOwnProperty('replace')返回true

现在来谈谈你问题中的一些要点:

我认为String.replaceString.prototype.replace应该是一样的,因为它们是同一个对象。

显然他们不是。如果是,它将返回true。还有:String !== String.prototype

string实例使用的replace方法是String.prototype.replace。因此,如果你想使用callapply,你可以使用这个方法。

为什么这段代码不抛出错误,而是返回值?

为了回答这个问题,我们必须知道这个方法在做什么。也许看一看Firefox或Spidermonkey的源代码就能提供一些信息。

如果您对原型继承的工作原理感到困惑,可以看看MDN JavaScript Guide - Details of the object modelInheritance revisited

票数 0
EN

Stack Overflow用户

发布于 2011-10-18 21:11:37

这将是真的:

代码语言:javascript
复制
(new String()).replace === String.prototype.replace

这将不会:

代码语言:javascript
复制
String.prototype.replace === String.replace

String是一个构造函数,这只是一个函数。

String.prototype是一个对象,使用new String()创建的其他对象将在没有属性的情况下搜索这些属性。

new String()将创建一个新对象。请考虑以下内容:

代码语言:javascript
复制
var s = new String();
s.replace(...);

实际上,s没有replace方法。通过其构造函数has的原型,这就是调用此方法将会成功的原因。

票数 0
EN

Stack Overflow用户

发布于 2011-10-18 21:12:37

replace()方法的语法是string.replace(),其中string必须是字符串,而不是字符串对象。

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

https://stackoverflow.com/questions/7807677

复制
相关文章

相似问题

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