使用===来检查String.replace()是否实际执行了替换
Use === to check whether String.replace() actually performed a substitution?
我想知道String.replace()
是否实际上找到了匹配并执行了替换。由于String.replace()
返回的是结果字符串,而不是执行的替换次数,因此我似乎必须将原始字符串与结果进行比较。
问题是,我应该使用===
还是==
进行比较?
据我所知,Mozilla文档和ECMAScript 5.1标准都没有规定,如果没有匹配,返回的字符串必须是与传入的字符串相同的对象。
另一方面,对于JavaScript的任何实现来说,返回一个未更改字符串的副本似乎是愚蠢的。
具体来说, 发生了什么?var s = 'abc';
var t = s.replace(/d/, 'D');
console.log(s === t); // I expect true, but am not sure
它是- 保证打印
true
?如果有,在哪里记录了这种行为? - 未定义和不可靠的行为(即,我应该测试
s == t
代替,或者做一些聪明的替换回调闭包)? - 未定义的行为,在实践中返回
true
在每个JavaScript实现?
编辑
@cookiemonster问道:
因此,您似乎并不真正想知道结果是否得到保证,而是想知道实现是否经过优化以在内部执行身份比较。对吗?
事实上,我确实把这道题搞砸了,最后它变成了一个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"。
回答你的更新:如这里所见,至少V8被优化为返回主题本身,如果没有替换可以做:
int32_t* current_match = global_cache.FetchNext();
if (current_match == NULL) {
if (global_cache.HasException()) return isolate->heap()->exception();
return *subject; <-------
和,虽然标准只要求两个字符串看起来是严格相等的(===
),我绝对肯定的是,每个JS引擎都足够聪明,以避免对相等指针的strcmp
这没什么区别。
为什么?因为String.replace
操作字符串,返回一个字符串。此外,字符串是基元,不是对象。
你已经知道你有两个字符串。因此,==
和===
在这方面是相同的。我甚至会说===
是多余的
String类上的replace
方法总是返回一个字符串,因此===
与==
一样安全可靠,因为不会发生类型强制转换。其次,如果没有发生替换,===
测试将返回true,因为它们包含相同的字符。
鉴于你的例子…
"Is Guaranteed to print true?如果有,在哪里记录了这种行为?"
是的,它是。==
和===
各自使用的相等比较算法中都有记录。
抽象相等比较算法
严格相等比较算法
"这是未定义和不可靠的行为吗(即,我应该测试s == t,或者用替换回调闭包做一些聪明的事情)?"
不,这是定义良好的行为。见上图。==
和===
操作符的行为相同。
"它是未定义的行为,在实践中返回true在每个JavaScript实现?"
只要实现遵循规范,它将返回true
。
- 我正在尝试使用JS/JQuery自动对网站中的文本执行多个查找和替换操作
- Windows Phone浏览器控件执行JS函数来替换src属性
- 如何将变量表达式转换为可执行代码(而不是替换值)
- javascript 或 PHP 来执行搜索和替换功能
- jQuery是否可以用JavaScript替换文本,然后执行
- 如何在执行 AJAX 请求后停止 setInterval 运行,该请求将 DOM 中的该 setInterval 替换为
- 替换的 HTML 在替换为 JS 后不会执行
- 在执行AJAX调用时,将输入按钮替换为文本
- 如何在以下替换中执行toUpperCase
- 有没有一种快速的工具可以在不剥离JavaScript源代码中的注释的情况下执行恒定的替换?
- 如何将ONCLICK替换为在一段时间内执行的自动操作
- 如何使用延迟执行foreach来执行搜索和替换功能.与延迟
- 在执行中替换现有HTML报告的multiCapabilities函数
- 用Javascript替换HTML,使其在浏览器中可执行
- 使用===来检查String.replace()是否实际执行了替换
- 窗口替换后执行函数
- Javascript regex执行和替换
- 如何在Javascript代码完成执行后替换整个页面
- 对span元素执行JavaScript循环,检查它们的值并替换其他节点边框颜色
- 我如何替换(重新执行)当前的脚本函数