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
    ,或者使用替换回调闭包进行一些巧妙的操作)
  • 未定义的行为,实际上在每个JavaScript实现上返回
    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:如果没有匹配,那么返回原始字符串还是新字符串又有什么关系呢?这对
    ==
    ===
    @BenTaber
    string所做的比较没有影响。match(/d/g)。length
    :)@barakmanos Trying无法帮助我区分案例1、2和3。“字符串是原语,而不是对象。”对于给定的示例是正确的,但并不总是如此。有字符串原语和字符串对象,但它们不一样。@stevuu正要发布相同的内容。大多数人使用字符串的方式是原语,但调用字符串构造函数时,返回对象。“大多数人使用字符串的方式…”-有人使用字符串对象而不是原语吗?到目前为止,这是唯一一个强调字符串对象和字符串原语警告的答案+1@stevuu:好的,这个问题对于提供的示例来说似乎非常具体,但我想这里的信息仍然值得注意。