检查是否定义了对象的一部分

时间:2014-05-06 21:47:49

标签: javascript

我正在尝试设置一个变量:

latestPostId = posts[latestPost].post_id

但在一种情况下,尚未定义。最好的检查方法是什么?

我试过这些:

if (data.post_id !== undefined) {
if (data.post_id !== 'undefined') {
if (typeof data.post_id != 'undefined') {

但似乎都没有用。检查posts[latestPost].post_id是否已定义的最佳方法是什么?

4 个答案:

答案 0 :(得分:0)

  

检查帖子[latestPost] .post_id是否已定义的最佳方式是什么?

posts[latestPost].post_id !== undefined是否有效?

我可能会posts[latestPost] && posts[latestPost].post_id

答案 1 :(得分:0)

你可以用多种方式做到(你的最后一个是好的):

   if (typeof data.post_id != 'undefined')

或更简单

   if (data.post_id)

但是:如果数据根本不存在,这可能会产生错误。所以你应该这样做:

   if (data && data.post_id)

对于像:a.b.c.d.ef这样的对象,你应该这样做:

   if (a && a.b && a.b.c && a.b.c.d && etc)

答案 2 :(得分:0)

您可以使用帮助程序来避免冗长的if语句并提高可重用性,例如:

/**
 * @param {string} key
 * @param {object} obj
 */
function keyExists(key, obj) {
  var res = key.split('.').reduce(function(acc,x) {
    return acc[x];    
  },obj);
  return res != null || false;
}

并像这样使用它:

var obj = {a: {b: {c:'foo'}}};

console.log(keyExists('a.b.c', obj)); //=> true
console.log(keyExists('a.b.c.d', obj)); //=> false

if (keyExists('a.b.c', obj)) {
  // it exists
}

答案 3 :(得分:0)

in运算符检查对象是否有属性。

'post_id' in posts[latestPost]`

有些人更喜欢hasOwnPropertyin遍历对象的原型链,而hasOwnProperty则不遍历。