访问对象密钥时,如果没有'不存在

How can I throw an error when accessing an object key that doesn't exist?

本文关键字:不存在 如果没有 对象 密钥 访问      更新时间:2023-09-26

这是一个很长的机会。。。

在Javascript中,我正在访问一个我确信存在的对象属性,但我在键的名称中有一个拼写错误,因此返回了undefined并创建了一个错误。

我怎么能写与以下内容等效的代码,但因为键不存在而引发错误?

var obj = {'myKey': 'myVal'},
    val = obj.myKye;

我正在努力寻找一种解决方案,它不需要我编写包装器函数,每次我想访问对象的成员时都会使用该函数。有可能吗?Javascript中是否还有另一种"更严格"的访问对象属性的技术?

你不能。。。

如果您想非常小心,hasOwnProperty会让您检查属性是否已定义。

function GetSafe(obj, propertyName)
{
   if (obj.hasOwnProperty(propertyName)) return obj[propertyName];
   return "Unknown property:"+ propertyName; // throw or some other error reporting.
}
var obj = {'myKey': 'myVal'};
alert(GetSafe(obj, "myKey"));
alert(GetSafe(obj, "myKye"));

一个不需要我编写包装器函数的解决方案,每次我想访问对象的成员时都会使用该函数。有可能吗?Javascript中是否还有另一种"更严格"的访问对象属性的技术?

没有。你可以使用Proxy,它的设计完全是为了做你想做的事。然而,它只是一个草案,目前仅在Firefox的Javascript 1.8.5(FF18+)中支持。

没有其他可能为所有属性访问提供隐式getter函数。您必须对其进行显式编码。

试试这个:

function invalidKeyException(message) {
   this.message = message;
   this.name = "invalidKeyException";
}
var obj = {'myKey': 'myVal'},
val = obj.myKye;
if (val == undefined)
    throw new invalidKeyException("Key does not exist.");

JSFiddle:http://jsfiddle.net/r2MM4/

(看控制台)

您可以尝试以下方法:

1) 使用typeof:

try {
    var obj = {'myKey': 'myVal'}, val;
   if(typeof (obj.myKye) === 'undefined')
   {
      var e = new NotImplementedError("NotImplementedError Your_message");
      throw e;
   } 
   else
   {
     val = obj.myKye;
   }    
    alert(val);
   }
catch(e) 
  {
    alert(e);
  }

2) 使用obj.hasOwnProperty(prop):

try {
    var obj = {'myKey': 'myVal'}, val;
   if(obj.hasOwnProperty(myKye))
   {
     val = obj.myKye;
   } 
   else
   {
      throw 'Property undefined';
   }
    alert(val);
   }
catch(e) 
  {
    alert(e);
  }

您可以使用try-catchhasOwnProperty并创建ReferenceError。

var obj = {
        'myKey': 'myVal'
}, val;
try {
    if(obj.hasOwnProperty(myKye))
    {
        val = obj.myKye;
        alert(val);
    }
    else{
        var ex =  new ReferenceError()
    }
}
catch(ex) {
    alert(ex);
}

测试链路

更新:

obj.myKye返回undefined并且不抛出异常,因为

这就是JS语言规范。

对象对于未定义的属性名称返回未定义,但未定义的变量引用抛出错误