四川省微信网站建设公,网页微博怎么用qq登录,销帮帮crm怎么样,wordpress文章点开是个新网页问题
cannot read property of undefined 是一个常见的 JavaScript 错误#xff0c;包含我在内很多人都会遇到#xff0c;表示你试图访问一个未定义#xff08;undefined#xff09;对象的属性。这通常是因为你在访问一个不存在的对象… 问题
cannot read property of undefined 是一个常见的 JavaScript 错误包含我在内很多人都会遇到表示你试图访问一个未定义undefined对象的属性。这通常是因为你在访问一个不存在的对象或者变量。为了解决这个问题你需要检查你的代码确保在访问对象属性之前对象已经被正确定义。
How can I avoid cannot read property of undefined errors?
如何避免“无法读取未定义的属性”错误 Given that below object , not all object has same property , normally happens in JSON format , 如果阁下遇到以下问题a中未必包含bb中未必包含c甚至a也不一定存在应该如何优雅的判断呢。
// Where this array is hundreds of entries long, with a mix
// of the two examples given
var test [{a:{b:{c:foo}}}, {a: bar}];for (i0; itest.length; i) {// OK, on i0, but cannot read property of undefined on i1console.log(a.b.c);
}
解决方法
强力推荐封装GetProperty方法从对象中获取属性属性不存在则返回默认值
This is a common issue when working with deep or complex JSON object, so I try to avoid try/catch or embedding multiple checks which would make the code unreadable. I usually use this little piece of code in all my projects to do the job.
/* Example: getProperty(myObj, aze.xyz, 0) // return myObj.aze.xyz safely* accepts array for property names:* getProperty(myObj, [aze, xyz], {value: null})*/
function getProperty(obj, props, defaultValue) {var res, isvoid function(x) {return typeof x undefined || x null;}if(!isvoid(obj)) {if(isvoid(props))props [];if(typeof props string)props props.trim().split(.);if(props.constructor Array) {res props.length1 ? getProperty(obj[props.shift()], props, defaultValue) : obj[props[0]];}}return typeof res undefined ? defaultValue: res;
}
思路二我的项目中用的就是这个方法 !!! 好用
//by zhengkai.blog.csdn.net
const temp {};
console.log(getSafe(()a.b.c, 0));function getSafe(fn, defaultVal) {try {if (fn() undefined || fn() null) {return defaultVal} else {return fn();}} catch (e) {return defaultVal;}
}
使用默认参数值
在函数定义时为参数设置默认值以确保即使没有传递参数也不会出现未定义的属性。
function example(param default value) {console.log(param);
}example(); // 输出 default valuehasOwnProperty检查属性是否存在
const obj {key: value
};if (obj.hasOwnProperty(key)) {console.log(obj.key);
} else {console.log(Key does not exist);
}使用逻辑或操作符||
const obj {key: value
};console.log(obj.key || Default value); // 输出 value使用解构赋值
const obj {key: value
};const { key Default value } obj;console.log(key); // 输出 value可选链操作符optional chaining语法(.?
If you use JavaScript according to ECMAScript 2020 or later, see optional chaining.TypeScript has added support for optional chaining in version 3.7.
// use it like this
obj?.a?.lot?.of?.properties
使用可选链操作符.可选链操作符允许你在尝试访问对象的属性时提供一个后备值以防属性不存在。
const obj {key: value
};console.log(obj?.key ?? Default value); // 输出 value不是很建议的try/catch
A quick workaround is using a try/catch helper function with ES6 arrow function:
function getSafe(fn, defaultVal) {try {return fn();} catch (e) {return defaultVal;}
}// use it like this
console.log(getSafe(() obj.a.lot.of.properties));// or add an optional default value
console.log(getSafe(() obj.a.lot.of.properties, nothing)); 不够优雅的“多重判断”方法
ry this. If a.b is undefined, it will leave the if statement without any exception.
if (a a.b a.b.c) {console.log(a.b.c);
}