5
var p = "null"
var q = null;
(p == q) //false. as Expected.

p.replace(null, "replaced") // outputs replaced. Not expected.
p.replace("null", "replaced") //outputs replaced. Expected.

q.replace(null, "replaced") // error.  Expected.
q.replace("null", "replaced") //error. Expected.

为什么?替换不区分"null"null吗?

我问是因为我在 angularjs 中遇到了一个错误:

replace((pctEncodeSpaces ? null : /%20/g), '+');

例如,如果某人的用户名是"null"并用作 url,则在任何$http调用中都将替换为“+”。例如GET /user/null

并不是说这种情况会经常发生,但我更好奇为什么替换款待null"null"相同的东西。null在替换之前是否替换 .tostring ?这只是Javascript的一个怪癖吗?

我在 IE 和 Chrome 的replace.

4

4 回答 4

5

是的,根据规范replace(粗体相关行,或ECMA-262 最终草案的第 146 页),这是预期的。检查第一个参数以查看它是否是正则表达式,如果不是,则toString()调用它(嗯,以某种方式转换为字符串)。

15.5.4.11String.prototype.replace(searchValue, replaceValue)

令 string 表示将 this 值转换为字符串的结果。

为简洁起见

如果searchValue不是正则表达式,则searchStringbeToString(searchValue)并在字符串中搜索第一次出现的 searchString. 设 m 为 0。

为简洁起见

于 2013-04-30T15:53:58.430 回答
4

ES5 规范中String.prototype.replace

15.5.4.11 String.prototype.replace (searchValue, replaceValue)

...

如果searchValue不是正则表达式,让我们searchString搜索ToString(searchValue)string一次出现的searchString

所以,"".replace(null, XXX)确实会转换null为字符串"null"

请注意,这并不ToString()意味着-它是 JavaScript 解释器内部定义的操作。null.toString()

于 2013-04-30T15:48:50.633 回答
0
"null".replace(null, "replaced") // outputs replaced. Not expected.

替换不区分“null”和null

这是因为参数 1replace被转换为String

''+null === "null"; // true by cast to string

此外,作为RegExpreplace对象,您还可以考虑如何

RegExp(null).toString() === "/null/"; // true
于 2013-04-30T15:50:35.493 回答
0

对于意想不到的,有一个简单的答案。通过 replace() 方法将 null 转换为字符串。
所以这也是一个预期的动作

于 2013-04-30T15:51:59.297 回答