【问题标题】:JavaScript Integer Leading to NaNJavaScript 整数导致 NaN
【发布时间】:2011-08-31 15:22:50
【问题描述】:

我的 JavaScript 基本上如下所示

function a() {
    b(1);
}

function b(myNumber) {
    c(myNumber);
}

function c(myNumber) {
    var calculation = 5 * (myNumber - 1);
    alert(calculation);
}

当我调用函数a() 时,警告框最终会显示“NaN”。为什么会这样?我已经尝试在很多地方使用parseInt() 函数,但似乎没有任何效果。

编辑

完整代码(实际执行的操作,而不是精简示例):

function updateTablePagination(tableId, rowsPerPageSelectId) {
    updateTablePagination(tableId, rowsPerPageSelectId, 1);
}

function updateTablePagination(tableId, rowsPerPageSelectId, pageNumber) {
    var table = document.getElementById(tableId);
    var rowsPerPageSelect = document.getElementById(rowsPerPageSelectId);
    var rowsPerPage = rowsPerPageSelect.options[rowsPerPageSelect.selectedIndex].text;

    updateTable(table, rowsPerPage, pageNumber);
    //updateTablePageLinks();
}

function updateTable(table, rowsPerPage, pageNumber) {
    var tableRows = table.getElementsByTagName("tr");
    var totalNumberOfRows = tableRows.length;

    var startRow = rowsPerPage * (pageNumber - 1);      
     var endRow = Math.min(startRow + rowsPerPage, totalNumberOfRows - 1);

    alert("Start: " + startRow + "\nEnd: " + endRow);
}

选择框有一个onchange 调用updateTablePagination('myTableId', 'rowsPerPage')。 id 都是正确的。

“开始”和“结束”都是 NaN。

编辑 2

或者,如果我只是做alert(pageNumber),它是未定义的。

简化

即使这样说pageNumber 是未定义的:

function updateTablePagination(tableId, rowsPerPageSelectId) {
    updateTablePagination(tableId, rowsPerPageSelectId, 1);
}

function updateTablePagination(tableId, rowsPerPageSelectId, pageNumber) {
    alert(pageNumber);
}

【问题讨论】:

  • 我刚刚测试,我得到 0。jsfiddle.net/loktar/pqsVt
  • 我在 Chrome 上收到 0。什么浏览器?
  • 您发布的示例没有任何问题。您需要发布其余代码。
  • 我们需要查看实际代码。您在上面发布的代码中不会发生该错误。
  • 对我来说,最新的 FF 提示 0。

标签: javascript variable-types


【解决方案1】:

您有两个名为updateTablePagination 的函数。 Javascript 不支持函数重载。摆脱第一个声明,因为它被第二个覆盖。您可以使用|| 定义参数的默认值。

function updateTablePagination(tableId, rowsPerPageSelectId, pageNumber) {
    pageNumber = pageNumber || 1; //Set a default value for pageNumber
    var table = document.getElementById(tableId);
    var rowsPerPageSelect = document.getElementById(rowsPerPageSelectId);
    var rowsPerPage = rowsPerPageSelect.options[rowsPerPageSelect.selectedIndex].text;

    updateTable(table, rowsPerPage, pageNumber);
    //updateTablePageLinks();
}


updateTablePagination(tableId, rowsPerPageSelectId) //Will call the function with pageNumber == 1

【讨论】:

  • 例如,x 将是空白或整数。怎么做 ||使用整数比较?
  • pageNumber || 1 如果已定义则返回 pageNumber,否则返回 1。这是一个非常简单的 jsfiddle:jsfiddle.net/asYBp
  • 丹尼斯对 || 的描述几乎是正确的。如果定义了 pageNumber,它不返回 pageNumber,否则返回 nubmer 1。如果值为“truish”,它将返回 pageNumber。这意味着如果它是一个整数值,它不会像你期望的值 0 那样做。
【解决方案2】:

问题是您正在覆盖函数。有了这个:

function a() {
    a(1)
}

function a(x) {
    alert(x);
}

调用a 将始终调用第二个(覆盖)函数,因此x 始终未定义。你想要重载之类的东西。在这种情况下,最好的办法是使用 || 运算符作为默认值:

function a(x) {
    var x = x || 1; // x if x is given, otherwise 1
    alert(x);
}

【讨论】:

  • @Rachel G.:通常你将它用于布尔值。 || 如果它是“真实的”,则返回左侧的东西,否则返回右侧的东西。 true 是真的,false 是假的,所以它适用于布尔值。由于其他一些值也是虚假的(例如undefined),所以执行undefined || 1 将返回1。
  • 例如,x 将是空白或整数。怎么做 ||使用整数比较?
  • @Rachel G.:虚假值为 0、""、undefined、null、NaN 和 false;真实就是一切。
  • +1。谢谢您的帮助。这是你和 pimvdb 之间的折腾。不得不选择。对不起。
  • @Rachel G.:我不介意 :) 实际上丹尼斯给出了更具体的解决方案。
猜你喜欢
  • 2023-03-03
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多