4 ms·
I'm pretty comfortable declaring that creating a mutable-by-default date, string, or number library is a mistake. I'm not on the make-all-the-things-immutable t
by sa46 5y ago
I'm pretty comfortable declaring that creating a mutable-by-default date, string, or number library is a mistake. I'm not on the make-all-the-things-immutable train but making dates mutable is a painful mistake that Java painfully worked through with JSR-310, the new date and time library.
Part of the problem is that moment would both mutate the underlying object and return the object.
const a = moment()
const b = a.add(1, 'second')
Both b and a are now the same object. I've lost a few hours to the design choice.
- NegativeLatency 5y agoSpent several hours debugging that one a couple of years ago
- moogly 5y agoI think the Dev Tools in Chrome might have changed since (I don't use Chrome anymore), but we had issues maybe 5 years ago when hovering over momentjs watch statements in the debugger kept on mutating the underlying data. That was fun.
- fastball 5y agoI think the problem there is more one of library design than specifically a mutable object problem. If `a` is mutated by the `.add()` method, then it should probably return void rather than returning a copy of the object. Is the immutable DX still better in this specific example? Probably. But the above at least would help developers avoid the major footgun with mutability.
- deleted 5y ago[deleted]
- 01acheru 5y agoIt’s just a matter of RTFM I guess, the a.add() method returns “a” so that you can chain methods on the same object without creating a new object on every method call. Else: a.add(1, ‘second’).add(1, ‘day’).subtract(2, ‘minute’) would create 3 more objects that are not needed. Creating a new moment object is expensive, it happened to me to work with a lib that grew exponentially slow when using above N dates because they where constantly recreating moments instead of using them wisely so creating a new one on every operation would be quite bad. That’s why the method .clone() exists, so you can declare that explicitly: const a = moment() const b = a.clone().add(1, ‘second’) PS: don’t take RTFM as an offense, I just happen to like it a lot and we use it frequently at work, I don’t mean to be disrespectful towards you :)