gpt4 book ai didi

javascript - 使用 === 检查 String.replace() 是否实际执行了替换?

转载 作者:行者123 更新时间:2023-12-01 23:23:18 25 4
gpt4 key购买 nike

我想知道 String.replace() 是否确实找到了匹配项并执行了替换。由于 String.replace() 返回结果字符串而不是执行的替换次数,看来我必须将原始字符串与结果进行比较。

问题是,我应该使用 === 还是 == 进行比较?

据我所知,Mozilla documentation 都没有。也不是 ECMAScript 5.1 Standard指定如果未发生匹配,则返回的字符串必须与传入的字符串是同一对象。

另一方面,对于任何 JavaScript 实现来说,返回未更改字符串的副本似乎都是愚蠢的。

具体来说,会发生什么

var s = 'abc';
var t = s.replace(/d/, 'D');
console.log(s === t); // I expect true, but am not sure

是吗

  1. 保证打印true?如果是这样,该行为记录在哪里?
  2. 未定义且不可靠的行为(即,我应该测试 s == t,或者使用替换回调闭包做一些巧妙的事情)?
  3. 实际上,每个 JavaScript 实现都会返回 true 的未定义行为?

编辑

@cookiemonster 询问:

So it seems that you're not really wondering if the result is guaranteed, but more whether an implementation is optimized to perform an identity comparison internally. Is that right?

事实上,我确实把问题搞砸了,最终变成了一个 X-Y 问题。我真正想知道的是,如何检查是否发生了替换(替换的实际次数并不重要 - 一次或多次都是相同的)?并且可以高效地完成此操作,无需进行单独的 .match() 或逐个字符的比较。并确保结果受到语言规范的保证。

最佳答案

=== 不适用于 String 对象:

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

大多数时候,这不是问题,但正如他们所说的“praemonitus,praemunitus”。

回答您的更新:如所见here ,至少 V8 进行了优化,如果无法进行替换,则返回主题本身:

  int32_t* current_match = global_cache.FetchNext();
if (current_match == NULL) {
if (global_cache.HasException()) return isolate->heap()->exception();
return *subject; <-------

并且,尽管standard只需要两个字符串看起来相同即可严格相等(===),我绝对确信每个 JS 引擎都足够聪明,可以避免 strcmp等号指针。

关于javascript - 使用 === 检查 String.replace() 是否实际执行了替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24163414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com