【问题标题】:Is array[index] === undefined the always same as typeof array[index] === 'undefined'?array[index] === undefined 是否总是与 typeof array[index] === 'undefined' 相同?
【发布时间】:2018-12-13 07:10:50
【问题描述】:

我需要查看 Javascript 中的数组索引是否有条目,this answer 说要使用(基本上我将它从 === 更改为 !==):

if(typeof arrayName[index] !== 'undefined')

IIUC 这和 `arrayName[index] !== 'undefined' 一样吗?

我尝试过它并且它有效,但我想确保我没有遗漏任何边缘情况?

更新

要清除 WRT 给出的一些答案(在节点 9.11.2 上运行):

    let undefined = "Hello";
    console.log(undefined);
    let arrayName = [];
    if(arrayName[0] !== undefined) {
        console.log("Test passes");
        console.log("undefined is: ", undefined);
        console.log("arrayName[0] is: ", arrayName[0]);
    }

打印出来:

Hello
Test passes
undefined is:  Hello
arrayName[0] is:  undefined

所以看起来答案是“有时不能重新定义未定义......”......最好坚持使用typeof array[index] === 'undefined',但正如一些人所指出的,未定义不能在全球范围内重新定义,所以它应该是公平的可以安全地使用较短的版本。

【问题讨论】:

  • 如果您担心 undefined 在某处被重新定义,请坚持使用 void 0

标签: javascript arrays node.js typescript v8


【解决方案1】:

是的,有一个非常模糊的边缘情况:

let undefined = "confuse me!";

这意味着

 "confuse me!" === undefined

可能是true

typeof undefined === "undefined"

可能是false,但如果

 typeof arrayName[index] === "undefined" 

true,那么它肯定没有定义,但它可能不是undefined :)

但由于这很糟糕,你不必考虑这一点。

【讨论】:

  • OK - 所以 Javascript 允许我们使用 Javascript undefined 作为变量名,因此建议明确使用 'undefined' ...
  • @ole no,这意味着"confuse me!" === undefined 可能是truetypeof undefined === "undefined" 可能是假的,但如果typeof arrayName[index] === "undefined" 那么它肯定是undefined
  • 但这会引发错误'undefined' has already been declared
  • @HikmatGurbanli 刚刚在 Node 中尝试过,我很惊讶地说这是正确的。旧版本肯定不是这种情况。
  • @hikmat 然后将其包装在一个块中。
【解决方案2】:
if(typeof arrayName[index] !== 'undefined')

相同
if(arrayName[index] !== undefined) // without quotes

但不是你说的:

IIUC 这和 `arrayName[index] !== 'undefined' 一样吗?

if(arrayName[index] !== 'undefined') // this is not correct

How dangerous is it in JavaScript, really, to assume undefined is not overwritten?

【讨论】:

  • 前两个不一样。 typeof 总是返回字符串
  • 是的,我的错,复制粘贴,忘记删除typeof,已编辑。
  • 这在技术上是不正确的,根据引号的语法,它们是不等价的。我的回答解释了原因。
  • 你应该再读一遍我的回答,我的第二个陈述没有使用引号。
  • 你不正确,它们是等价的。告诉我一个(typeof arrayName[index] !== 'undefined') !== (arrayName[index] !== undefined) 的情况,除非@Jonas 描述了边缘情况,否则你不会找到,但在现实世界中你不会有这种情况
【解决方案3】:

Undefined 是一个全局变量,因此它的值可以重新赋值。因此,变量undefined 可能无法未定义。但是typeof 一个未定义的值总是会返回'undefined',所以它在技术上更安全。在实践中,大多数人不会重新分配undefined,所以两者都可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    相关资源
    最近更新 更多