Javascript String.prototype.replace===String.replace
当我使用Javascript String.prototype.replace===String.replace,javascript,Javascript,当我使用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" 为什么这段代码
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
没有替换方法。根据其构造函数的原型,这就是为什么调用此方法会成功的原因 替换方法的语法是string.replace()
,其中string
必须是字符串,而不是字符串对象。看看这个JSFIDLE。至少在chrome中,这些是不同的
String.replace()将第一个参数作为要搜索替换的字符串,然后使用其余参数,并使用method.apply将其压缩到String.prototype.replace()中
编辑:
根据您的评论了解更多详细信息
String.replace()
String.prototype.replace()
这就是我上面的JSFIDLE在Chrome控制台中呈现的内容 我认为这里有很多混杂的信息。首先,我们必须澄清
String
构造函数
因此,无论Firefox中的String.replace是什么,它都是非标准的,因此您应该远离它。显示String.replace
确实不存在
不幸的是,我无法告诉您String.replace
在Firefox中来自何处。没有提到。但它似乎不是继承的属性,因为String.hasOwnProperty('replace')
返回true
现在谈谈你问题中的几点:
我认为String.replace
应该与String.prototype.replace
相等,因为它们是相同的对象
显然不是。如果是,则返回true
。另外:String!==String.prototype
字符串实例使用的replace
方法是string.prototype.replace
。因此,如果您想使用调用
或应用
,您可以使用此方法对它们进行修改
为什么这段代码不抛出一个错误,但返回一个值
为了回答这个问题,我们必须知道这个方法在做什么。也许看看Firefox或Spidermonkey源代码可以提供一些信息
如果您对原型继承的工作原理感到困惑,请查看-和。原型内部显然有一些增强,因为它通常返回相同的结果…String.replace.call(s,'a','a')代码>抛出错误,因为它不是函数。如果执行String.replace而不执行()
,会发生什么情况?你得到了什么代码?@pimvdb我在firefox中运行这些代码,String.replace返回函数replace(){[native code]}。此外,它不会抛出错误。String对象是有效的,但是String.replace
不存在。所以String.replace==undefined
。你错了。在您的小提琴中,String.replace
是由Mootools添加的方法。看看这个不包含任何库的提琴:我错了,我知道它不是核心框架的一部分,所以我认为它是Chrome添加的东西,因为那是我使用的浏览器
function (item){
return method.apply(item, slice.call(arguments, 1));
}
function replace() { [native code] }