检查是否在 JavaScript 中对象属性的最佳方式是什么是未定义的?

2008-08-26 07:25:08
问题评论:

这个问题是合并的候选人重复问题。它可能会将标记为已接受的答案是真正正确的那个?

这里是一个更完整的答案︰ stackoverflow.com/questions/3390396/...

请注意,如果未设置属性在所有对象,然后typeof(o.prop) == 'undefined'仍然是真理。若要区分这种情况下,您需要检查'prop' in o.

最满意的答案曾经- stackoverflow.com/questions/2631001/...

测试在相反方向 (对其进行测试未定义),则需要o.prop !== undefinedtypeof(o.prop) != 'undefined'

回答:

使用︰

if (typeof something === "undefined") {
    alert("something is undefined");
}

如果具有某些属性的对象变量可以使用相同的操作,如下︰

if (typeof my_obj.someproperties === "undefined"){
    console.log('the property is not available...'); // print into console
}

如果什么东西是空 it 定义 (为空),但可以共轭过检查。上面代码的令人讨厌的细节是,不能定义一个函数以检查它,也可以定义该函数...,但尝试使用它。

为什么不,ravz?可能您请详细阐述?

@neu-rah 为什么不能编写一个函数?为什么不是类似这种工作?它看起来适合我。有一种情况我不在考虑吗?jsfiddle.net/djH9N/6

@Zack 的 isNullorUndefined 测试并未考虑其中调用 isNullOrUndefined(f),f 是未声明的情况 (即在没有任何"var f"声明)。

但,数千个现在投票。这是最坏的可能方式去做。我希望 passers-by 看到该备注并决定签...ahem...其他答案。

我认为有数本主题的正确答案。不同公共大众,"未定义"不在 JavaScript 中的关键字,并且事实上可以具有分配给它的值。

// Degenerate code. DO NOT USE.
var undefined = false;  // Shockingly, this is completely legal!
if (myVar === undefined) {
    alert("You have been misled. Run away!");
}

此外, myVar === undefined将引发 myVar 未声明的情况中的错误。

若要执行此测试的最可靠方法是︰

if (typeof myVar === "undefined")

这将始终返回正确的结果,甚至处理其中myVar未声明的情况。

记录该 myVar + 1 === 未定义将引发错误,如果未声明 myVar

yes-报价显然至关重要。我推测是格式的使用 typeof 函数返回一个字符串 (预期)

除了标记注释没有看到这:"myVar === 未定义将引发 myVar 未声明的情况中的错误。"-这是为什么坏?为什么我想要有错误,如果我正在引用未声明的变量?

@Kevin 是,则会是,因为typeof将始终返回一个字符串,该字符串进行类型安全比较不必要。有只认为最好使用===分别为!==以独占方式。实际上我认为该 jQuery 仅使用!=.

此外请提醒您可以总是会来获取的值undefined指向void 0使您可以执行if (myVar === void 0)0不是特殊,那里字面意义放任何表达式。

在 JavaScript 中有为null且没有定义它们具有不同的含义。

  • 未定义,则意味着未定义的变量值;不知道值是什么。
  • null ,则表示变量的值是已定义并且已设置为 null (没有任何值)。

Marijn Haverbeke 所指出的在他免费、 在线书籍"雄辩的 JavaScript"(强调地雷)︰

还有类似的值,为 null,其含义是定义了此值,但它并没有一个值。区别中含义不明确的和空很是学术性的并且通常不是十分有趣。在实际程序中,通常是需要检查是否有价值。在这些情况下,该表达式是 = = 未定义的可能使用,因为即使他们也不完全相同的值为 null = = 未定义的会产生 true。

因此,我想要检查的内容是未定义的最佳方法是︰

if (something == undefined)

希望这能帮助 !

编辑︰在您编辑响应,对象属性应工作方式相同。

var person = {
    name: "John",
    age: 28,
    sex: "male"
};

alert(person.name); // "John"
alert(person.fakeVariable); // undefined

如果 (某 = = 未定义) 更好地编写像 (东西 === 未定义)

它应该被指出这并不完全安全。undefined为仅可由用户重新分配一个变量︰ 编写undefined = 'a';将导致代码不能执行您认为它不会。使用typeof要好,也适用于未声明的变量 (而不仅仅是属性)。

如果什么东西是未定义的全局变量 (内容 = = 未定义) 调出 javascript 错误。

这样的问题是,如果 var = null,则未定义 = = 的计算结果为 true 时,即使最肯定的定义。

"雄辩 Javascript"注释的解释是向后如果确实只是要检查是否有未定义的该建议的代码不起作用 (它将检测到的条件定义但没有值已被尚未 assined [i.e.null]).a 为空值。建议的代码"如果 (内容 = = 未定义)..."检查未定义和 null (没有值集),亦即它被解释为"如果 ((something is undefined) (内容为空) 或者)..."作者说话的内容,通常您真正想什么是不明确的和空的检查。

这做什么意思: "未定义的对象属性"?

实际上它可能意味着两个非常不同的事物 !首先,它可以意味着,从未定义该属性的对象中,第二,它可以表示包含未定义的值的属性让我们看一下这段代码︰

var o = { a: undefined }

