Chrome:parseInt()返回NaN

时间:2014-01-29 07:40:40

标签: javascript

我做了一个AJAX调用,只返回一个数字:

var lastID = 0;
var loading = true;

// Get latest message ID
$.ajax({
    url: "libs/getLatestMessageID.ajax.php",
    dataType: "text",
    type: "GET",
    success: function(data) {
        lastID = data;
        console.log("Received latest message ID: " + typeof(data) + " \"" + data + "\" " + parseInt(data, 10));
    },
});

我从服务器收到的是一个字符串,例如“21”,现在需要转换为数字,以便JS可以用它来计算。在Firefox中,它工作正常,console.log()行的输出是:

  

收到最新消息ID:字符串“21”21

但谷歌Chrome让parseInt()返回:

  

收到最新消息ID:字符串“21”NaN

这里出了什么问题?

3 个答案:

答案 0 :(得分:5)

该字符串以不可打印的无效字符作为前缀,导致parseInt()无法将字符串解析为数字,因此返回NaN(非数字)。

在评论中,您可以通过转义字符串来检查:

... + escape(data) + ...

您还可以使用data.length查看字符串是否符合预期的长度。

您需要找到此源(可能与编码相关),以便您可以防止字符串以这种方式作为前缀。如果您无法找到源,临时解决方案是在将字符串传递给parseInt()之前剥离字符串,但不建议将其用于最终解决方案。

您可以使用例如regEx来剥离非数字字符:
Regex using javascript to return just numbers

(或使用评论中建议的内容)

但最终你会想要找到来源。

更新,感谢@ fero的链接,它表示您获得的字符来自原始文件中的BOM标记,表示字节顺序。

您可以在没有此标记的情况下重新编写文件,或者在发送数据之前尝试在服务器端将其删除。如果您的数据是UTF-8,则不会对数据本身产生影响。

答案 1 :(得分:1)

试试这个:

console.log("Received latest message ID: " + typeof(data) + " \"" + data + "\" " + parseInt(data.match(/\d/g).join("")));

实际上我正在使用正则表达式过滤data中的数字,因为我认为有一些非数字数据即将到来。

答案 2 :(得分:0)

var data = parseInt(" 21", 10);
alert(data);

适用于Google Chrome 32.0和Firefox 27