由于在JavaScript中,每一个外行属性返回undefined。
var a = {b:1};
a.x; // Undefined
然后检查是否值存在与否,这是常见的做到这一点:
if (a.x !=== undefined) {..
我知道hasOwnProperty
是更好的选择。但是,你发现代码,做以上,或者干脆!!a.x
。
这是个问题。现在,你不知道是否值没有得到分配或价值分配,但什么是被分配是空的。
鉴于这一事实,它应该被认为是不好的做法,执行下列操作随时...
a.x = undefined;
或者有没有在那里这是必需的,甚至优先的情况呢?
一个区别是,与undefined
设定值仍然会出现在使用一个for-in循环,或使用Object.keys()
而没有设置或者遗漏值显然不会显示出来的时候。
个人而言,我会用null
对于那些目的地应该是空的,或者未初始化,因为null
是JSON有效而undefined
并不值,但如果你并不担心,那么你可以使用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
要删除一个对象的属性
delete a.x;
我不会说设置a.x = undefined
是不好的做法,如果我们的目标是将其设置为undefined
。
但是,如果用于模拟取出一个属性,它是。
有一个未分配的值和空值之间的差。默认情况下,该值始终是不确定的,你的代码应该经常检查未定义以避免不必要的输出。
如果由于某种原因对象的属性值已被删除,你应该将它设置为空(就像一个空字符串或数字0或空对象/数组)。因此,代码使用该属性永远不会失败写入。
如果你需要设置它不确定的,你可以从对象中删除属性本身,而是这将意味着,您的代码将需要检查是否存在财产使用hasOwnProperty方法。