如果条件为真,我想将对象的属性设置为某些东西,否则什么都不做。
我试图通过
使用?
运算符
obj.prop = (...)?sth:null;
和
obj.prop = (...)?sth:undefined;
但事实证明,其中一个人可以执行我想要的任务。
鉴于条件是假的,当我打电话给obj.hasOwnProperty(prop)
时,它总是给我真实的。
有办法吗?
我知道我可以使用if
语法来实现,但我只想知道是否可以使用?
运算符执行相同的操作。
答案 0 :(得分:1)
分配如下属性时:
var obj = {
a : undefined // or any other value
};
根据ECMAScript规范发生这种情况:
11.1.5对象初始化
[...]
生产PropertyNameAndValueList:PropertyAssignment的计算方法如下:
- 让obj成为创建新对象的结果,就好像通过表达式new Object()一样,其中Object是具有该名称的标准内置构造函数。
- 让propId成为评估PropertyAssignment的结果。
- 使用参数propId.name,propId.descriptor和false调用obj的[[DefineOwnProperty]]内部方法。
- 返回obj。
醇>
分配如下属性时:
obj.a = undefined;
根据ECMAScript规范发生这种情况:
8.12.5 [[Put]](P,V,Throw)
[...]
- 否则,在对象O上创建名为P的命名数据属性,如下所示 一个。让newDesc成为属性描述符 {[[Value]]:V,[[Writable]]:true,[[Enumerable]]:true,[[Configurable]]:true}。 湾调用O的[[DefineOwnProperty]]内部方法,将P,newDesc和Throw作为参数传递。
醇>
在任何一种情况下,由于undefined
和null
都是legimite值,因此只会使用此值定义属性。
最后,hasOwnProperty()
只会检查是否创建了属性描述符,值无关紧要:
15.2.4.5 Object.prototype.hasOwnProperty(V)
[...]
- 设desc是调用O的[[GetOwnProperty]]内部方法传递P作为参数的结果。
- 如果未定义desc,则返回false。
- 返回true。
醇>
但是,根据ECMAScript规范,设置为undefined
的属性和未设置属性,如果您访问它们将返回undefined
:
8.12.3 [[Get]](P)
[...]
- 如果未定义desc,请返回undefined。
- 如果IsDataDescriptor(desc)为true,则返回desc。[[Value]]。
- 否则,IsAccessorDescriptor(desc)必须为true,所以让getter为desc。[[Get]]。
- 如果未定义getter,请返回undefined。
- 返回调用getter的[[Call]]内部方法的结果,提供O作为该值并且不提供参数。
醇>
证明:
var obj = {
a : undefined
}
console.log(typeof obj.a); // undefined
console.log(typeof obj.b); // undefined
obj.hasOwnProperty('a') // true
obj.hasOwnProperty('b') // false
只有delete
才会删除该属性。
var obj = {
a : null,
b : undefined
}
obj.hasOwnProperty('a') // true
obj.hasOwnProperty('b') // true
delete obj.a;
delete obj.b;
obj.hasOwnProperty('a') // false
obj.hasOwnProperty('b') // false
阅读delete
上的ECMAScript规范留待读者阅读。
答案 1 :(得分:0)
假设你的病情结果是虚假的,那么这样的事情应该有效。 All falsey values in JavaScript
var obj = {
a: true,
b: false,
}
obj.prop1 = obj.a ? true : false;
obj.prop2 = obj.b ? true : false;
console.log(obj);