我有一个名为events
的 firestore 集合,其中包含字段为begin
、end
和title
的文档。 如果文档已更改,则会触发该函数。
begin
和end
属于timestamp
型。 我希望我的函数return false
是否更改了begin
或end
。
在我的云函数中,我检查前后数据是否相等,但是返回true
,即使只更改了字段title
。
const before = change.before.data()
const after = change.after.data()
//begin and end weren't changed. Still, true is returned
if (before?.begin == after?.begin && before?.end == after?.end) {
return false
}
return true
比较毫秒时,它有效:
const before = change.before.data()
const after = change.after.data()
//begin and end weren't changed. false is returned
if (before?.begin.toMillis() == after?.begin.toMillis() && before?.end.toMillis() == after?.end.toMillis()) {
return false
}
这是什么原因造成的?我不应该能够比较Timestamp
对象本身,而不是使用成员函数比较它吗?
我不应该能够比较时间戳对象本身而不是使用成员函数比较它吗?
不,JavaScript 中的==
运算符在应用于对象时,仅比较对两个对象的引用。 它没有对它们进行深入比较。 因此,仅当两个对象是完全相同的对象时,它才会生成 true。
如果要比较两个时间戳对象,则需要深入比较它们。 正如您从链接的 API 文档中看到的那样,时间戳上提供了一个 isEqual 方法,可以为您执行此操作。
before?.begin.isEqual(after?.begin)
当你使用toMillis
时,你所做的是比较两个JavaScript数字对象,它们通过它们的实际值更直观地进行比较。 在这种情况下,它也不是精确的比较,因为时间戳可以表示纳秒精度时间。 转换为毫秒会丢失数据。