我正在使用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;
});
答案 0 :(得分:5)
JSON.stringify
只查看对象的自己的可枚举属性。另一方面,in
查看对象上是否存在属性(无论是否可枚举)或其任何原型。 JSON.stringify
也会遗漏其值为undefined
或函数的属性。
因此{J}有三种方式可以存在但不会显示在JSON中:
这不是可以消费的
它是通过原型链继承的
其值为transaction
或函数参考
以下是这三个例子:
undefined