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

时间:2014-06-11 12:50:15

标签: javascript string replace equality

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

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

据我所知,Mozilla documentationECMAScript 5.1 Standard都没有指定返回的字符串必须与传入的字符串相同,如果没有匹配则发生。< / p>

另一方面,对于任何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的未定义行为?
  4. 修改

    @cookiemonster问道:

      

    因此,似乎您并不是真的想知道结果是否得到保证,而是更多的是实现是否已经过优化以在内部执行身份比较。是吗?

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

4 个答案:

答案 0 :(得分:4)

没有区别。

为什么呢?因为String.replace对字符串进行操作,并返回一个字符串。此外,字符串是基元,不是对象。

已经知道你有两个字符串。因此,=====完全相同。我甚至可以说===是多余的。

答案 1 :(得分:4)

===无法使用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

大多数时候,这是一个非问题,但&#34; praemonitus,praemunitus&#34;正如他们所说的那样。

要回答您的更新:如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等于指针。

答案 2 :(得分:2)

String类上的replace方法始终返回一个字符串,因此=====一样安全,可靠,因为不会发生类型强制。其次,如果没有发生替换,===测试将返回true,因为它们包含相同的字符。

答案 3 :(得分:2)

鉴于你的例子......

  

“是否保证打印为真?如果是,那记录的行为在哪里?”

是的,确实如此。它在=====使用的相应等式比较算法中有记录。

  

“它是未定义和不可靠的行为(即,我应该测试s == t,或者使用替换回调闭包做一些聪明的事情)?”

不,这是明确定义的行为。往上看。 =====运算符的行为相同。

  

“在每个JavaScript实现中实际上都返回true,是未定义的行为吗?”

只要实现遵循规范,它就会返回true