【问题标题】:Why Does typeof array[0] == 'undefined' Not Work?为什么 typeof array[0] == 'undefined' 不起作用?
【发布时间】:2012-12-24 23:04:55
【问题描述】:

我想在对其执行操作之前检查数组中的下一个元素是否存在,但我无法检查它是否未定义。例如:

// Variable and array are both undefined
alert(typeof var1);   // This works
alert(typeof arr[1]); // This does nothing

var arr = [1,1];
alert(typeof arr[1]); // This works now

【问题讨论】:

  • 检查您的控制台是否有错误!

标签: javascript undefined typeof


【解决方案1】:
alert(typeof arr[1]); // This does nothing

它没有做任何事情,因为它失败并出现错误:

ReferenceError: arr is not defined

如果你改为这样尝试:

var arr = [];
alert(typeof arr[1]);

然后你会得到你所期望的。但是,执行此检查的更好方法是使用数组的 .length 属性:

// Instead of this...
if(typeof arr[2] == "undefined") alert("No element with index 2!");

// do this:
if(arr.length <= 2) alert("No element with index 2!");

【讨论】:

  • ^这个。扩展非代码的第一行:javascript引擎通过alert(typeof arr就好了,但是因为arr此时不是一个数组,当你尝试访问它的一个元素时,javascript引擎会抛出一个错误([1]),并停止执行该语句。
  • @joequincy 不,它与是否为数组无关:此时它是一个 ReferenceError (不是失败的属性查找或其他)。例如(重新迭代响应示例),在a = {}; alert(typeof a[1]) 中没有 ReferenceError(因为a 可以在范围内解析)并且a[1] 将很高兴地评估为undefined
  • 具体来说:ReferenceError 发生是因为 JavaScript 在调用 typeof 的逻辑之前尝试取消引用 arr 以查找 arr[1]。因为arr 不存在,尝试取消引用它(这是[1] 所做的)失败。
  • @pst 是的,这与代码中的这一点有关,arr 不是一种支持属性查找的变量。当然,这种措辞非常繁琐,所以我输入了“array”,因为它是与实际情况相关的类型。你会注意到,我从来没有说过它只适用于数组。
  • @Ambder 我更喜欢以另一种方式看待它:不是强制“取消引用”,而是表达式(a[1] 中的a)不被视为 引用类型(只有1 属性会是,但到那时已经太晚了,因为a 无法评估)..
【解决方案2】:

使用数组时,在访问数组索引之前,您还应该检查数组本身。

错误:

if (arr[0] == ...)

好:

if (typeof arr != "undefined" and arr[0]==......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2018-12-13
    • 2012-10-23
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多