2014-01-17 116 views
3

我从字面上拉我的头发在这一个...String.indexOf函数的意外结果?

这是情况。我有两个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,它实际上等于“测试1”,并且replacementString等于“测试”。下面是从Chrome调试控制台的实际截图:

enter image description here

所以你可以看到,如果我在文字字符串粘贴,它工作正常,但如果我使用变量,它不工作。我甚至尝试过使用String(replacementString)和replacementString.toString()来查看是否可能是类型问题,但它也是一样的。

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

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

+0

'chrome:// version'? –

+1

当然,它的作品http://jsfiddle.net/mplungjan/g6sGa/ - Chrome OSX – mplungjan

+0

我刚刚在Chrome v。31.0.1650.63上试过这个,并且它工作得很好。 – forgivenson

回答

1

荣誉沃尔夫冈你为我在正确的道路上搞清楚了这但它竟然是完全出乎意料和不同的东西...

我正在从<textarea>拉动replacementText的价值,其样式为white-space:nowrap。我猜想,当nowrap打开时,它会返回空格作为非中断(ASCII代码160),而不是常规空格。

这里有一个JS-小提琴,看看发生了什么事情:http://jsfiddle.net/Jk9Cw/

你们有什么觉得?这是一个“你应该知道的事情”还是“哇,这是我以前从未遇到过的事情”?

+2

有趣。我可以看到这可能会让一些人变成秃头。 –

6

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

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

您可以通过正规的像这种替代非中断空格:

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

请参阅http://stackoverflow.com/posts/comments/31916157?noredirect=1。显然,这些字符是空格。 (编辑:直接链接) –

+0

所以看来你可能是正确的:replacementString.charCodeAt(4)= 160和dsName.charCodeAt(4)= 32 ... –

+0

需要弄清楚是什么原因导致...所以它看起来像替换字符串中的字符是一个非破坏性的空间... –