【问题标题】:Chrome: parseInt() returns NaNChrome:parseInt() 返回 NaN
【发布时间】:2014-02-20 21:24:55
【问题描述】:

我做了一个 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

但谷歌浏览器让 parseInt() 返回:

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

这里出了什么问题?

【问题讨论】:

  • 我尝试了添加和不添加基本参数,没有任何效果。
  • 我觉得应该是data.d
  • 与 number() 和 data.d 的结果相同:NaN
  • 您的字符串可能包含“不可见”字符。尝试将字符串输出为转义字符串,即。 ... + escape(data) + ...
  • 可能21前面有一些不可打印的字符。

标签: javascript


【解决方案1】:
var data = parseInt(" 21", 10);
alert(data);

它适用于 Google chrome 32.0 和 firefox 27

【讨论】:

    【解决方案2】:

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

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

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

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

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

    您可以使用例如正则表达式来去除非数字字符:
    Regex using javascript to return just numbers

    (或使用 cmets 中建议的内容)

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

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

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

    【讨论】:

    • 这是一个很好的答案。让我们看看我是否能找到问题所在。也许它与编码有关? AJAX 输出来自 UTF-8 文件...
    • @webdesigner97 它可以与编码相关。您可以检查您的页面使用的是什么编码(或为您使用的 UTF-8 设置显式编码),还可以检查您的服务器是否配置为以相同的编码返回数据。
    【解决方案3】:

    试试这个:

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

    实际上,我正在使用 regex 过滤来自data 的数字,因为我认为即将出现一些非数字数据。

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 1970-01-01
      • 2011-04-22
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多