【问题标题】:Array index doesn't go out of bound in Javascript数组索引在 Javascript 中不会越界
【发布时间】:2017-01-05 02:39:09
【问题描述】:

我正在创建一个 JavaScript 应用程序,我想在其中生成 ArrayIndexOutOfBound 异常。我创建了一个大小为5 的数组,我正在尝试将斐波那契数列中的元素插入其中。理想情况下,它应该在插入第 6 个元素后抛出异常,但它不会抛出任何异常。请检查代码,让我知道您的意见。 附上代码和输出截图。

<!DOCTYPE html>
<html>

<head>
    <title>Error Handling Demo</title>
    <script type="text/javascript">

    var i = 1;
    var fibona = [];
    fibona.length=5;

        function generateNext()
        {   
            if(i>1)
                {
                    number1.value = number2.value;
                    number2.value = number3.value;
                }

            number3.value = parseInt(number1.value) + parseInt(number2.value);
            i++;

            fibona.push({'num1':number1.value, 'num2':number2.value, 'num3':number3.value});
        }

    </script>
</head>

<body>
    <h1>Fibonacci Series Game</h1>

    <p>
        Number 1 :
        <input type = "number" name = "number1" value = 0 id = "num1">
    </p>

    <p>
        Number 2 :
        <input type = "number" name = "number2" value = 1 id = "num2">
    </p>

    <p>
        Next Number :
        <input type = "number" name = "number3" id = "num3">
    </p>

    <p>
        <input type = "button" name = "generatenext" value = "Generate Next Number" onclick = "generateNext()">
    </p>

</body>

</html>

【问题讨论】:

  • 在 JS 中,设置数组的 .length 属性并设置数组可以包含的最大元素数。我不知道有什么方法可以限制元素的数量。
  • @TravisRodman - 不,它只会返回undefined(如果读取值)或愉快地在该索引处创建元素(如果写入值)。

标签: javascript html arrays error-handling indexoutofboundsexception


【解决方案1】:

您遇到的是push 方法的正常行为。

push() 方法将新项目添加到数组的末尾,并返回 新长度。

注意:新项目将添加到数组的末尾。

注意:这个方法改变了数组的长度。

请在此处阅读更多内容http://www.w3schools.com/jsref/jsref_push.asp

更新: 如果您希望能够限制数组的最大长度,最简单的方法是使用一个常量变量设置来保存数组的长度并使用数组的长度检查这个值。如果您仍然想在/如果索引大于此最大值时抛出异常,那么您可以通过像这样throw 'your exception message'

抛出异常来实现

【讨论】:

  • 好的。这就说得通了。关于如何解决这种情况的任何建议?有没有其他方法可以在数组中插入元素?
  • 我想到的最简单的方法是用数组的最大长度保留额外的 const 变量,并与它比较数组的长度
  • 是的。我们可以使用它来检查数组是否超过长度。但这不仅仅是检查数组是否超过长度,我需要生成一个 ArrayOutOfBoundException。对此有何建议?
【解决方案2】:
  1. 关于您的评论:您可以将长度存储在某个变量中,例如

    var data = [];
    var length = 5; // user defined length
    
    for(var i = 0; i < length; i++) {
        data.push(createSomeObject());
    }
    

在您的情况下,您的操作与上述相同,但您没有遍历长度。

  1. 您可能还考虑使用new Array(),如下所示

new Array(4); 创建一个长度为 4 的空数组。但是

new Array('4'); 创建一个包含值 '4' 的数组。

但不建议,因为 jsLint 不喜欢 new Array(),因为构造函数不明确。

【讨论】:

  • 我尝试过使用 new Array(5)。它给出了问题。看起来 push 方法每次插入元素时都会增加数组的索引。
【解决方案3】:

Javascript 数组推送无论如何都会增加长度。

例如。如果你声明var arr = [];arr.length = 2 然后推一些东西 arr.push("4") 会给决赛 长度为 3,这会增加您的初始长度。 唯一的办法 检查数组是否超过长度是通过遍历数组和 比较索引是否大于数组的长度。另一种方法是通过预定义长度的变量进行验证来防止推送。

您可以通过将其与预定义的长度进行比较来防止推送 否则会像这样引发您的自定义错误

throw new Error("outOfBoundException")

在此处了解有关 javascript 中的自定义异常的更多信息 Custom Exceptions in JavaScript

【讨论】:

  • 好的。这就说得通了。您能否详细说明您对如何应对这种情况的看法?不仅仅是检查数组是否超过长度,我需要生成ArrayOutOfBoundException。
  • @Pavan 这可以通过将长度与预定义的长度变量进行比较来将推送包含在 if 条件中。在 else 语句中,只需使用 throw new Error("outOfBoundsExcdption") 抛出您的自定义错误。这样可以防止推送并引发异常
猜你喜欢
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
相关资源
最近更新 更多