【问题标题】:Unexpected result from String.indexOf function?String.indexOf 函数的意外结果?
【发布时间】:2014-01-17 20:48:58
【问题描述】:

我真的把头发拉出来了……

情况是这样的。我有两个javascript字符串如下:

dsName = "Test 1"
replacementString = "Test "

我正在尝试查看dsName是否以replacementString开头,代码如下:

if(dsName.indexOf(replacementString) == 0)
{
    // I never get here!
}

indexOf 返回 -1!!这怎么可能?我可以在该行之前在 Chrome 脚本调试中放置一个断点,然后将“dsName.indexOf(replacementString)”粘贴到控制台中,看看它确实返回了 -1。

现在只是为了证明我没有疯,我可以从同一个断点打印出 dsName,它实际上等于“Test 1”,replacementString 确实等于“Test”。这是 Chrome 调试控制台的实际屏幕截图:

如您所见,如果我粘贴文字字符串,它会按预期工作,但如果我使用变量,它就不起作用。我什至尝试过 String(replacementString) 和 replacementString.toString() 来查看是否是类型问题,但它的作用相同。

如果 indexOf 的参数是文字字符串,它就像它工作,但如果它是一个字符串变量,它就不行。

我疯了吗,我错过了什么愚蠢的东西吗?或者这可能是 Chrome 中的错误?

【问题讨论】:

  • 当然可以jsfiddle.net/mplungjan/g6sGa - Chrome OSX
  • 我刚刚在 Chrome v. 31.0.1650.63 中尝试过,效果很好。
  • replacementString.chatCodeAt(0) 带给你什么
  • 您的一个字符串中可能存在不可打印的字符。它的作品
  • 33.0.1750.18 中无复制

标签: javascript string google-chrome indexof


【解决方案1】:

看起来有些像空格的字符实际上并不是简单的空格。试试这个看看字符串真正包含什么:

for (var i=0; i<replacementString.length; i++) 
    console.log(replacementString.charCodeAt(i));

您可以像这样用常规空格替换不间断空格:

replacementString = replacementString.replace(String.fromCharCode(160), " ");

【讨论】:

  • stackoverflow.com/posts/comments/31916157?noredirect=1。显然,字符是空格。 (编辑:直接链接)
  • 看来你可能是对的:replacementString.charCodeAt(4) = 160 and dsName.charCodeAt(4) = 32...
  • 需要弄清楚是什么原因造成的...所以看起来替换字符串中的 char 是一个不间断的空格...
  • 您的值是从浏览器发布还是从 DOM 节点获取?您可以使用 String.fromCharCode(160) 将所有非中断空格替换为常规空格。
【解决方案2】:

感谢 Wolfgang 让我走上了正确的道路来解决这个问题,但结果却是完全出乎意料和不同的事情......

我从&lt;textarea&gt; 中提取了replacementText 的值,它的样式为white-space:nowrap。我猜当 nowrap 打开时,它返回空格作为不间断(ASCII 码 160)而不是常规空格。

这是一个 js-fiddle 看看发生了什么:http://jsfiddle.net/Jk9Cw/

你们怎么看?这是“你应该知道的”还是“哇,这是我以前从未遇到过的事情”?

【讨论】:

  • 有趣。我知道这会让一些人秃顶。
猜你喜欢
  • 2021-12-20
  • 2012-09-10
  • 1970-01-01
  • 2019-07-03
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
相关资源
最近更新 更多