要检查是否存在属性嵌套对象,我们应该逐步进行以避免 TypeError。
如果至少有一个成员为空或者未定义,并且我们尝试访问成员,则将抛出该错误。
有两种方法可以避免。
我们可以捕获异常或者创建一个函数来测试多个级别的存在,如下所示:
function checkNested(obj /*, level1, level2, ... levelN*/) { let args = Array.prototype.slice.call(arguments, 1); for (var i = 0; i < args.length; i++) { if (!obj || !obj.hasOwnProperty(args[i])) { return false; } obj = obj[args[i]]; } return true; } let test = { level1: { level2: { level3: 'level3' } } }; console.log(checkNested(test, 'level1', 'level2', 'level3')); //true console.log(checkNested(test, 'level1', 'level2', 'foo')); //false
使用 ES6 特性可以使函数更短:
function checkNested(obj, level, ...rest) { if (obj === undefined) return false; if (rest.length == 0 && obj.hasOwnProperty(level)) return true; return checkNested(obj[level], ...rest) }
要获取嵌套属性值并检查其是否存在,请使用以下单行代码:
function getNested(obj, ...args) { return args.reduce((obj, level) => obj && obj[level], obj) } const test = { level1: { level2: { level3: 'level3' } } }; console.log(getNested(test, 'level1', 'level2', 'level3')); //'level3' console.log(getNested(test, 'level1', 'level2', 'level3', 'length')); //6 console.log(getNested(test, 'level1', 'level2', 'foo')); //undefined console.log(getNested(test, 'a', 'b')); //undefined
我们还可以使用可选运算符访问深度嵌套的属性,方法是使用令牌 ?.:
const value = obj ? .level1 ? .level2 ? .level3
如果访问的任何给定级别为空或者未定义,则表达式将默认解析为未定义。
运算符还安全地处理方法调用:
obj ? .level1 ? .method();
如果 obj、obj.level1 或者 obj.level1.method 为 null 或者未定义,则上述表达式产生 undefined;否则,它将调用该函数。
可选链操作符
可选链运算符 (?.) 是一个提议,它允许读取位于连接对象链深处的属性的值,而无需明确验证每个引用是否有效。
这 ?
。
如果引用评估为空或者未定义,则运算符函数允许短路。
当与函数调用一起使用时,如果函数不存在,它返回 undefined。
日期:2020-06-02 22:16:09 来源:oir作者:oir