Javascript 是否存在应手动将对象属性设置为未定义的场景?

Javascript 是否存在应手动将对象属性设置为未定义的场景?,javascript,Javascript,因为在JavaScript中,每个未初始化的属性都返回未定义的 var a = {b:1}; a.x; // Undefined 然后,要检查值是否存在,通常要执行以下操作: if (a.x !=== undefined) {.. 我知道hasOwnProperty是更好的选择。但是,您确实可以找到执行上述操作的代码,或者只需!!a、 x 这是一个问题。现在,您不知道该值是否未分配或已分配,但分配的是空的 鉴于这一事实,在任何时候做以下事情都应该被视为一种不好的做法 a.x = undefi

因为在JavaScript中,每个未初始化的属性都返回未定义的

var a = {b:1};
a.x; // Undefined
然后,要检查值是否存在,通常要执行以下操作:

if (a.x !=== undefined) {..
我知道
hasOwnProperty
是更好的选择。但是,您确实可以找到执行上述操作的代码,或者只需
!!a、 x

这是一个问题。现在,您不知道该值是否未分配或已分配,但分配的是空的

鉴于这一事实,在任何时候做以下事情都应该被视为一种不好的做法

a.x = undefined;

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

未赋值和空值之间存在差异。默认情况下,该值总是未定义的,您的代码应该总是检查未定义以避免不必要的输出

如果由于某种原因必须删除对象属性的值,则应将其设置为空(如空字符串、数字0或空对象/数组)。因此,使用该属性编写的代码永远不会失败


如果需要将其设置为未定义,则可以从对象中删除属性本身,但这意味着您的代码需要使用hasOwnProperty方法检查属性是否存在。

未指定值和空值之间存在差异。默认情况下,该值总是未定义的,您的代码应该总是检查未定义以避免不必要的输出

如果由于某种原因必须删除对象属性的值,则应将其设置为空(如空字符串、数字0或空对象/数组)。因此,使用该属性编写的代码永远不会失败


如果需要将其设置为未定义,则可以从对象中删除属性本身,但这意味着您的代码需要使用hasOwnProperty方法检查属性是否存在。

删除对象的属性

删除a.x;
我不会说设置
a.x=undefined
是不好的做法,如果目标是将其设置为
undefined


但是,如果用于模拟删除属性,则删除对象的属性是。

删除a.x;
我不会说设置
a.x=undefined
是不好的做法,如果目标是将其设置为
undefined


但如果用于模拟删除属性,则是。

一个区别是,使用for in循环或使用
Object.keys()
时,使用
未定义的
设置的值仍将显示,而未设置或缺少的值显然不会显示

就我个人而言,我会使用
null
来表示故意假定为空或未初始化的值,因为
null
在JSON中有效,而
undefined
无效,但如果您不担心这一点,那么您可以使用
undefined
来表示

作为一个稍微做作的例子,这可能有助于通过某种使用
for in
循环的扩展函数显式取消对象变量的设置。或者,您也可以使用它来防止覆盖某些变量

请查看以下示例:

class-MyClass{
静态问候语(){
如果(!这个,说){
return console.log(“我不知道如何打招呼”)
}
如果(!this.to){
return console.log(“我不知道该向谁打招呼”)
}
console.log(this.say,this.to)
}
}
MyClass.say=“你好”
MyClass.to=“世界”
功能扩展(klass、obj、canOverwriteWithUndefined){
用于(输入obj){
if(对象的类型[键]=='undefined'&&canOverwriteWithUndefined==false){
throw“无法用未定义的键覆盖值:”+键
}
klass[key]=obj[key]
}
}
const a={对“世界”说:“你好”}
const b={say:undefined,to:“StackOverflow”}
常量c={说:“你好”}
常量d={to:undefined}
扩展(MyClass,a)
MyClass.greet()//你好,世界
扩展(MyClass,b)
MyClass.greet()//我不知道如何打招呼
扩展(MyClass,c)
MyClass.greet()//Hello StackOverflow
扩展(MyClass,d,false)

MyClass.greet()//错误
一个区别是,当使用for-in循环或使用
对象.keys()
时,使用
未定义
设置的值仍然会显示,而未设置或缺少的值显然不会显示

就我个人而言,我会使用
null
来表示故意假定为空或未初始化的值,因为
null
在JSON中有效,而
undefined
无效,但如果您不担心这一点,那么您可以使用
undefined
来表示

作为一个稍微做作的例子,这可能有助于通过某种使用
for in
循环的扩展函数显式取消对象变量的设置。或者,您也可以使用它来防止覆盖某些变量

请查看以下示例:

class-MyClass{
静态问候语(){
如果(!这个,说){
return console.log(“我不知道如何打招呼”)
}
如果(!this.to){
return console.log(“我不知道该向谁打招呼”)
}
console.log(this.say,this.to)
}
}
MyClass.say=“你好”
MyClass.to=“世界”
功能扩展(klass、obj、canOverwriteWithUndefined){
用于(输入obj){
if(对象的类型[键]=='undefined'&&canOverwriteWithUndefined==false){
throw“无法用未定义的键覆盖值:”+键
}
klass[key]=obj[key]
}
}
const a={对“世界”说:“你好”}
const b={say:undefined,to:“StackOverflow”}
常量c={说:“你好”}
常量d={to:undefined}
扩展(MyClass,a)
MyClass.greet()//你好,世界
扩展(MyClass,b)
MyClass.greet()//我不知道如何打招呼
扩展(MyClass,c)
MyClass.greet()//Hello StackOverflow
扩展(MyClass,d,false)

MyClass.greet()//Error
我更喜欢将其设置为null,感觉比空字符串更简单我更喜欢将其设置为null,感觉像