var now = moment()
undefined
var startOfMonth = now.startOf("month")
undefined
startOfMonth
u {_isAMomentObject: true, _isUTC: false, _locale: l, _d: Fri Dec 01 2017 00:00:00 GMT+0800 (China Standard Time), _z: null}
var endOfMonth = now.endOf("month")
undefined
endOfMonth
u {_isAMomentObject: true, _isUTC: false, _locale: l, _d: Sun Dec 31 2017 23:59:59 GMT+0800 (China Standard Time), _z: null}
startOfMonth
u {_isAMomentObject: true, _isUTC: false, _locale: l, _d: Sun Dec 31 2017 23:59:59 GMT+0800 (China Standard Time), _z: null}
now
u {_isAMomentObject: true, _isUTC: false, _locale: l, _d: Sun Dec 31 2017 23:59:59 GMT+0800 (China Standard Time), _z: null}
1
airycanon 2017-12-20 10:42:39 +08:00
看上去是在浏览器的 console 里写的测试?
|
2
Phariel 2017-12-20 10:47:40 +08:00
指向同一个内部 object 了吧 你自己把时间取一下好了 不要依赖返回对象赋值
|
3
Pastsong 2017-12-20 10:54:47 +08:00
这和库有关系?不是自己蠢?
|
4
sunnygaofan 2017-12-20 11:01:27 +08:00 via iPhone
楼上+1
|
5
codermagefox 2017-12-20 11:04:25 +08:00
console 都是瞎 b 打印的.....
|
6
EridanusSora 2017-12-20 11:04:30 +08:00
var now = moment() 实例化了一个 moment 对象,然后你后面都对这一个对象操作,当然是这样的结果了。
|
7
InternetExplorer 2017-12-20 11:05:55 +08:00
所以 34760 个点 star 的人不觉得有问题,你为什么不考虑一下是自己理解有问题;
moment 文档里的操作几乎都是 moment(). 打头; https://momentjs.com/docs/#/parsing/moment-clone/ |
8
fe619742721 2017-12-20 11:08:06 +08:00
看标题好可怕,还以为是大佬来声讨痛斥 js 垃圾库泛滥了,
|
9
coderluan 2017-12-20 11:21:42 +08:00
这就是一个加入 V 站半年多的会员该有的表现?
|
10
f0rger 2017-12-20 11:43:45 +08:00 via iPhone
实力证明自己不懂还装懂
|
11
Lothar 2017-12-20 11:47:06 +08:00
每次看到这种贴,都感觉有可能是楼主故意卖个蠢,来骗回复铜币的...
|
12
maichael 2017-12-20 11:49:44 +08:00
喷了……
|
13
seki 2017-12-20 11:51:13 +08:00
moment 就是这样的呀,好好看文档
要想不修改原来的值的话,用 date-fns |
15
moxhuis 2017-12-20 12:07:19 +08:00
笑死了
|
16
jiangzhuo 2017-12-20 12:48:34 +08:00
看了楼主没看懂
看到 13 楼我才明白楼主想表达什么。。。。。 |
17
FrankFang128 2017-12-20 12:49:06 +08:00
API 名称不合理而已
|
18
lihongjie0209 OP 统一回复一下:
首先: 函数对外接口应该满足 CQS 其次: 日期对象应该是不可变的, 参考 Java8 新的时间 API 最后: 看不懂 CQS 别瞎回复 |
19
lihongjie0209 OP @jiangzhuo 时间对象的方法有返回值但是改变内部状态, 违反了 CQS 原则, 最坑的是时间对象是可变的
|
20
lihongjie0209 OP @FrankFang128 很有误导性
|
21
FrankFang128 2017-12-20 12:56:24 +08:00 1
我认可楼主的观点,momentjs API 设计不合理
|
22
lihongjie0209 OP @EridanusSora 当接口有返回值时(查询)不应该改变对象内部的状态, 其次时间对象应该是不可变的
|
23
FrankFang128 2017-12-20 12:57:49 +08:00
还有一个更有误导性的
jQuery $.inArray(1, [1,2,3]) 猜猜返回值 你一定以为是 bool 实际是 0,下标 |
24
murmur 2017-12-20 13:00:53 +08:00
楼主怕是 react 中毒了神 tm 不可变对象谁教你 date 必须不可变 像 java 那种用 date 必须配 calendar 很舒服么
|
25
zankard 2017-12-20 13:02:19 +08:00 via iPhone
momentjs 居然是这样设计 api 的
|
26
jiangzhuo 2017-12-20 13:04:53 +08:00
别跟 js 谈 oo
|
27
lihongjie0209 OP @murmur java7 之前的时间 API 一直被骂, Java8 之后出了新的 API, 你可以去看看
|
28
lihongjie0209 OP @jiangzhuo `js 吹`吹 NB 的时候可是把 OO,FP 都揽在身上的
|
29
lihongjie0209 OP @zankard 反`后端`常识, 前端可能只接触到这些类库, 感觉不到
|
30
lihongjie0209 OP @FrankFang128 可怕, 没手册真不会写 js
|
31
eriale 2017-12-20 13:12:27 +08:00 1
楼主说的没错,moment 的开发者也在清理有副作用的部分,包括 startOf 和 endOf 都要向 immutable 方向改。
https://github.com/moment/moment/issues/1754 多说一句,这个 issue 是 3 年前提的,现在还没有改完,如果我是前端开发,我会考虑在新项目避免使用这个库。 |
32
lihongjie0209 OP @FrankFang128 总算有人看懂了, 谢谢
|
33
CDL 2017-12-20 13:13:55 +08:00
js 不等于 java 谢谢
[1,2,3].indexOf(1)返回的也是 0 谢谢 |
34
lihongjie0209 OP @eriale 我是后端, 偶尔写前端, 需要用一个时间类库就找了一个最火的, 没想到都是坑.
|
35
lihongjie0209 OP @CDL indexOf 是查询(Query), 有返回值没有副作用很正常
|
36
quinoa42 2017-12-20 13:17:41 +08:00
没写过 js,不过支持应该 immutable 的观点
无论是 OOP 还是 FP,尽可能减少 mutable 的情况对谁都好 |
37
SourceMan 2017-12-20 13:18:40 +08:00
一开始就有附言那一段不挺好(除了最后一句)
非得言外之意寻知己 |
38
lihongjie0209 OP @SourceMan 这个是我的错
|
39
holyghost 2017-12-20 13:21:39 +08:00
楼主说的是对的。
软件设计是一门学问啊。 |
40
suikator 2017-12-20 13:25:35 +08:00 via Android
笑看 V2EX 大神把楼主批判一番
|
41
k9982874 2017-12-20 13:26:21 +08:00 2
@FrankFang128 inArray 这个我觉得没问题。
你理解为『值是否在数组中存在』理应返回 bool,是中文语言逻辑。 实际上是『查询值在数组中的位置』,按英语习惯没问题。 如果想达到你的要求应该实现『 hasValue 』方法。 @lihongjie0209 查询接口改了值内容是挺坑的 |
42
lihongjie0209 OP @holyghost 反人类啊
|
43
lihongjie0209 OP @suikator 本来不想加附言, 感觉 v2 水平能看懂, 失算
|
44
icyalala 2017-12-20 13:50:48 +08:00
"违反了 CQS 原则"。。唉。。
|
45
ipwx 2017-12-20 14:04:59 +08:00
我看了楼主贴的调试日志,好久才看懂楼主在说啥。
其实我赞同楼主的观点,返回值该是 immutable 的。但是楼主你干嘛偏要用奇怪的术语,CQS 原则是啥?没听过。另外楼主你先用自然语言描述一下问题不行吗。 |
46
otakustay 2017-12-20 14:09:16 +08:00
moment 的 API 确实不好(主要是 immutable,以及一堆没意思的字符串参数),但这是历史问题,Java 也有 7 也有 8,moment 都多久的库了,star 是积累出来的也同时 star 数的增长是有惯性的,如果对 Immutable 是强需求,可以用 luxon
|
47
x7395759 2017-12-20 14:13:11 +08:00
一个 34760 Star 该有的表现是由你说了算的?上来就把别人批判一番,也不看看自己做了什么贡献?
|
48
tjsdtc 2017-12-20 14:13:38 +08:00
虽然没用过 moment 但是同意楼主的观点,这样设计确实很蛋疼
|
49
chairuosen 2017-12-20 14:18:46 +08:00
有返回值就不应该有副作用,有副作用就不该有返回值。YES
|
50
lihongjie0209 OP @x7395759 #47 我说了不算, 所以我把 github issue 贴上了, 还把维护者的博客也贴上了.
|
51
lihongjie0209 OP @ipwx #45 command query separation, 命令与查询分离.
|
52
lihongjie0209 OP @tjsdtc #48 反人类
|
53
ORZRRR 2017-12-20 14:39:43 +08:00
😀摸楼主🐶头!
|
54
baiyi 2017-12-20 14:50:24 +08:00
@k9982874 #41 似乎解释的有点强行,毕竟我用过的 PHP 的 in_array 与 python list 的 in 都是 bool 的
PHP : http://php.net/manual/zh/function.in-array.php python : https://docs.python.org/2/reference/expressions.html#in |
55
LokiSharp 2017-12-20 15:09:26 +08:00
也不说下有啥问题。。。
|
56
Shy07 2017-12-20 15:10:30 +08:00 2
这个坑我也遇到过,后来都是用原生 Date 记录当前时间,然后生成 moment 对象再处理
我不明白 v2 现在的戾气为什么这么重,别人用代码库遇到坑心情不爽措辞有些失当,还情有可原,但那些上来不对事直接对人的,你们这样做真的好么 |
57
crysislinux 2017-12-20 15:30:09 +08:00 via Android
@Shy07 问题是楼主发的话就是找喷的,非不好好说话
|
58
k9982874 2017-12-20 15:34:55 +08:00
|
59
baiyi 2017-12-20 15:40:09 +08:00
|
61
topgrd 2017-12-20 16:00:19 +08:00 1
楼主可以看看 moment 团队新出的一个日期时间库 luxon.
|
62
wee911 2017-12-20 16:09:31 +08:00
我在用 moment 的时候,总觉得 api 不顺手,好怪,每次要看文档,原来是这原因
|
63
wekw 2017-12-20 16:18:57 +08:00 2
一个 Java 程序员,觉得某个 JavaScript 库“应该”符合某种不明所以的规范,所以开喷。
就像: 一个坦克驾驶员跑到飞机驾驶舱里说你们怎么没有左右方向杆呀,这样飞机怎么拐弯呀? 楼主还扯上了“本来不想加附言, 感觉 v2 水平能看懂, 失算”,这种廉价的优越感,楼主要反省。 |
64
overflowHidden 2017-12-20 17:15:40 +08:00
为什么还有强行拉 jquery 出来鞭尸的。。。照这么说天下框架一般黑
|
65
DualWield 2017-12-20 17:24:37 +08:00
lz 一开始并没有把问题说明白,导致一开始的楼都没看懂 lz 的意思,就乱喷一通,v2 的人真的要学习一下礼貌。
ps:我支持 lz 的观点 |
66
VYSE 2017-12-20 17:28:47 +08:00
觉得这样的设计碰坑后才后知后觉它是 mutable 的一般人都会很不爽
|
67
lovedebug 2017-12-20 17:34:04 +08:00
支持,moment 的日期对象可变在转换中挺麻烦
|
68
lihongjie0209 OP @DualWield #65 我的错
|
69
lihongjie0209 OP @wekw #63 这个不明所以的规范写在<重构>中, 写在<代码整洁之道>中, 写在 UncleBob 的每次演讲稿中, 不好意思, 有给你讲了三个不明就里的名词
|
70
wekw 2017-12-20 18:01:25 +08:00
@lihongjie0209 我时常告诫自己,廉价的优越感会让自己变 low。您扪心自问一下,发这个帖子的目的是什么?
|
71
wekw 2017-12-20 18:05:03 +08:00
@lihongjie0209 UncleBob 可能是 Java 程序员的 Uncle,可能他说的话有普适性,那就代表着别的方式都是错的吗?请再看一遍我上一个回复里的问题,问问自己。我也从技术角度回复一下:JavaScript 是 Lisp 在浏览器里的再生,类就是对象,对象就是方法,方法就是类,本就是拥有万千姿态的函数式语言,不是 OO,更不是严格 OO。
|
72
Mcatt 2017-12-20 18:07:28 +08:00 1
要不楼主看看这个库: https://date-fns.org/
|
73
linjianru 2017-12-20 19:08:14 +08:00 2
你提的确实是一个问题。
但你火冒三丈的标题就有些过分了。 如果你付了钱给 moment 买了他们的代码,结果让你很失望,你骂得再难听都没问题。但对于一个完全免费的开源项目,如此的指责只会让人觉得你很刻薄。 建议楼主换位思考。 |
75
jin5354 2017-12-20 19:29:48 +08:00
当众喷一个服务多年的开源免费时间库,这就是一个高贵卓越的后端程序员应有的表现
|
76
zthxxx 2017-12-20 19:37:11 +08:00 1
@Mcatt #72 我也推荐尝试 date-fns 这个库
大概就是 Moment 中 mutable 的问题才让 date-fns 重复这个轮子的,和楼主喷的点一样 https://github.com/date-fns/date-fns/issues/275#issuecomment-264934189 |
77
lguan 2017-12-20 20:08:08 +08:00
提的问题没错,提的方法方式不对,`date-fns`就是一个正确的做法,要么按照文档要,要么不用,换一个,水平够就写一个,哪怕是要喷,github 里面也可以讨论,人家也开 blog 专门说了缘由 ,在这乱喷一通,不觉得 v2 的人有什么问题,我们不仅仅要学怎么做好软件设计,怎么做人也很重要吧
|
78
lihongjie0209 OP @lguan #77 其实吧, 我到是对这个库不太关心, 只是对 javascript 的生态圈比较失望.
|
79
lihongjie0209 OP @linjianru #73 其实吧, 我到是对这个库不太关心, 只是对 javascript 的生态圈比较失望. 这么多 star 按理说应该不错的, 没想到啊.
|
80
lihongjie0209 OP @jin5354 #75 我喷的不是这个库, 是 js, 是 js 的生态圈.
|
81
lguan 2017-12-20 20:44:46 +08:00
@lihongjie0209 这个能理解,前端届一直是比较浮躁的,但这种牢骚个人感觉并不是开源宗旨所在
|
82
lihongjie0209 OP @lguan #81 嗯
|
83
CodingPuppy 2017-12-20 21:03:28 +08:00
这就是准备喷一个有 34760 Star Javascript 库的人该有的表达能力?
|
84
CodingPuppy 2017-12-20 21:09:09 +08:00 2
其实吧,我喷的不是这个准备喷一个有 34760 Star Javascript 库的人,我喷的是所有不写 Javascript 写 PHP、Java、C#、golang 的人,你们圈的人这么有优越感?只是对你们的生态圈圈比较失望。写句话标点符号都不对,按理说应该不错的,没想到啊。
|
85
CodingPuppy 2017-12-20 21:10:53 +08:00
不知道为什么要用中文句号的,别瞎回复。
|
86
lihongjie0209 OP @CodingPuppy #85 谢谢撒币
|
87
mkdong 2017-12-20 22:22:44 +08:00 via iPhone
我觉得楼主没必要喷 js 生态的,不喜欢可以不用呀。
|
88
CodingPuppy 2017-12-20 22:41:16 +08:00
@lihongjie0209 不客气,我就是为了撒币来的
|
89
zsj950618 2017-12-20 22:59:10 +08:00
语文没学好系列
|
90
lxml 2017-12-20 23:40:01 +08:00
勉强看懂了喷的是什么, 设计是有问题, 副总用这个贴加剧了我对于 Js 的恐惧感,
|
91
lihongjie0209 OP @lxml #90 我放弃了.
|
92
movistar 2017-12-20 23:45:22 +08:00 1
@CodingPuppy 连 JavaScript 大小写都写不对的人嘲笑用英文标点的人,66666
而且逗号还能"。。。。"这么用?新华字典教你的么 |
93
iyaozhen 2017-12-21 00:23:38 +08:00 1
这点上支持楼主。
moment 这个库确实你不看文档根本不知道怎么写。 不过太用 Java 的思维去理解其它语言,会给自己带来痛苦 |
94
crs0910 2017-12-21 01:15:34 +08:00 1
|
95
breeswish 2017-12-21 01:18:50 +08:00 1
用这货呀,moment 里各种缺陷都尝试在这里改掉了 https://github.com/moment/luxon
库本身是不能改的,不然就是 breakable change 了,你让之前用的人怎么办 |
96
FrankFang128 2017-12-21 02:56:32 +08:00 1
@breeswish 升级大版本即可
|
97
am241 2017-12-21 03:08:45 +08:00 via Android 1
不懂 js,但在别的语言里,这种功能该由 static 方法提供。这种用法确实反直觉
|
99
jea 2017-12-21 10:02:47 +08:00
那啥, 虽然不大会 js, 可是别人的库你不用就行了啊, 别人不也说明原因了吗? 你这吐槽是显本事来了? 自己写个 pq 提交过去证明一下自己
|
100
DOLLOR 2017-12-21 10:03:14 +08:00
我以为喷的是一个库,然后以为喷的是 JS 生态圈,再后来以为喷的是 JS,直到再看最后附言就懂了,原来是 JS 和生态圈一起喷……
|