replace() 方法不替换任何东西

replace() Method don't replace anything

cup[number][9]中是:

 //ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=US&source=ac&ref=tf_til&ad_type=product_link&tracking_id=nameid-20&marketplace=amazon®ion=US&placement=B004BCXAM8&asins=B004BCXAM8&linkId=SK5UG2J5CK4WNOKE&show_border=true&link_opens_in_new_window=true

这是我的代码:

var str   = cup[number][9];
str=str.replace('amazon®ion','amazon&region');

amazon®ion 没有被替换。这段代码有什么问题?

更新:

解决方法:

var str = escape(cup[number][9]);
str=str.replace('amazon%AEion','amazon%26ampregion'); 
str=unescape(str);str=str.replace('ampregion','region');

我猜您正在查看 cup[number][9] 并且看到它没有改变。那是因为您只修改了 str 变量的值,而不是 cup[number][9].

由于您将 str 重新分配给一个全新的字符串,因此它不会影响 str 曾经指向的对象。

这是您在处理面向对象代码时必须小心的概念。如果您有两个指向同一个对象的变量,重新分配其中一个变量不会重新分配另一个变量。

编辑

这是一些代码。让我们删除该字符串中的一些分散注意力的内容,然后执行以下操作:

var number = 0;
var cup = [];
cup[number] = [];
cup[number][9] = "marketplace=amazon®ion";
var str = cup[number][9];
str=str.replace('amazon®ion','amazon&region');

console.log(cup[number][9]);
console.log(str);

这将为您提供以下输出:

marketplace=amazon®ion
marketplace=amazon&region

如果您正在查看 cup[number][9],您会看到原始字符串。如果您查看 str,您会看到新字符串,因为 str 是唯一被赋予新值的东西。

如果你想修改数组中的值,你必须直接重新赋值,你可以跳过整个str部分:

cup[number][9] = cup[number][9].replace('amazon®ion','amazon&region');
console.log(cup[number][9]);

现在它将具有您的新值。

替换时必须使用 URL 编码语法:

str=str.replace('amazon®ion','amazon&region');

这是一个 JSFiddle https://jsfiddle.net/sqqfrgb0/1/

即使它的有效语法是 ® 它仍然将它识别为 ® 所以这就是为什么你需要用 & 而不是 &

更新:

var str   = encodeURI(cup[number][9]);
str = decodeURI( str.replace( encodeURI('amazon®ion'), encodeURI('amazon&region') );

encodeURI() & decodeURI()

  • 既然是url,这就是有利的功能
  • 使用 encodeURI('amazon®ion') 您不必再猜测编码字符
  • & in amazon&region 需要采用 & 的形式,例如: amazon&region
  • 使用decodeURI()使用新的URI

JsFiddle: http://jsfiddle.net/cbsL9ed7/2/


想要更好、更灵活的解决方案吗?

那为什么不把它变成一个函数呢?

function updateURI(uri, oldValue, newValue) {
    var str = encodeURI( uri );
    str = decodeURI( str.replace( encodeURI(oldValue), encodeURI(newValue) ) );
    return str;
}


var newURI = updateURI(cup[number][9], 'amazon®ion', 'amazon&region');
document.write( newURI )

jsFiddle: http://jsfiddle.net/cbsL9ed7/4/