我目前正在练习javascript,目前我遇到了物体检测问题。我想创建一个对象并检测它是否存在。下面是我目前使用的一些示例代码。
以下代码示例是我创建对象的方式。
var obj = obj || {};
我应该使用它吗?
if (typeof obj !== "undefined") {
// code
}
还是这个?
if (obj !== null) {
}
答案 0 :(得分:3)
值undefined
表示尚未为变量分配值。值null
表示已为其分配值null
。 ===
运算符(及其否定!==
)会阻止type coercion。
哪个是对的?这一切都取决于你想要完成的事情。 undefined
和null
都是“falsy”值,这意味着每个值都在布尔上下文中评估为false
(如false
,0
和空字符串)。
请注意,如果obj
为null
,则typeof obj
不 "undefined"
。
答案 1 :(得分:0)
通常的做法是使用:
var obj = obj || {};
当该代码运行时,您可以确定obj
已被定义(因为var
声明),但可能没有为其分配值。
如果obj
的值解析为“falsey”值,则您将为新对象分配引用。
可能的结果是:
如果尚未为obj
分配值,则会分配新的对象引用。
如果先前已为obj
分配了“falsey”值,则它将被新的对象引用替换(可能会混淆任何为其指定falsey值的代码)。
如果先前已为obj
分配了“truethy”原始值,则以下obj
属性的赋值将引发错误,并且脚本执行将停止。
如果obj
已经是对null
以外的对象的引用,则属性的后续分配将是该对象。根据对象的类型,事情可能没问题。或不。大概是你控制之外的东西创造了对象,因此可能在你不知情的情况下修改或破坏它。你会做什么?
一般情况下,javascript无法处理案例2和3或4,而不是你所处理的obj
。所以使用一个不太可能与其他任何人冲突的名字,并希望你得到#1或#4,事情进展顺利。
顺便说一句,在你的代码之后添加的代码可能仍然会在#4中产生(或多或少),即使代码执行时你的代码是#1。
对于以下测试没有其他好处:
if (typeof obj == 'undefined')
因为结果基本相同。