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

时间:2018-11-18 13:59:49

标签: javascript

如果访问未定义值的属性,则会出现异常:

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

VM186:1未捕获的TypeError:无法读取未定义的属性'length'       在:1:12

在这种情况下,我想获得一个默认值而不是一个异常,但是我现在的做法似乎太冗长了:

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

是否有更简单,更优雅的方法来做到这一点?可能使用ES6。

5 个答案:

答案 0 :(得分:0)

尝试ternary operator

let n =object["foo"] ? object["foo"].length : 0;

要不写两次object["foo"],您还可以执行以下操作:

let n = object["foo"]; 
n = n ? n.length : 0;

答案 1 :(得分:0)

使用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)

答案 2 :(得分:0)

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

const obj = {};
const { foo: { length = 0 } = [] } = obj;
  
console.log(length)

答案 3 :(得分:0)

我们要检查两个可能的不确定值。首先,密钥需要存在于字典中。之后,该对象应该是具有属性set hivevar:start_date=2015-07-01; --replace with your start_date set hivevar:end_date=current_date; --replace with your end_date set hive.exec.parallel=true; set hive.auto.convert.join=true; --this enables map-join set hive.mapjoin.smalltable.filesize=25000000; --size of table to fit in memory with date_range as (--this query generates date range, check it's output select date_add ('${hivevar:start_date}',s.i) as dt from ( select posexplode(split(space(datediff(${hivevar:end_date},'${hivevar:start_date}')),' ')) as (i,x) ) s ) --insert overwrite table your table --uncomment this after checking if you need to overwrite your table select s.ID, s.dt, case when t.id is null then 0 else t.value end as value --take existing value for joined, 0 for not joined --also you can do simply NVL(t.value,0) as value if no NULLs are allowed in your_table.value from (--this subquery will give all combinations of ID and date, which should be the result select d.dt, IDs.ID from date_range d cross join (select distinct ID from your_table) IDs ) s left join your_table t on s.dt=t.date and s.id=t.id --join with existing records, check your table column names order by s.id, s.dt --remove this if ordering is not necessary ; 的数组或结构。

一种不错的方法是使用length定义未定义时的默认值。但是,如果您尝试检查||的未定义值而没有先处理此值,将无法正常工作。

示例

length

另一个例子

一个更简单的示例,更接近您的用例;

   let object = {};
   
   let r = (object["foo"] || 333);
   let l = r.length || 111;

   let oneLiner = (object["foo"] || 333).length || 111;

   console.log("Default Value: " + r);
   console.log("Default Length: " + l);
   console.log("OneLiner: " + oneLiner);

答案 4 :(得分:0)

@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

以防万一,我前阵子写了一篇博客文章。

mouseover