o.a未定义?是的!它的值是未定义的。o.b未定义?确保 !没有 'b' 属性在所有 !好了,看到这两种情况下的行为现在如何不同的方法︰

typeof o.a == 'undefined' // true
typeof o.b == 'undefined' // true
o.a === undefined // true
o.b === undefined // true
'a' in o // true
'b' in o // false

我们可以清楚地看到, typeof obj.prop == 'undefined'obj.prop === undefined相当,而且它们无法区分这些不同的情况。并且'prop' in obj可以检测到这一情况当根本未定义属性,且不注意到这可能是未定义的属性值。

那么怎么办?

1) 您想要知道是否某个属性未定义任何一个第一或第二个含义 (最典型的情况下)。

obj.prop === undefined // IMHO, see "final fight" below

2) 您想只需知道对象是否具有某些属性并不关心它的值。

'prop' in obj

注释︰

  • 您不能在同一时间检查对象并将其属性。例如,这x.a === undefined或这typeof x.a == 'undefined'引发ReferenceError: x is not defined如果 x 未定义。
  • 变量undefined为全局变量 (所以实际上是在浏览器中的window.undefined )。已支持、 ECMAScript 5读取之后 ECMAScript 第一版。因此在现代浏览器中不能重新定义为真为许多作者喜欢来恐吓我们,但这仍是真正的为旧版浏览器。

最终打︰ obj.prop === undefinedtypeof obj.prop == 'undefined'

优劣的obj.prop === undefined:

  • 它是有点短,看起来有点更加美观
  • JavaScript 引擎将为您提供了错误如果有拼写错误undefined

弊的obj.prop === undefined:

  • undefined可以替代旧的浏览器中

优劣的typeof obj.prop == 'undefined':

  • 它是真正通用的 !它在新的和旧的浏览器中工作正常。

弊的typeof obj.prop == 'undefined':

  • 'undefned'拼写错误) 这里是不仅仅是字符串常量,因此如果有像我刚做了拼错的 JavaScript 引擎能帮助您

(用于服务器端 JavaScript) 更新︰

Node.js 支持全局变量undefinedglobal.undefined (它也可不带 '全球' 前缀)。我不知道有关服务器端 JavaScript 的其他实现。

@Bergi 感谢您您的评论。我必须纠正我的答案。我国防中我可以说,目前 (截至 v.0.10.18)官方 Node.js 文档未提及undefined成员的global此外没有console.log(global);也不能for (var key in global) { ... }不显示未定义全局成员。但正如'undefined' in global显示相反的测试。

它并不需要额外的文档,因为它处于 EcmaScript 规范,它还说,:-) [[Enumerable]]是假

有关Minuses of typeof obj.prop == 'undefined',这样可以避免通过编写为typeof obj.prop == typeof undefined这还提供了非常好的对称性。

该问题归结为三种情况︰

  1. 对象具有属性,其值不为undefined.
  2. 对象具有属性和它的值未undefined.
  3. 对象不具有属性。

这将告诉我们我认为重要的东西︰

还有一个未定义的成员和与未定义的值定义的成员之间存在差异。

但 unhappily typeof obj.foo不会告诉我们我们有三种情况中的哪。但是我们可以合并这与"foo" in obj来区分的情况。

                               |  typeof obj.x === 'undefined' | !("x" in obj)
1.                     { x:1 } |  false                        | false
2.    { x : (function(){})() } |  true                         | false
3.                          {} |  true                         | true

它值得注意的,这些测试都是相同的null条目太

                               |  typeof obj.x === 'undefined' | !("x" in obj)
                    { x:null } |  false                        | false

我认为,在某些情况下更有意义 (并且是更清晰) 来检查该属性是否存在,比检查是否是未定义的然后唯一的情况,这一检查将不同是案例 2 的情况很少实际项具有未定义的值的对象。

例如︰ 我重构的已经不仅仅被多个对象有一个给定的属性是否具有大量的检查的代码。

if( typeof blob.x != 'undefined' ) {  fn(blob.x); }

这是未定义的写入而无需检查时更清楚。

if( "x" in blob ) { fn(blob.x); }

但提到它们是不完全相同 (但很多足够符合我的需要)。

嗨迈克尔。很好的建议,我认为它可以使操作更整洁。使用时,我发现,但是,一个隐患 !与"in"运算符。if (!("x" in blob)) {}用方括号中,因为 !通过进,运算符的优先级。帮助他人的愿望。

很抱歉迈克尔,但这不正确,或至少具有误导性,根据原始的问题。进不是一个测试对象属性类型未定义是否足够方法。校样,请参阅此琴声︰ jsfiddle.net/CsLKJ/4

那两个代码部分做不同的事情 !考虑和对象提供a = {b: undefined};然后typeof a.b === typeof a.c === 'undefined',但'b' in a!('c' in a).

+ 1。OP 明确指出该属性存在,并且具有值未定义或未定义该属性本身是否不会使它 (即不存在)。

我建议您更改与第一个表中的点 (2) { x : undefined }或至少在表中将其添加为另一个替代方法 (2)。-我必须思考一下意识到到undefined计算点 (2.) (尽管以后说的)。

内容来源于Stack Overflow Detecting an undefined object property
请输入您的翻译

Detecting an undefined object property

确认取消