[英]Using string.prototype.replace with a regexp and a function
[英]String.prototype.replace === String.replace
当我使用call()
或apply()
,出现了问题。
console.log(String.prototype.replace === String.replace);//false
我认为String.replace
应该与String.prototype.replace
相等,因为它们是同一对象。
但是,它们彼此不同。
当我运行以下代码时会发生什么:
var s = "a b c";
String.replace.call(s,'a','A');//return "a"
为什么此代码不引发错误,但返回值?
这将是正确的:
(new String()).replace === String.prototype.replace
而且这不会:
String.prototype.replace === String.replace
String
是构造函数,这只是一个函数。
String.prototype
是一个对象,在该对象中,使用new String()
创建的其他对象将在没有属性的情况下搜索属性。
new String()
创建一个新对象。 考虑一下:
var s = new String();
s.replace(...);
其实s
没有替换方法。 通过其构造函数的原型,这就是为什么调用此方法将成功的原因。
replace()
方法的语法为string.replace()
,其中string
必须是字符串, 而不是 String对象。
看看这个jsfiddle http://jsfiddle.net/GmFmR/ 。 至少在铬中是不一样的。
String.replace()将第一个参数用作要搜索替换的字符串,然后使用其余参数,然后使用method.apply将其泵送到String.prototype.replace()中。
编辑:
根据您的评论获取更多详细信息
String.replace()
function (item){
return method.apply(item, slice.call(arguments, 1));
}
String.prototype.replace()
function replace() { [native code] }
这就是我上面的jsfiddle在Chrome控制台中呈现的内容。
我认为这里有很多混杂的信息。 首先,我们必须阐明String
构造函数没有replace
方法 。
因此,无论Firefox中的String.replace
是什么,它都是非标准的,因此您应该远离它。 在Chrome中进行的快速测试表明,那里确实不存在String.replace
。
不幸的是,我无法告诉您String.replace
在Firefox中来自何处。 该文档没有提及它。 但这似乎不是继承的属性,因为String.hasOwnProperty('replace')
返回true
。
现在到您的问题的几点:
我认为
String.replace
应该与String.prototype.replace
相等,因为它们是同一对象。
显然他们不是。 如果是,它将返回true
。 另外: String !== String.prototype
。
字符串实例使用的replace
方法是String.prototype.replace
。 因此,如果您要使用call
或apply
,则可以使用此方法。
为什么此代码不引发错误,但返回值?
为了回答这个问题,我们必须知道该方法在做什么。 也许看看Firefox或Spidermonkey源提供的一些信息。
如果您对原型继承的工作方式感到困惑,请查看《 MDN JavaScript指南 - 对象模型和继承的 详细信息》 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.