Javascript 数组[index]==未定义是否始终与数组[index]===的类型相同;未定义';?
我需要查看Javascript中是否有数组索引条目,并告诉用户(实际上我将其从===更改为!==): if(数组名称的类型[索引]!=='undefined') IIUC这与'arrayName[index]!='未定义的' 我用它做过实验,效果很好,但我想确保我没有遗漏任何边缘情况 更新 要使WRT对给出的一些答案进行澄清(在节点Javascript 数组[index]==未定义是否始终与数组[index]===的类型相同;未定义';?,javascript,arrays,node.js,typescript,v8,Javascript,Arrays,Node.js,Typescript,V8,我需要查看Javascript中是否有数组索引条目,并告诉用户(实际上我将其从===更改为!==): if(数组名称的类型[索引]!=='undefined') IIUC这与'arrayName[index]!='未定义的' 我用它做过实验,效果很好,但我想确保我没有遗漏任何边缘情况 更新 要使WRT对给出的一些答案进行澄清(在节点9.11.2上运行此操作),请执行以下操作: 这张照片是: Hello Test passes undefined is: Hello arrayName[0] i
9.11.2
上运行此操作),请执行以下操作:
这张照片是:
Hello
Test passes
undefined is: Hello
arrayName[0] is: undefined
所以答案似乎是“没有未定义的东西有时可以被重新发现…”。。。最好还是坚持使用数组的类型[index]==“undefined”,但正如一些人所指出的,undefined不能全局重新定义,因此使用较短的版本应该是相当安全的。是的,有一个非常模糊的edgecase:
let undefined = "confuse me!";
也就是说
"confuse me!" === undefined
可能是true
和
typeof undefined === "undefined"
可能是false
,但如果
typeof arrayName[index] === "undefined"
如果为true
则其定义未定义,但它可能不是未定义
:)
虽然这很糟糕,但你不必考虑这一点。 <是的,有一个非常晦涩难懂的词:
let undefined = "confuse me!";
if(typeof arrayName[index] !== 'undefined')
也就是说
"confuse me!" === undefined
可能是true
和
typeof undefined === "undefined"
可能是false
,但如果
typeof arrayName[index] === "undefined"
如果为true
则其定义未定义,但它可能不是未定义
:)
但是这很糟糕,你不必考虑。< / P>
if(typeof arrayName[index] !== 'undefined')
与
if(arrayName[index] !== undefined) // without quotes
但并非如你所说:
IIUC这与'arrayName[index]!='未定义的'
与
if(arrayName[index] !== undefined) // without quotes
但并非如你所说:
IIUC这与'arrayName[index]!='未定义的'
未定义是一个全局变量,因此可以重新分配其值。因此,变量
未定义
可能无法定义。但是typeof
未定义的值总是返回“未定义的”
,因此在技术上更安全。实际上,大多数人不会重新分配undefined
,因此这两种方法都有效。undefined是一个全局变量,因此可以重新分配其值。因此,变量未定义
可能无法定义。但是typeof
未定义的值总是返回“未定义的”
,因此在技术上更安全。实际上,大多数人不会重新分配undefined
,所以这两种方法都可以。OK-所以Javascript允许我们使用Javascriptundefined
作为变量名,因此建议显式使用“undefined”…@ole no,这意味着“让我困惑!”===undefined
可能是true
并且类型的undefined===“undefined”
可能是false,但是如果类型的arrayName[index]===“undefined”
则其定义为未定义的
,但这会引发错误“undefined”已经声明了
@HikmatGurbanli刚刚在节点中尝试过,我很惊讶地说这是正确的。旧版本当然不是这样。@hikmat然后将其包装在一个block.OK中-因此Javascript允许我们使用Javascriptundefined
作为变量名,因此建议显式使用“undefined”…@ole no,这意味着“迷惑我!”===undefined
可能是true
并且类型的undefined===“undefined”
可能是false,但是如果类型的arrayName[index]===“undefined”
则其定义为未定义的
,但这会引发错误“undefined”已经声明了
@HikmatGurbanli刚刚在节点中尝试过,我很惊讶地说这是正确的。以前的版本肯定不是这样的。@hikmat然后将其包装在一个块中。前两个不同typeof
返回字符串alwaysYeah,my bad,copy pasted,忘记删除typeof
,编辑。这在技术上是不正确的,根据引号的语法,它们不是等价的。我的回答解释了原因。你应该再读一遍我的回答,我的第二句话没有引用。你错了,它们是等价的。告诉我一个例子,其中(数组名称的类型[索引]!=='undefined')!==(arrayName[index]!==undefined)
,除非@Jonas描述了边缘情况,否则您将无法找到,但在现实世界中,您将无法找到它。前两种情况并不相同typeof
返回字符串alwaysYeah,my bad,copy pasted,忘记删除typeof
,编辑。这在技术上是不正确的,根据引号的语法,它们不是等价的。我的回答解释了原因。你应该再读一遍我的回答,我的第二句话没有引用。你错了,它们是等价的。告诉我一个例子,其中(数组名称的类型[索引]!=='undefined')!==(arrayName[index]!==未定义)
,除非@Jonas描述了边缘大小写,但在现实世界中,如果你担心未定义的在某个地方被重新定义,你就不能使用void 0
。如果你担心未定义的在某个地方被重新定义,就使用void 0
。