Javascript 使用===检查String.replace()是否实际执行了替换?
我想知道Javascript 使用===检查String.replace()是否实际执行了替换?,javascript,string,replace,equality,Javascript,String,Replace,Equality,我想知道String.replace()是否确实找到了匹配项并执行了替换。由于String.replace()返回的是结果字符串,而不是执行的替换次数,因此我似乎必须将原始字符串与结果进行比较 问题是,我应该使用==还是==进行比较 据我所知,如果没有发生匹配,则或都没有指定返回的字符串必须与传入的字符串是同一对象 另一方面,任何JavaScript实现返回未更改字符串的副本似乎都是愚蠢的 具体地说,这会发生什么 var s = 'abc'; var t = s.replace(/d/, 'D'
String.replace()
是否确实找到了匹配项并执行了替换。由于String.replace()
返回的是结果字符串,而不是执行的替换次数,因此我似乎必须将原始字符串与结果进行比较
问题是,我应该使用==
还是==
进行比较
据我所知,如果没有发生匹配,则或都没有指定返回的字符串必须与传入的字符串是同一对象
另一方面,任何JavaScript实现返回未更改字符串的副本似乎都是愚蠢的
具体地说,这会发生什么
var s = 'abc';
var t = s.replace(/d/, 'D');
console.log(s === t); // I expect true, but am not sure
是吗
正确
?如果是,该行为记录在哪里s==t
,或者使用替换回调闭包进行一些巧妙的操作)true
事实上,我确实把问题搞砸了,结果它成了一个X-Y问题。我真正想知道的是,我如何检查是否发生了任何替换(替换的实际数量无关紧要-一次或多次都是相同的)?并且可以高效地执行此操作,而无需执行单独的
.match()
或逐个字符的比较。并且确保结果由语言规范保证。这没有什么区别
为什么??因为String.replace
对字符串进行操作,并返回一个字符串。此外,字符串是基本体,而不是对象
您已经知道您有两个字符串<因此,代码>=和
==
在这方面是相同的。我甚至可以说,==
是多余的。字符串类上的替换
方法总是返回字符串,因此==
与=
一样安全可靠,因为不会发生类型强制。其次,如果没有发生替换,则测试将返回true,因为它们包含相同的字符。===
将不适用于字符串
对象:
a = new String("foo")
a.replace(/XXX/, "") == a
> true
a.replace(/XXX/, "") === a
> false
或任何具有自定义toString
方法的对象:
b = { toString: function() { return "foo" }}
"foo".replace(/XXX/, "") == b
> true
"foo".replace(/XXX/, "") === b
> false
大多数时候,这不是一个问题,但正如他们所说的那样是“Praemonitos,Praemonitos”
回答您的更新:如图所示,如果无法进行替换,至少V8经过优化以返回主题本身:
int32_t* current_match = global_cache.FetchNext();
if (current_match == NULL) {
if (global_cache.HasException()) return isolate->heap()->exception();
return *subject; <-------
int32\u t*current\u match=global\u cache.FetchNext();
if(当前匹配==NULL){
if(global_cache.haseexception())返回隔离->堆()->exception();
return*subject;给出您的示例
“是否保证打印为真?如果是,该行为记录在哪里?”
是的,它被记录在=
和==
使用的相应相等比较算法中
“这是一种未定义且不可靠的行为(即,我应该测试s==t,或者使用替换回调闭包进行一些巧妙的操作)?”
不,这是定义良好的行为。请参见上文。=
和==
运算符的行为相同
“实际上,是未定义的行为在每个JavaScript实现上都返回true吗?”
只要一个实现遵循规范,它就会返回true
我只需尝试这两种方法并找出答案……此外,如果您想知道将进行多少次替换,请使用String.match(/d/g)
Alex:如果没有匹配,那么返回原始字符串还是新字符串又有什么关系呢?这对==
和===
@BenTaberstring所做的比较没有影响。match(/d/g)。length
:)@barakmanos Trying无法帮助我区分案例1、2和3。“字符串是原语,而不是对象。”对于给定的示例是正确的,但并不总是如此。有字符串原语和字符串对象,但它们不一样。@stevuu正要发布相同的内容。大多数人使用字符串的方式是原语,但调用字符串构造函数时,返回对象。“大多数人使用字符串的方式…”-有人使用字符串对象而不是原语吗?到目前为止,这是唯一一个强调字符串对象和字符串原语警告的答案+1@stevuu:好的,这个问题对于提供的示例来说似乎非常具体,但我想这里的信息仍然值得注意。