是否有一个地方,你应该手动设置对象属性未定义的情景?

问题描述 投票:0回答:3

由于在JavaScript中,每一个外行属性返回undefined。

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

然后检查是否值存在与否,这是常见的做到这一点:

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

我知道hasOwnProperty是更好的选择。但是,你发现代码,做以上,或者干脆!!a.x

这是个问题。现在,你不知道是否值没有得到分配或价值分配,但什么是被分配是空的。

鉴于这一事实,它应该被认为是不好的做法,执行下列操作随时...

a.x = undefined;

或者有没有在那里这是必需的,甚至优先的情况呢?

javascript
3个回答
2
投票

一个区别是,与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

1
投票

要删除一个对象的属性

delete a.x;

我不会说设置a.x = undefined是不好的做法,如果我们的目标是将其设置为undefined。 但是,如果用于模拟取出一个属性,它是。


0
投票

有一个未分配的值和空值之间的差。默认情况下,该值始终是不确定的,你的代码应该经常检查未定义以避免不必要的输出。

如果由于某种原因对象的属性值已被删除,你应该将它设置为空(就像一个空字符串或数字0或空对象/数组)。因此,代码使用该属性永远不会失败写入。

如果你需要设置它不确定的,你可以从对象中删除属性本身,而是这将意味着,您的代码将需要检查是否存在财产使用hasOwnProperty方法。

© www.soinside.com 2019 - 2024. All rights reserved.