开发者问题收集

如果访问可能未定义值的属性,则返回默认值的简单方法

2018-11-18
3982

如果访问未定义值的属性,我会得到一个异常:

let object = {}
let n = object["foo"].length;

VM186:1 Uncaught TypeError: Cannot read property 'length' of undefined at :1:12

我想在这种情况下获取默认值而不是异常,但是我现在这样做的方式似乎太冗长了:

let n = 0;
if (object.hasOwnProperty("foo")) {
    n = object["foo"].length;
}

有没有更简单、更优雅的方式来做到这一点?可能,使用 ES6。

3个回答

@lleaon 提到的方法仅在值为 undefined 时才有效,对其他虚假值(如 null )无效。

这是我经常用来安全访问 JavaScript 中嵌套对象的技术。一年前,我从另一个 SO 答案中学到的。

const obj = {};
const arrLength = (obj.foo || []) || 0;
console.log(arrLength); // 0

您可以像这样检查深层嵌套级别,

const obj = {};
const arrLength = ((obj.nestedObj || {}).foo || []) || 0;
console.log(arrLength); // 0

如果您有兴趣,我之前写了一篇关于它的博客文章。

安全访问 JavaScript 中的嵌套对象

Dinesh Pandiyan
2018-11-18

不确定是否更优雅,但 对象解构 可以分配默认值。 但它不会阻止您使用 null 值。只是 undefined

const obj = {};
const { foo: { length = 0 } = [] } = obj;
  
console.log(length)
lleon
2018-11-18

使用 es6,您可以通过使用 Object.keys(object) 检查对象是否有任何键,这将提供一个键数组 Object.keys ,使用长度检查它将给出对象是否为空,还可以检查另一个条件,即对象的构造函数是否为对象。

请参阅下面的代码。如果满足这两个条件,则意味着对象为空,您可以分配一个默认值

let object = {}
if(Object.keys(object).length === 0 && object.constructor === Object){
// assign a default value if the object is empty
 object["foo"] = "bar"
}

console.log("object is empty default value will be assigned", object)
Learner
2018-11-18