JavaScript – 确定一个属性是否被定义,并设置为“未定义”,或者是未定义的
说我有以下代码:
function One() {} One.prototype.x = undefined; function Two() {} var o = new One(); var t = new Two();
ox
和tx
都将评估为undefined
。 o.hasOwnProperty('x')
和t.hasOwnProperty('x')
将返回false; propertyIsEnumerable
也是一样。 两个问题:
- 有什么办法可以告诉牛被定义并设置为
undefined
? - 有没有任何理由? (如果两者在语义上相同?)
一个小小的警告:做(在o中的propName)循环会产生“x”作为其中一个string,而在t中做它不会 – 所以它们在内部performance如何(至less在Chrome中)有所不同。
比你的方法稍微简单的方法是在运算符中使用Javascript
alert('x' in o); // true alert('x' in t); // false
object.hasOwnProperty(name)仅对同一对象中的对象返回true,对于其他所有对象(包括原型中的属性)则返回false。
function x() { this.another=undefined; }; x.prototype.something=1; x.prototype.nothing=undefined; y = new x; y.hasOwnProperty("something"); //false y.hasOwnProperty("nothing"); //false y.hasOwnProperty("another"); //true "someting" in y; //true "another" in y; //true
另外删除一个属性的唯一方法是使用delete。 设置为undefined不要删除它。
这样做的正确方法就是像罗博格说的那样使用。
更新: undefined是一个原始值,参见ECMAScript语言规范第4.3.2和4.3.9节。
Ach,一个用于反模式的线程。
undefined
不是关键字。
当你分配写var foo = undefined;
你正在给它赋值undefined
的符号的值,因此你将得到的值是"undefined"
。 如果您已将其分配给UnDeFiNeD
或NotFineAtAll
或_qwertyuiop
则会产生完全相同的结果
为什么这么糟糕? 除了导致对错误理解的事实之外,如果你碰巧加载了一个库或者雇佣了一个编写var undefined = true;
的开发者,会发生什么var undefined = true;
像这样的东西?
function isDefined(var){ return (typeof(window[var]) == 'undefined') ? false : true; }
要么..
function isDefined(var){ return (window.var === undefined) ? false : true; }
不,我不认为一个等于undefined
的variables应该被认为是“定义的”。
直接将其设置为undefined
只是一种懒惰的删除方式 – 就像使用delete
关键字一样。 我相信这只是意味着垃圾回收没有影响variables/属性。
[ 编辑 ]
关于您对hasOwnProperty
和propertyIsEnumerable
评论,原型方法/属性既不是对象本身,也不是可枚举对象。
Object.prototype.foo = 'something'; var o = {bar: 'anything'}; o.hasOwnProperty('foo'); //=> false o.hasOwnProperty('bar'); //=> true Object.prototype.hasOwnProperty('foo'); //=> true
一种方法是这样的:
var definedProperties = []; for (var prop in o) definedProperties.push(prop); if (ox === undefined && contains(prop, 'x')) { //x is defined, but set to undefined }
其中contains
只是检查数组中'x'
任何元素是否是'x'
。 这是唯一的方法吗?
您可以尝试在One.x上进行观察,但那只会告诉您当时未定义。