Node.js中对象属性是否同时求值?能否确保示例属性值始终一致?
Node.js中对象属性的求值顺序问题
问题核心
在Node.js中,对象字面量的属性是否会被同时求值?比如执行以下代码:
{ a: Date.now(), b: Date.now() }
某次执行返回了{ a: 1664294035466, b: 1664294035466 },能否确保a和b的值始终相同?
结论
不能确保两者的值始终相同。
原因解析
JavaScript(包括Node.js)中,对象字面量的属性是按从左到右的顺序依次求值的,并非同时计算:
- 先执行
a对应的表达式Date.now(),生成一个时间戳 - 再执行
b对应的表达式Date.now(),生成另一个时间戳
虽然Date.now()执行速度极快,绝大多数场景下两次调用结果会相同,但在极端情况中(比如两次调用刚好跨过毫秒边界,或者线程在两次调用之间被短暂阻塞),两次返回的时间戳就会出现差异。
验证示例
可以通过以下代码模拟毫秒边界场景,大概率会得到不同的结果:
let obj; // 等待即将进入下一个毫秒的时刻 while (Date.now() % 1000 !== 999) {} // 此时执行两次Date.now(),很可能跨毫秒 obj = { a: Date.now(), b: Date.now() }; console.log(obj); // 可能输出:{ a: 1699999999999, b: 1700000000000 }
确保值相同的方案
如果需要保证a和b的值完全一致,应该先将Date.now()的结果存入变量,再赋值给对象属性:
const now = Date.now(); const obj = { a: now, b: now };
内容的提问来源于stack exchange,提问作者BTL
相关产品推荐
相关产品推荐

