自从使用Javascript以来,每个未初始化的属性都返回未定义。
var a = {b:1};
a.x; // undefined
然后检查值是否存在
if (a.x !=== undefined) {..
我知道hasOwnProperty
是更好的选择。但是,您确实找到了执行上述操作的代码,或者只是!!a.x
。
这是一个问题,现在您不知道该值是未分配还是已分配,但分配的内容为空。
鉴于这一事实,任何时候都应该认为这样做是不好的做法。
a.x = undefined;
或者在某些情况下是必需甚至首选的。
答案 0 :(得分:2)
一个区别是,使用for-in循环或使用undefined
时,仍会显示用Object.keys()
设置的值,而显然不会显示未设置或丢失的值。
我个人会使用null
来处理那些有意为空或未初始化的值,因为null
在JSON中有效,而undefined
在JSON中无效,但是如果您不担心的话然后您可以使用undefined
进行操作。
举个例子,这可能有助于通过某种使用for-in
循环的扩展函数显式地取消设置对象的变量。或者,您也可以使用它来防止覆盖某些变量。
查看以下示例:
class MyClass {
static greet(){
if(!this.say){
return console.log("I don't know how to greet")
}
if(!this.to){
return console.log("I don't know who to greet")
}
console.log(this.say, this.to)
}
}
MyClass.say = "Hello"
MyClass.to = "World"
function extend(klass, obj, canOverwriteWithUndefined){
for(let key in obj){
if(typeof obj[key] === 'undefined' && canOverwriteWithUndefined === false){
throw "Cannot overwrite value with undefined key: " + key
}
klass[key] = obj[key]
}
}
const a = { say : "Hello", to : "World" }
const b = { say : undefined, to : "StackOverflow" }
const c = { say : "Hello" }
const d = { to : undefined }
extend(MyClass, a)
MyClass.greet() // Hello World
extend(MyClass, b)
MyClass.greet() // I don't know how to greet
extend(MyClass, c)
MyClass.greet() // Hello StackOverflow
extend(MyClass, d, false)
MyClass.greet() // Error
答案 1 :(得分:1)
要删除对象的属性
delete a.x;
如果目标是将a.x = undefined
设置为undefined
,我不会说这是一个坏习惯。
但是,如果用于模拟删除属性,则为。
答案 2 :(得分:0)
未分配值和空值之间存在差异。默认情况下,该值始终是未定义的,您的代码应始终检查未定义的值,以避免不必要的输出。
如果由于某种原因必须删除对象属性的值,则应将其设置为空(如空字符串或数字0或空对象/数组)。因此,使用该属性编写的代码永远不会失败。
如果根本需要将其设置为未定义,则可以从对象中删除该属性本身,但这意味着,您的代码将需要使用hasOwnProperty方法检查该属性是否存在。