在任何情况下都应手动将对象属性设置为undefined?

时间:2019-02-11 05:36:09

标签: javascript

自从使用Javascript以来,每个未初始化的属性都返回未定义。

var a = {b:1};
a.x; // undefined

然后检查值是否存在

if (a.x !=== undefined) {..

我知道hasOwnProperty是更好的选择。但是,您确实找到了执行上述操作的代码,或者只是!!a.x

这是一个问题,现在您不知道该值是未分配还是已分配,但分配的内容为空。

鉴于这一事实,任何时候都应该认为这样做是不好的做法。

a.x = undefined;

或者在某些情况下是必需甚至首选的。

3 个答案:

答案 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方法检查该属性是否存在。