测试是否在对象中设置了属性,否则返回true

时间:2015-09-29 09:36:43

标签: javascript

我正在使用in运算符来检查属性是否已设置。我得到了意想不到的结果。如果未设置属性,由于某种原因,它仍然返回true

console.log('completion', JSON.stringify(completion), (completion && ('transaction' in completion)));

JSON.stringify(completion)返回{"user":3,"survey":"4ydBY0t6","year":2015,"month":9,"id":38,"createdAt":"2015-09-29T08:08:08.000Z","updatedAt":"2015-09-29T08:08:08.000Z"}(completion && ('transaction' in completion))会返回true为什么会这样?

在受影响的线路周围修改更多代码

resp.surveys.forEach(function(survey) {
    var completion = _.find(completions, { survey: survey.id });

    console.log('completion', JSON.stringify(completion), (completion && ('transaction' in completion)));

    // ...
    survey.pointsAwarded = (completion && ('transaction' in completion)) ? completion.transaction.points : 0;
});

1 个答案:

答案 0 :(得分:5)

JSON.stringify只查看对象的自己的可枚举属性。另一方面,in查看对象上是否存在属性(无论是否可枚举)或其任何原型。 JSON.stringify也会遗漏其值为undefined或函数的属性。

因此{J}有三种方式可以存在但不会显示在JSON中:

  1. 这不是可以消费的

  2. 它是通过原型链继承的

  3. 其值为transaction或函数参考

  4. 以下是这三个例子:

    undefined