如何检查JavaScript中的对象属性是否未定义?


当前回答

ECMAScript 10引入了一个新特性——可选链接,只有当对象定义为如下时,才可以使用该特性来使用对象的属性:

const userPhone = user?.contactDetails?.phone;

只有在定义了user和contactDetails时,它才会引用phone属性。

裁判。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

其他回答

解决方案不正确。在JavaScript中,

null == undefined

将返回true,因为它们都“强制”为布尔值,并且都为false。正确的方法是检查

if (something === undefined)

这是身份运算符。。。

if (somevariable == undefined) {
  alert('the variable is not defined!');
}

您也可以将其转换为函数,如下所示:

function isset(varname){
  return(typeof(window[varname]) != 'undefined');
}

这可能是确定现有属性名称是否具有显式和预期值undefined的唯一显式形式;尽管如此,这是一种JavaScript类型。

"propertyName" in containerObject && ""+containerObject["propertyName"] == "undefined";
>> true \ false

仅当给定上下文的属性名存在(真实存在)并且其预期值未明确定义时,此表达式才会返回true。

不会出现假阳性,例如空字符串、空字符串、零、空数组等。这正是如此。检查,即确保属性名存在(否则将为假阳性),然后显式检查其值是否未定义,例如其字符串表示形式中的未定义JavaScript类型(字面上为“undefined”),因此==而不是==,因为无法进行进一步转换。只有满足这两个条件,这个表达式才会返回true。例如,如果属性名称不存在,则返回false。这是唯一正确的返回,因为不存在的财产不能有值,甚至不能有未定义的值。

例子:

containerObject = { propertyName: void "anything" }
>> Object { propertyName: undefined }

// Now the testing

"propertyName" in containerObject && ""+containerObject["propertyName"] == "undefined";
>> true

/* Which makes sure that nonexistent property will not return a false positive
 * unless it is previously defined  */

"foo" in containerObject && ""+containerObject["foo"] == "undefined";
>> false
function isUnset(inp) {
  return (typeof inp === 'undefined')
}

如果变量已设置,则返回false;如果未定义,则返回true。

然后使用:

if (isUnset(var)) {
  // initialize variable here
}

如果你这样做

if (myvar == undefined )
{ 
    alert('var does not exists or is not initialized');
}

当变量myvar不存在时,它将失败,因为没有定义myvar,所以脚本被破坏,测试没有效果。

由于窗口对象在函数外部具有全局作用域(默认对象),因此声明将“附加”到窗口对象。

例如:

var myvar = 'test';

全局变量myvar与window.myvar或window['myvar']相同

为了避免在存在全局变量时要测试的错误,最好使用:

if(window.myvar == undefined )
{ 
    alert('var does not exists or is not initialized');
}

一个变量是否真的存在并不重要,它的值是不正确的。否则,用undefined初始化变量是愚蠢的,最好使用值false来初始化。当你知道你声明的所有变量都是用false初始化的时候,你可以简单地检查它的类型或者依赖它!window.myvar检查它是否具有正确/有效的值。因此,即使没有定义变量!window.myvar对于myvar=undefined或myvar=false或myvar=0是相同的。

如果需要特定类型,请测试变量的类型。要加快测试条件,您最好执行以下操作:

if( !window.myvar || typeof window.myvar != 'string' )
{
    alert('var does not exists or is not type of string');
}

当第一个简单条件为真时,解释器将跳过下一个测试。

最好使用变量的实例/对象来检查它是否获得了有效值。它更稳定,是一种更好的编程方式。

(y)