Javascript replace()方法don';我不能替换任何东西

Javascript replace()方法don';我不能替换任何东西,javascript,multidimensional-array,str-replace,Javascript,Multidimensional Array,Str Replace,在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&a

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


即使有效的语法是
®
它仍然将其识别为
®
,因此您需要将其替换为
&而不是
&
更新:

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

  • 由于它是一个url,这是一个有利的功能
  • 使用
    encodeURI('amazon®ion')
    您无需再次猜测编码字符
  • 亚马逊和地区的
    需要采用
    的形式
    ,类似这样:
    amazon&;地区
  • 使用
    decodeURI()
    来使用新的URI
JsFiddle:


想要更好、更灵活的解决方案吗? 那为什么不把它变成一个函数呢

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:

可能是这个符号->它在我的浏览器控制台(Chrome 42)中起作用,但我看不出有什么不对(还有Chrome)。您是否正在检查
str
cup[number][9]
以查找
replace()
后的值?只有
str
正在更新。如果我使用var str=“//ws na.amazon adsystem.com/widgets/q?ServiceVersion=20070822&;OneJS=1&;操作=GetAdHtml&;市场=美国&;电源=交流和交流;ref=tf_直到&;广告类型=产品链接&;跟踪id=nameid-20&;市场=亚马逊®离子=美国&;位置=B004BCXAM8&;asins=B004BCXAM8&;linkId=SK5UG2J5CK4WNOKE&;显示边框=真实(&U);link_在_new_window=true中打开_“亚马逊®离子被替换。如果str=cup[number][9]亚马逊®离子未被替换。”这是一个在处理面向对象代码时必须小心处理的概念。这种行为不是OOP特有的。@FelixKling true。我想我的观点是
var a={}VaR B= A;A.X=34;,我将考虑OOP概念,和<代码> var a= 34;var b= a;a=42;< /c> >。当然,我只是说,将变量赋值给变量通常不更新另一个变量,不管OO与否。但是我想我现在更好地理解你的观点(它与变异对象形成对比)。@FelixKling我使用str打印结果。可能因为cup[number][9]是一个数组,replace()方法看不到数据?我对JS和Chrome如何处理编码知之甚少,但这可能是一个字符集问题,@JoeEnos?可以解释为什么当他将值粘贴到字符串文字中时,它会起作用,但当他从字符串文字中检索时,它不会起作用(我猜)来自另一个非文字源。这是结果:://ws na.amazon adsystem.com/widgets/q%3FServiceVersion%3D20070822%26amp%3BOneJS%3D1%26amp%3BO操作%3DGetAdHtml%26amp%3BMarketPlace%3DUS%26amp%3Bsource%3Dac%26amp%3Bref%3Dtf直到%26amp%3Bad\U类型%3Dproduct\U链接%26amp%3Btracking\U id%3Dnameid-20%26amp%3BMarketPlace%3DUS%3DBPL位置%3DB004BCXAM8%26amp%3盆地%3DB004BCXAM8%26amp%3BlinkId%3DSK5UG2J5CK4WNKE%26amp%3B显示边框%3Dtrue%26amp%3Blink在新窗口中打开%3Dtrue@user3944364我更新了我的答案,
&
的正确转义形式是
%26
,而
®
的转义形式是
%AE
链接断开最初不是产品我在链接中使用了相同的amazon®离子。但是我将您的代码改成了这个,我得到了一个很好的结果:str=str.replace('amazon%AEion','amazon%26ampregion');str=unescape(str);str=str.replace('ampregion','amazon%26ampregion');str=unescape(str);str=str.replace('ampregion','region');