WEBVTT

1
00:00:05.320 --> 00:00:09.320
<v Speaker 1>Hey, folks, welcome back to another episode of JavaScript Jabber.

2
00:00:09.679 --> 00:00:11.359
<v Speaker 2>This week, on our panel, we have.

3
00:00:11.359 --> 00:00:15.000
<v Speaker 3>Dan Spear Hello from Tel Aviv, and.

4
00:00:14.919 --> 00:00:19.239
<v Speaker 1>I'm Charles Maxwo from top Endevs. This week, we're gonna

5
00:00:19.239 --> 00:00:21.920
<v Speaker 1>be talking about what's new in JavaScript. It's a new year.

6
00:00:22.160 --> 00:00:25.320
<v Speaker 1>There's a bunch of stuff that came out last year

7
00:00:25.440 --> 00:00:28.960
<v Speaker 1>or so, and so Dan was pointing them out to me,

8
00:00:29.480 --> 00:00:32.119
<v Speaker 1>and that's what we're gonna talk about today. So, Dan,

9
00:00:32.320 --> 00:00:34.759
<v Speaker 1>I know you have a list. I don't have the

10
00:00:34.799 --> 00:00:35.799
<v Speaker 1>list in front of me, so I.

11
00:00:35.759 --> 00:00:36.640
<v Speaker 2>Will let you just.

12
00:00:38.240 --> 00:00:44.159
<v Speaker 1>Yeah, I'll let you steer the ship and I'll.

13
00:00:42.759 --> 00:00:44.000
<v Speaker 2>Provide the color commentary.

14
00:00:45.079 --> 00:00:48.119
<v Speaker 3>Yeah. So it's been a while since we've spoken about

15
00:00:48.119 --> 00:00:51.079
<v Speaker 3>what's new in JavaScript. You know, everybody's talking about what's

16
00:00:51.119 --> 00:00:55.320
<v Speaker 3>new in frameworks, what's new in CSS, what's new in HDMO.

17
00:00:56.039 --> 00:00:59.840
<v Speaker 3>But the JavaScript, you know, there was this period of

18
00:01:00.079 --> 00:01:03.159
<v Speaker 3>time where things are coming out, you know, fast and furious,

19
00:01:03.679 --> 00:01:06.000
<v Speaker 3>and then it seemed like everything kind of settled down.

20
00:01:06.760 --> 00:01:10.280
<v Speaker 3>But turns out that you know, new features are being introduced.

21
00:01:10.799 --> 00:01:12.879
<v Speaker 3>So I thought it would be worthwhile to talk about it.

22
00:01:13.359 --> 00:01:16.519
<v Speaker 3>We actually spoke about it a year and a half

23
00:01:16.599 --> 00:01:19.799
<v Speaker 3>ago in episode of five ninety and it's interesting to

24
00:01:19.920 --> 00:01:27.280
<v Speaker 3>contrast what has moved forward and what hasn't. So, first

25
00:01:27.280 --> 00:01:30.439
<v Speaker 3>of all, for our listeners, for anybody who may not know,

26
00:01:31.159 --> 00:01:35.120
<v Speaker 3>there's this thing which is the JavaScript standard but is

27
00:01:35.159 --> 00:01:41.120
<v Speaker 3>not actually called JavaScript. It's called ekmascript instead, which Brendan Iike,

28
00:01:41.159 --> 00:01:44.200
<v Speaker 3>the creator of JavaScript, has likened to a skin disease.

29
00:01:47.439 --> 00:01:50.000
<v Speaker 2>It's really easy to remember too. I mean, EKMA script

30
00:01:50.079 --> 00:01:50.799
<v Speaker 2>just rolled.

31
00:01:51.359 --> 00:01:55.079
<v Speaker 3>Roll yeah, rolls off the tongue. EKMA is actually the

32
00:01:55.200 --> 00:01:59.560
<v Speaker 3>EKMA International is a standards organization. It was originally the

33
00:01:59.599 --> 00:02:04.239
<v Speaker 3>europe In Computer Manufacturers Association, but then they just decided

34
00:02:04.280 --> 00:02:07.799
<v Speaker 3>that it's EKMA and you know, not the credentials anymore.

35
00:02:09.719 --> 00:02:15.560
<v Speaker 3>But so why is this standard called ekmascript rather than JavaScript?

36
00:02:15.639 --> 00:02:18.240
<v Speaker 3>I mean, the fact that it happens to be handled

37
00:02:18.240 --> 00:02:21.639
<v Speaker 3>by the ATMA organization should not have changed the name

38
00:02:21.680 --> 00:02:24.080
<v Speaker 3>of the language, or at least the standard of the language.

39
00:02:24.560 --> 00:02:29.319
<v Speaker 3>And the reason is that they don't have the copyright

40
00:02:29.560 --> 00:02:31.080
<v Speaker 3>to the JavaScript name.

41
00:02:32.319 --> 00:02:34.879
<v Speaker 2>That called trademark technically, but yes.

42
00:02:35.039 --> 00:02:42.599
<v Speaker 3>Yeah, it's a trademark and it's being held by Oracle exactly.

43
00:02:43.159 --> 00:02:45.840
<v Speaker 3>The name escaped me all of a sudden, and it's

44
00:02:45.879 --> 00:02:49.759
<v Speaker 3>a funny story. Because in case you know listeners don't know,

45
00:02:49.840 --> 00:02:54.199
<v Speaker 3>they probably don't. JavaScript was created in by Brendan Ike

46
00:02:54.280 --> 00:02:57.240
<v Speaker 3>in Ten Days of Glory back in nineteen ninety five

47
00:02:57.520 --> 00:03:01.000
<v Speaker 3>while he was working at Netscape. They were working in

48
00:03:01.120 --> 00:03:07.319
<v Speaker 3>corporation with Sun, which was this the creators of Java,

49
00:03:08.639 --> 00:03:12.680
<v Speaker 3>and they they had this kind of corporation where JavaScript

50
00:03:12.719 --> 00:03:15.080
<v Speaker 3>was supposed to be the scripting language in the browser

51
00:03:15.599 --> 00:03:18.879
<v Speaker 3>and Java was supposed to be the actual heavy duty

52
00:03:18.919 --> 00:03:22.879
<v Speaker 3>programming language in the browser. That didn't happen. But what

53
00:03:23.080 --> 00:03:27.680
<v Speaker 3>did happen was that Son ended up with the JavaScript trademark,

54
00:03:28.639 --> 00:03:29.479
<v Speaker 3>and then.

55
00:03:29.360 --> 00:03:31.039
<v Speaker 2>Because they owned the trademark to Java.

56
00:03:32.000 --> 00:03:34.360
<v Speaker 3>To be honest, I'm not sure either because of that

57
00:03:34.639 --> 00:03:36.879
<v Speaker 3>or because that was part of the deal of their

58
00:03:36.960 --> 00:03:41.560
<v Speaker 3>corporation with the Netscape. Either way, they ended up with

59
00:03:41.639 --> 00:03:45.039
<v Speaker 3>a trademark, and then they were bought by Oracle. So

60
00:03:45.120 --> 00:03:48.400
<v Speaker 3>now Oracle holds that trademark and they've literally done nothing

61
00:03:48.479 --> 00:03:52.520
<v Speaker 3>with it. So there's this new movement now to actually

62
00:03:52.919 --> 00:03:57.039
<v Speaker 3>free that trademark from Oracle. They've actually reached out to Oracle,

63
00:03:57.199 --> 00:04:02.080
<v Speaker 3>They've reached out to the governmental body that's responsible for trademarks.

64
00:04:02.120 --> 00:04:06.800
<v Speaker 3>There's an online petition that everybody can sign at JavaScript

65
00:04:06.879 --> 00:04:11.800
<v Speaker 3>dot tm fitting url. I signed it, and I encourage

66
00:04:11.800 --> 00:04:16.399
<v Speaker 3>our listeners to sign it, and hopefully eventually it will

67
00:04:16.399 --> 00:04:21.519
<v Speaker 3>be released. This is actually being led by Ryan Dahl

68
00:04:21.639 --> 00:04:25.240
<v Speaker 3>from Dino, who we've interviewed a few months back. So

69
00:04:25.319 --> 00:04:28.279
<v Speaker 3>he wrote an interesting blog post about it. We can

70
00:04:28.319 --> 00:04:30.839
<v Speaker 3>link to it. He gives the entire history and everything.

71
00:04:31.720 --> 00:04:35.000
<v Speaker 3>I hope it's released and we can finally call it

72
00:04:35.360 --> 00:04:39.519
<v Speaker 3>JavaScript rather than ekmascript. But be that as it may.

73
00:04:39.800 --> 00:04:43.519
<v Speaker 3>That's the name of the standard and it's being handled

74
00:04:43.800 --> 00:04:47.600
<v Speaker 3>by a committee within EKMA called TC thirty nine.

75
00:04:49.319 --> 00:04:52.560
<v Speaker 1>And TC I was gonna say, if you're wondering what

76
00:04:52.680 --> 00:04:56.480
<v Speaker 1>the cryptic name, TC thirty nine is literally technical committee

77
00:04:56.519 --> 00:04:57.079
<v Speaker 1>or something like.

78
00:04:57.040 --> 00:05:01.079
<v Speaker 3>That, exactly, it's Technical Committee thirty nine. Their whole bunch

79
00:05:01.120 --> 00:05:03.879
<v Speaker 3>of technical committees within EKMA, and that's the number they

80
00:05:03.879 --> 00:05:08.800
<v Speaker 3>got and they have this whole process of how to

81
00:05:08.920 --> 00:05:16.040
<v Speaker 3>introduce features into the JavaScript language. Originally this process had

82
00:05:16.439 --> 00:05:21.519
<v Speaker 3>forced five stages sorry, zero through four, because well, you know,

83
00:05:21.600 --> 00:05:27.040
<v Speaker 3>everything should be zero based. But now they've actually added

84
00:05:27.199 --> 00:05:31.439
<v Speaker 3>an intrim stage two point seven, so now they have

85
00:05:31.959 --> 00:05:36.759
<v Speaker 3>six stages and to run through them really quickly. Stage

86
00:05:36.959 --> 00:05:40.800
<v Speaker 3>zero is basically it's a new proposal, it's not even

87
00:05:40.879 --> 00:05:45.160
<v Speaker 3>really considered. Basically, you've had an idea and you've written

88
00:05:45.240 --> 00:05:48.079
<v Speaker 3>down a note about it and sent it to the committee.

89
00:05:48.199 --> 00:05:52.199
<v Speaker 3>That's more or less what stage zero means. It's hardly anything, really,

90
00:05:52.680 --> 00:05:59.040
<v Speaker 3>but it's the starting point for all proposals in that

91
00:05:59.240 --> 00:06:03.759
<v Speaker 3>are process by the committee. When the Committee decides to

92
00:06:03.839 --> 00:06:08.279
<v Speaker 3>actually look at a particular proposal, it moves to stage one.

93
00:06:09.199 --> 00:06:13.480
<v Speaker 3>That means that that proposal is under consideration. The committee

94
00:06:13.480 --> 00:06:17.680
<v Speaker 3>expects to devote time examining and identifying the need for

95
00:06:17.759 --> 00:06:21.959
<v Speaker 3>that proposal, what it's supposed to address or improve or fix,

96
00:06:23.439 --> 00:06:28.600
<v Speaker 3>and basically compare it to other alternative solutions that might exist,

97
00:06:29.399 --> 00:06:33.480
<v Speaker 3>and decide whether it's worthwhile to pursue. They need to

98
00:06:33.519 --> 00:06:39.759
<v Speaker 3>identify somebody to champion that proposal. They expect an outline

99
00:06:39.839 --> 00:06:45.160
<v Speaker 3>to be written and so and discuss algorithms and abstractions

100
00:06:45.240 --> 00:06:48.639
<v Speaker 3>and semantics and so forth, all the good stuff. So

101
00:06:48.720 --> 00:06:54.000
<v Speaker 3>that's stage one. Stage two is when the committee has

102
00:06:54.079 --> 00:06:59.839
<v Speaker 3>chosen a preferred solution or maybe a few solutions in

103
00:06:59.879 --> 00:07:04.079
<v Speaker 3>a in a particular solution space, but the design is

104
00:07:04.240 --> 00:07:08.560
<v Speaker 3>very much still a draft and may change significantly before

105
00:07:08.600 --> 00:07:14.480
<v Speaker 3>it's actually introduced into the language. The committee actually expects

106
00:07:15.160 --> 00:07:18.519
<v Speaker 3>something to be developed and eventually introduced into the language.

107
00:07:18.519 --> 00:07:22.720
<v Speaker 3>They're just not absolutely sure what it is yet and

108
00:07:22.879 --> 00:07:27.079
<v Speaker 3>how exactly it's going to look. And at that point

109
00:07:27.120 --> 00:07:30.480
<v Speaker 3>they expect, obviously the thing to be much better documented

110
00:07:32.040 --> 00:07:35.680
<v Speaker 3>and you know, for people to start experimenting with it

111
00:07:35.720 --> 00:07:42.759
<v Speaker 3>and actually have something real to examine. Now, they've introduced

112
00:07:42.759 --> 00:07:46.920
<v Speaker 3>a new stage called two point seven because they didn't

113
00:07:46.920 --> 00:07:49.439
<v Speaker 3>want to move stage two or stage three, and they

114
00:07:49.519 --> 00:07:53.000
<v Speaker 3>wanted to put something in between. So stage two point

115
00:07:53.040 --> 00:07:56.839
<v Speaker 3>seven means that the proposal is approved in principle and

116
00:07:57.000 --> 00:08:03.000
<v Speaker 3>is currently undergoing validation. That means that maybe a browser

117
00:08:03.040 --> 00:08:07.160
<v Speaker 3>manufacturer has put it behind a feature flag, or maybe

118
00:08:07.240 --> 00:08:11.319
<v Speaker 3>there's a Babel plug in or something like. Somebody is

119
00:08:11.360 --> 00:08:15.800
<v Speaker 3>playing with it, experimenting it and with it, and you

120
00:08:15.839 --> 00:08:19.199
<v Speaker 3>can start seeing how it actually works and whether it

121
00:08:19.240 --> 00:08:25.439
<v Speaker 3>actually feels like a good idea. Stage three is when

122
00:08:25.639 --> 00:08:30.279
<v Speaker 3>the proposal has been recommended for implementation and no changes

123
00:08:30.319 --> 00:08:33.600
<v Speaker 3>to the proposal are expected. In other words, they feel

124
00:08:33.639 --> 00:08:36.679
<v Speaker 3>pretty confident that this is how it's going to be,

125
00:08:37.279 --> 00:08:41.279
<v Speaker 3>but it's not yet part of the standard, and therefore

126
00:08:41.799 --> 00:08:45.639
<v Speaker 3>backward compatibility is not yet required, which means that if

127
00:08:45.960 --> 00:08:49.200
<v Speaker 3>somebody comes up with a better idea, or they they

128
00:08:49.200 --> 00:08:52.639
<v Speaker 3>start suddenly discover a problem with it, they can battrack

129
00:08:52.919 --> 00:08:55.600
<v Speaker 3>so they can even you know, move it back to

130
00:08:56.159 --> 00:08:58.639
<v Speaker 3>a stage two or even to or two point seven

131
00:08:58.799 --> 00:09:04.200
<v Speaker 3>something like that. And finally you've got stage four, which

132
00:09:04.240 --> 00:09:08.159
<v Speaker 3>means that the proposal is feature complete and is ready

133
00:09:08.159 --> 00:09:10.759
<v Speaker 3>to be included in the standard. Essentially, it means that

134
00:09:10.840 --> 00:09:13.519
<v Speaker 3>it's effectively part of the standard. It's just that a

135
00:09:13.600 --> 00:09:16.799
<v Speaker 3>new standard document has not yet been released. One is

136
00:09:16.879 --> 00:09:22.200
<v Speaker 3>released once a year, So the proposals that are complete

137
00:09:22.320 --> 00:09:25.799
<v Speaker 3>weight at stage four until they are included in the

138
00:09:25.799 --> 00:09:30.240
<v Speaker 3>next release standard. And usually by the time they're in

139
00:09:30.360 --> 00:09:36.159
<v Speaker 3>stage four, you actually find them implemented in browsers and

140
00:09:36.200 --> 00:09:41.399
<v Speaker 3>you can actually start using them. So far, so good.

141
00:09:41.639 --> 00:09:44.600
<v Speaker 1>M Yeah, it's funny too, because you're talking about this

142
00:09:44.720 --> 00:09:47.440
<v Speaker 1>process and two things are going through my head, and

143
00:09:47.480 --> 00:09:52.799
<v Speaker 1>one is it sounds complicated, but yeah, I mean, if

144
00:09:52.799 --> 00:09:55.960
<v Speaker 1>you really think about the progression, it all makes sense.

145
00:09:56.279 --> 00:09:56.559
<v Speaker 2>Right.

146
00:09:58.879 --> 00:10:02.720
<v Speaker 1>The other thing that's going through my head is we're

147
00:10:02.759 --> 00:10:06.399
<v Speaker 1>currently heading into a legislative session in the state of Utah,

148
00:10:06.759 --> 00:10:09.919
<v Speaker 1>and so I've been going through the process that bills

149
00:10:09.960 --> 00:10:13.279
<v Speaker 1>go through the past and they're going, I'm going, Wow,

150
00:10:13.440 --> 00:10:16.799
<v Speaker 1>this is in some way simpler and in some ways

151
00:10:17.759 --> 00:10:20.919
<v Speaker 1>more complicated than the political process.

152
00:10:21.600 --> 00:10:24.480
<v Speaker 3>In certain ways, it has to be, because unlike the

153
00:10:24.519 --> 00:10:29.440
<v Speaker 3>political process, these kind of standards are really set in stone.

154
00:10:29.480 --> 00:10:33.399
<v Speaker 3>When something is added into JavaScript, it can never really

155
00:10:33.480 --> 00:10:37.000
<v Speaker 3>be removed. Yeah, which means that we had better be

156
00:10:37.240 --> 00:10:42.440
<v Speaker 3>really certain about adding it into the standard. And you've got,

157
00:10:42.919 --> 00:10:48.000
<v Speaker 3>like I said, you've got the browser manufacturers on this committee,

158
00:10:48.000 --> 00:10:50.720
<v Speaker 3>and they've got to really approve it and say, you know,

159
00:10:51.240 --> 00:10:53.720
<v Speaker 3>this is something that we can actually implement. You know,

160
00:10:53.840 --> 00:10:58.159
<v Speaker 3>somebody might have this great idea, but implementing it would

161
00:10:58.200 --> 00:11:03.120
<v Speaker 3>turn JavaScript on its head. Then obviously the browser manufacturers

162
00:11:03.159 --> 00:11:05.240
<v Speaker 3>will push back and won't approve it.

163
00:11:06.720 --> 00:11:06.960
<v Speaker 2>Yep.

164
00:11:09.159 --> 00:11:12.840
<v Speaker 3>So let's put it this way. The attitude is better

165
00:11:12.879 --> 00:11:16.480
<v Speaker 3>safe than sorry, and that's a good attitude to have

166
00:11:16.600 --> 00:11:20.679
<v Speaker 3>in the context of language standard, especially a languagelike JavaScript.

167
00:11:20.919 --> 00:11:24.240
<v Speaker 3>Where As I said, once something is added, it can

168
00:11:24.240 --> 00:11:25.519
<v Speaker 3>never be removed.

169
00:11:26.759 --> 00:11:30.200
<v Speaker 2>I really wish that our legislators would do better safe

170
00:11:30.240 --> 00:11:33.960
<v Speaker 2>than sorry. Let's think a little more deeply about this

171
00:11:34.000 --> 00:11:35.960
<v Speaker 2>before we pass it or not? Right?

172
00:11:36.080 --> 00:11:40.080
<v Speaker 1>Yeah, but yeah, I completely agree, and I think it's

173
00:11:40.159 --> 00:11:44.279
<v Speaker 1>good context that JavaScript has always gone way out of

174
00:11:44.320 --> 00:11:48.559
<v Speaker 1>its way to be backward compatible. I'm sure there's sometimes

175
00:11:48.559 --> 00:11:50.600
<v Speaker 1>where there was just something that they had to kind

176
00:11:50.600 --> 00:11:52.600
<v Speaker 1>of roll back, but.

177
00:11:53.480 --> 00:11:57.440
<v Speaker 3>Actually, the one time that I can think of where

178
00:11:57.480 --> 00:12:01.960
<v Speaker 3>effectively things were rolled back was they introduced strict mode.

179
00:12:02.120 --> 00:12:05.440
<v Speaker 3>And even then they introduce they roll them back by

180
00:12:05.600 --> 00:12:10.639
<v Speaker 3>introducing strict mode, So if you're running outside strict mode,

181
00:12:10.639 --> 00:12:13.600
<v Speaker 3>they're still there. They wanted to roll back, for example,

182
00:12:13.639 --> 00:12:16.440
<v Speaker 3>the with keyword, and I won't get into the details

183
00:12:16.440 --> 00:12:19.519
<v Speaker 3>of why it turned out to be a bad idea

184
00:12:19.600 --> 00:12:23.799
<v Speaker 3>in the context of the JavaScript programming language, but they

185
00:12:23.799 --> 00:12:29.360
<v Speaker 3>couldn't remove it, and so instead they kind of rolled

186
00:12:29.399 --> 00:12:33.639
<v Speaker 3>it back by making strict mode more and more the

187
00:12:33.759 --> 00:12:37.799
<v Speaker 3>common way in which JavaScript work and in strict mode

188
00:12:38.080 --> 00:12:40.320
<v Speaker 3>with does not exist. Right.

189
00:12:42.279 --> 00:12:44.840
<v Speaker 1>Yeah, And if you're wondering, if you're if you're newer

190
00:12:44.879 --> 00:12:47.480
<v Speaker 1>to javascripts and you're saying, what what what is strict mode,

191
00:12:47.799 --> 00:12:48.759
<v Speaker 1>don't worry about it.

192
00:12:49.120 --> 00:12:50.320
<v Speaker 2>You're using strict mode.

193
00:12:51.279 --> 00:12:55.279
<v Speaker 3>Yeah, just so you know, you know, we mentioned it,

194
00:12:55.320 --> 00:12:58.960
<v Speaker 3>so we might as well provide details. You can explicitly

195
00:12:59.159 --> 00:13:04.159
<v Speaker 3>enter strict mode by having the use strict string at

196
00:13:04.240 --> 00:13:06.320
<v Speaker 3>the top of a scope or the top of a file.

197
00:13:07.039 --> 00:13:10.120
<v Speaker 3>You can't actually ever exit strict mode. You only enter

198
00:13:10.159 --> 00:13:15.080
<v Speaker 3>strict mode. And you enter strict mode by default in

199
00:13:15.799 --> 00:13:20.480
<v Speaker 3>ekmascript modules. So if you implement a module, it's strict

200
00:13:20.559 --> 00:13:24.679
<v Speaker 3>mode by definition. In HTML, that's if you have a

201
00:13:24.879 --> 00:13:30.080
<v Speaker 3>script tagged with the type equals module, it's strict mode

202
00:13:30.080 --> 00:13:32.200
<v Speaker 3>by default, and then you can do module things like

203
00:13:32.279 --> 00:13:35.639
<v Speaker 3>imports and stuff like that. You also strict mode by

204
00:13:35.679 --> 00:13:39.679
<v Speaker 3>default in classes, because again, classes are kind of a

205
00:13:39.720 --> 00:13:42.039
<v Speaker 3>new type of a scope, and it makes sense to

206
00:13:42.080 --> 00:13:44.080
<v Speaker 3>be strict by default inside classes.

207
00:13:45.080 --> 00:13:45.360
<v Speaker 2>Yeah.

208
00:13:45.440 --> 00:13:49.200
<v Speaker 1>I think most people working within the context of JavaScript, though,

209
00:13:49.679 --> 00:13:52.080
<v Speaker 1>they're working under some system that puts them in strict

210
00:13:52.080 --> 00:13:53.200
<v Speaker 1>mode without them.

211
00:13:53.399 --> 00:13:58.200
<v Speaker 3>Yeah, because they're building hopefully they're building ekmascript modules these.

212
00:13:58.159 --> 00:14:03.240
<v Speaker 1>Days, yeah, or React projects or you know, whatever other

213
00:14:03.399 --> 00:14:07.039
<v Speaker 1>framework or library you're using, generally use modules, and so

214
00:14:07.120 --> 00:14:09.200
<v Speaker 1>you're generally put into this box anyway.

215
00:14:10.639 --> 00:14:14.879
<v Speaker 3>And I really can't think of any other occurrence where

216
00:14:15.200 --> 00:14:20.320
<v Speaker 3>something was effectively removed out of JavaScript, so you know,

217
00:14:20.600 --> 00:14:26.120
<v Speaker 3>it's interesting. Yeah, anyway, So let's talk about a couple

218
00:14:26.159 --> 00:14:29.919
<v Speaker 3>of these enhancements and proposals. But before we dive into them,

219
00:14:30.200 --> 00:14:33.480
<v Speaker 3>it's really worthwhile to highlight the fact that none of

220
00:14:33.480 --> 00:14:38.480
<v Speaker 3>them really significantly or maybe even at all, change the

221
00:14:38.559 --> 00:14:42.840
<v Speaker 3>JavaScript syntax or semantics. So you've got nothing new like

222
00:14:43.440 --> 00:14:49.000
<v Speaker 3>the arrow functions syntax or let or cons or stuff

223
00:14:49.039 --> 00:14:52.279
<v Speaker 3>like that which really changed the way that JavaScript kind

224
00:14:52.320 --> 00:14:56.679
<v Speaker 3>of worked. Well, there is one towards the end, but

225
00:14:56.840 --> 00:15:01.120
<v Speaker 3>it's still at stage three, and we'll see if we

226
00:15:01.600 --> 00:15:04.559
<v Speaker 3>make it all the way to that one. But all

227
00:15:04.600 --> 00:15:07.919
<v Speaker 3>the rest can are better described as being part of

228
00:15:07.960 --> 00:15:12.919
<v Speaker 3>a quote unquote JavaScript standard library. They've added new object

229
00:15:12.960 --> 00:15:21.519
<v Speaker 3>types and new methods or functions that are built in

230
00:15:21.960 --> 00:15:25.519
<v Speaker 3>that you can use instead of let's say, importing some

231
00:15:25.720 --> 00:15:31.919
<v Speaker 3>NPM module that would implement them. So we've got more

232
00:15:32.000 --> 00:15:36.559
<v Speaker 3>standard functionality being provided out of the box by the

233
00:15:36.639 --> 00:15:40.039
<v Speaker 3>JavaScript runtime environment itself, be it the browser or vi

234
00:15:40.080 --> 00:15:41.279
<v Speaker 3>it node or whatever.

235
00:15:42.639 --> 00:15:45.600
<v Speaker 1>Yeah, so what I'm hearing is is that if you're

236
00:15:45.720 --> 00:15:48.399
<v Speaker 1>using these feature, you may be already be using these features.

237
00:15:48.440 --> 00:15:52.360
<v Speaker 2>They're just now official standard kind of stuff.

238
00:15:53.200 --> 00:15:55.600
<v Speaker 3>Yeah, you might have there's a good chance that you

239
00:15:55.720 --> 00:15:59.639
<v Speaker 3>might have imported such functionality before. Now it's built in

240
00:15:59.679 --> 00:16:01.919
<v Speaker 3>and you do need to import it anymore. Kind of

241
00:16:02.039 --> 00:16:07.559
<v Speaker 3>like the browsers started providing fetch as a built in function,

242
00:16:07.840 --> 00:16:12.320
<v Speaker 3>and you didn't need something like an axios anymore. Ye.

243
00:16:14.600 --> 00:16:17.480
<v Speaker 3>So the first one I would like to mention is

244
00:16:17.639 --> 00:16:22.000
<v Speaker 3>something that's actually five years old. It's from ES twenty twenty,

245
00:16:22.879 --> 00:16:30.159
<v Speaker 3>and it's called promise dot all settled, and as its

246
00:16:30.279 --> 00:16:35.799
<v Speaker 3>name implies, it waits for all this provided promises to

247
00:16:35.879 --> 00:16:40.279
<v Speaker 3>be settled. Now, you know, it's very common when working

248
00:16:40.320 --> 00:16:43.799
<v Speaker 3>with promises to need to wait on a couple of

249
00:16:43.840 --> 00:16:50.960
<v Speaker 3>promises simultaneously, effectively in parallel. And when most developers need

250
00:16:51.000 --> 00:16:54.000
<v Speaker 3>to do that, I see most of them reaching out

251
00:16:54.120 --> 00:16:57.039
<v Speaker 3>for promise dot all and just using promise dot all.

252
00:16:58.519 --> 00:17:02.840
<v Speaker 3>But what they might have not considered is the fact

253
00:17:02.919 --> 00:17:07.440
<v Speaker 3>that promised dot all short circuits on a rejected promise.

254
00:17:07.720 --> 00:17:12.200
<v Speaker 3>So promise dot all receives an area of promises and

255
00:17:12.240 --> 00:17:15.200
<v Speaker 3>it waits in parallel on all of them. It returns

256
00:17:15.200 --> 00:17:19.279
<v Speaker 3>a promise that resolves when all the provided promises resolve.

257
00:17:19.960 --> 00:17:24.319
<v Speaker 3>But if even one of those promises reject, then the

258
00:17:24.400 --> 00:17:31.559
<v Speaker 3>return promise immediately rejects. And that may not be what

259
00:17:31.599 --> 00:17:35.519
<v Speaker 3>you're looking for. It may be, but it may not be.

260
00:17:36.279 --> 00:17:41.200
<v Speaker 3>Sometimes you actually want to wait on all the promises

261
00:17:41.240 --> 00:17:47.279
<v Speaker 3>provided until they are all of them either resolved or rejected.

262
00:17:47.319 --> 00:17:50.039
<v Speaker 3>In other words, all of them are settled, and hence

263
00:17:50.119 --> 00:17:52.200
<v Speaker 3>the name of the method, all settled.

264
00:17:53.119 --> 00:17:56.400
<v Speaker 1>Right, So let me see if I can restate this

265
00:17:56.640 --> 00:18:00.000
<v Speaker 1>in a different way. So, if you promised dot all, Yeah,

266
00:18:00.720 --> 00:18:02.599
<v Speaker 1>if one of them rejects, you get rejected.

267
00:18:03.319 --> 00:18:04.160
<v Speaker 2>I media doesn't.

268
00:18:04.440 --> 00:18:07.720
<v Speaker 1>Yeah, but it doesn't tell you that they've all finished

269
00:18:08.559 --> 00:18:11.079
<v Speaker 1>waiting for whatever it is that they're waiting for, And

270
00:18:11.119 --> 00:18:16.400
<v Speaker 1>so effectively the all settles it does more or less

271
00:18:16.400 --> 00:18:19.119
<v Speaker 1>the same thing. But if you have one of them

272
00:18:19.160 --> 00:18:23.359
<v Speaker 1>that's still waiting for whatever, you know, whether it's going

273
00:18:23.400 --> 00:18:25.400
<v Speaker 1>to reject or fulfill or anything else.

274
00:18:27.119 --> 00:18:29.799
<v Speaker 3>So think about the simple scenario. Let's say you have

275
00:18:29.920 --> 00:18:36.400
<v Speaker 3>two promises, sorry, let's say even three promises, and you

276
00:18:36.519 --> 00:18:39.359
<v Speaker 3>pass the area of the three promises into promise all.

277
00:18:39.880 --> 00:18:44.400
<v Speaker 3>Let's say the first one resolves, that's great, and then

278
00:18:45.279 --> 00:18:48.240
<v Speaker 3>the second, then the other two are still pending, and

279
00:18:48.319 --> 00:18:52.880
<v Speaker 3>then the second one rejects. Then it will immediately return

280
00:18:53.000 --> 00:18:56.000
<v Speaker 3>with a reject. It won't wait on the third one

281
00:18:56.200 --> 00:18:59.119
<v Speaker 3>to either resolve or reject, and it won't also tell

282
00:18:59.160 --> 00:19:03.079
<v Speaker 3>you that the first one resolved. It will just tell

283
00:19:03.119 --> 00:19:09.279
<v Speaker 3>you that, hey, this thing rejected, okay. Whereas with promise

284
00:19:09.400 --> 00:19:13.279
<v Speaker 3>all settled, what you get back is an area of objects.

285
00:19:13.519 --> 00:19:15.759
<v Speaker 3>First of all, it waits on all three, so even

286
00:19:15.799 --> 00:19:19.000
<v Speaker 3>if the second one rejected, it will still continue to

287
00:19:19.000 --> 00:19:22.599
<v Speaker 3>wait until the third one completes, and then it will

288
00:19:22.640 --> 00:19:29.880
<v Speaker 3>return an array of objects, and each object has a

289
00:19:29.960 --> 00:19:35.039
<v Speaker 3>field that indicates whether or not it resolved or rejected.

290
00:19:36.440 --> 00:19:42.200
<v Speaker 3>So I wanted to have this open, and I forgot.

291
00:19:43.559 --> 00:19:47.839
<v Speaker 3>I just posted a link to Yeah, MDN is always there. Yeah,

292
00:19:48.000 --> 00:19:51.359
<v Speaker 3>MDN is always the best. So it basically returns an

293
00:19:51.480 --> 00:19:56.359
<v Speaker 3>array of objects, one per each promise it had. Each

294
00:19:56.720 --> 00:19:59.519
<v Speaker 3>element of those rays is an object where and it

295
00:19:59.599 --> 00:20:02.960
<v Speaker 3>has a property called status, and that status could be

296
00:20:03.079 --> 00:20:08.440
<v Speaker 3>either fulfilled or rejected. It has it. If it's fulfilled,

297
00:20:08.519 --> 00:20:10.880
<v Speaker 3>then it will have a field called value with the

298
00:20:10.960 --> 00:20:14.759
<v Speaker 3>resolved value, and if it if it was rejected, it

299
00:20:14.799 --> 00:20:21.119
<v Speaker 3>would have a field called reason with the appropriate rejection reasons.

300
00:20:22.920 --> 00:20:25.359
<v Speaker 3>So this way you can look at all the promises

301
00:20:25.880 --> 00:20:29.000
<v Speaker 3>and see whether they resolved or rejected and what they

302
00:20:29.039 --> 00:20:32.799
<v Speaker 3>actually returned. And as I said, in a lot of cases,

303
00:20:33.119 --> 00:20:36.640
<v Speaker 3>that's actually what you want rather than just promised dot all.

304
00:20:37.160 --> 00:20:39.240
<v Speaker 3>But a lot of people are not familiar with it

305
00:20:39.359 --> 00:20:41.759
<v Speaker 3>and use promise dot all when they should have actually

306
00:20:41.880 --> 00:20:43.240
<v Speaker 3>used promise all settled.

307
00:20:44.079 --> 00:20:47.400
<v Speaker 1>So MDN makes it look like because it calls promise

308
00:20:47.480 --> 00:20:50.240
<v Speaker 1>dot all settled, you pass in the array and then

309
00:20:50.279 --> 00:20:53.279
<v Speaker 1>it calls dot then so does it operate as a

310
00:20:53.319 --> 00:20:54.160
<v Speaker 1>promise as well?

311
00:20:54.559 --> 00:20:58.559
<v Speaker 3>Yeah, yeah, it returns a promise that resolves to that

312
00:20:58.839 --> 00:20:59.759
<v Speaker 3>array of objects.

313
00:20:59.839 --> 00:21:03.799
<v Speaker 1>Right, Yeah, I just wanted to, you know, clarify because

314
00:21:04.839 --> 00:21:08.400
<v Speaker 1>you said it returns that, but it does. It's a

315
00:21:08.480 --> 00:21:13.000
<v Speaker 1>promise that resolves to that array of so it has

316
00:21:13.039 --> 00:21:15.640
<v Speaker 1>to wait for everything to finish exactly.

317
00:21:18.240 --> 00:21:18.799
<v Speaker 2>That's cool.

318
00:21:19.359 --> 00:21:22.359
<v Speaker 1>So I'm going to ask another question that's not about

319
00:21:22.640 --> 00:21:26.240
<v Speaker 1>all settled. But you said this is from five years ago.

320
00:21:26.400 --> 00:21:29.960
<v Speaker 1>So when you say that we're talking about new things

321
00:21:29.960 --> 00:21:34.759
<v Speaker 1>in JavaScript, are these things that are now generally implemented

322
00:21:35.240 --> 00:21:38.000
<v Speaker 1>or are these just things that, hey, these have passed

323
00:21:38.000 --> 00:21:40.799
<v Speaker 1>in the last however long and people ought to know

324
00:21:40.839 --> 00:21:44.960
<v Speaker 1>about them, or what's your criteria for making the list?

325
00:21:45.400 --> 00:21:48.720
<v Speaker 3>Well, first of all, this is the oldest one. Everything

326
00:21:48.759 --> 00:21:50.759
<v Speaker 3>else that I'm going to be talking about is newer

327
00:21:50.759 --> 00:21:57.279
<v Speaker 3>than that, And I guess my criteria was relatively new

328
00:21:57.359 --> 00:22:02.440
<v Speaker 3>things that our listeners might thought known about. Now I

329
00:22:02.480 --> 00:22:04.960
<v Speaker 3>think that things that are actually already part of the

330
00:22:05.000 --> 00:22:10.200
<v Speaker 3>standard are generally much more interesting that things that are

331
00:22:10.440 --> 00:22:12.279
<v Speaker 3>not yet part of the standard. I mean, you know,

332
00:22:12.440 --> 00:22:15.319
<v Speaker 3>things that are not part of the standard might be

333
00:22:15.440 --> 00:22:19.960
<v Speaker 3>really cool. Usually they often push the envelope a lot more,

334
00:22:20.039 --> 00:22:22.400
<v Speaker 3>which is one of the reasons that the committee is

335
00:22:22.440 --> 00:22:26.200
<v Speaker 3>kind of hesitant about adding them actually into the language.

336
00:22:26.480 --> 00:22:29.079
<v Speaker 3>But I think that when you've got a functionality that

337
00:22:29.240 --> 00:22:35.400
<v Speaker 3>can actually be used and provides real value, that's more pertinent,

338
00:22:35.640 --> 00:22:38.559
<v Speaker 3>let's say, than some pie in the sky that might

339
00:22:38.680 --> 00:22:39.680
<v Speaker 3>never actually arrive.

340
00:22:40.519 --> 00:22:45.400
<v Speaker 1>Right, So these are probably just hidden gems that you

341
00:22:45.480 --> 00:22:48.119
<v Speaker 1>may not have known got added to the language.

342
00:22:48.079 --> 00:22:53.759
<v Speaker 3>Exactly over the last five years, I guess. The next

343
00:22:53.759 --> 00:22:59.160
<v Speaker 3>one is from ES twenty twenty two, so it's almost

344
00:22:59.240 --> 00:23:05.039
<v Speaker 3>three years old, and it's the dot at method on arrays,

345
00:23:05.240 --> 00:23:09.440
<v Speaker 3>strings and type rays, and you basically give it an

346
00:23:09.480 --> 00:23:13.079
<v Speaker 3>index and you get back the item. So it's really

347
00:23:13.160 --> 00:23:15.680
<v Speaker 3>like using the square brackets in a lot of ways.

348
00:23:15.799 --> 00:23:18.319
<v Speaker 3>And you might ask yourself, well, why do I need it,

349
00:23:18.359 --> 00:23:21.279
<v Speaker 3>Why don't I just use the square brackets, And the

350
00:23:21.480 --> 00:23:24.359
<v Speaker 3>reason is that you can also provide it with negative

351
00:23:24.480 --> 00:23:29.880
<v Speaker 3>numbers and then you're indexing from the end. So if

352
00:23:29.920 --> 00:23:32.839
<v Speaker 3>you do dot at on an array and pass in

353
00:23:32.920 --> 00:23:36.920
<v Speaker 3>minus one, you're looking at the last element in the array.

354
00:23:40.720 --> 00:23:41.279
<v Speaker 2>Interesting.

355
00:23:42.440 --> 00:23:47.119
<v Speaker 3>Now, that's actually how various other program earring languages actually work.

356
00:23:47.240 --> 00:23:50.240
<v Speaker 3>So in other programming languages you might have been able

357
00:23:50.279 --> 00:23:55.400
<v Speaker 3>to have the minus indexes in the square brackets themselves,

358
00:23:56.200 --> 00:24:00.400
<v Speaker 3>but you can't do that in JavaScript because that's not

359
00:24:00.559 --> 00:24:04.519
<v Speaker 3>how named properties work in JavaScript. And in JavaScript you

360
00:24:04.599 --> 00:24:09.640
<v Speaker 3>could legally legally have a minus one property. Uh, so

361
00:24:09.680 --> 00:24:13.920
<v Speaker 3>you couldn't use that. And the funny thing is that

362
00:24:14.079 --> 00:24:18.799
<v Speaker 3>this negative index has actually worked with the dot slice

363
00:24:18.839 --> 00:24:22.440
<v Speaker 3>method for a long time, but then it would always

364
00:24:22.440 --> 00:24:26.160
<v Speaker 3>return an array, right, And with dot at you get

365
00:24:26.279 --> 00:24:30.160
<v Speaker 3>that actual element from the array, which is just nice.

366
00:24:31.200 --> 00:24:34.240
<v Speaker 1>Yeah, I've used other languages that do this with their array,

367
00:24:34.400 --> 00:24:38.480
<v Speaker 1>so but they do it with the square brackets. And yeah,

368
00:24:38.720 --> 00:24:41.720
<v Speaker 1>you're you're explaining why you couldn't do that and maintain

369
00:24:41.759 --> 00:24:43.920
<v Speaker 1>backward compatibility with JavaScript.

370
00:24:44.519 --> 00:24:46.759
<v Speaker 2>But yeah, this is this is really cool. I like that.

371
00:24:48.920 --> 00:24:52.720
<v Speaker 3>Another one that's more of a you should use and

372
00:24:52.960 --> 00:24:58.319
<v Speaker 3>probably don't is object dot has owned. Are you familiar

373
00:24:58.359 --> 00:25:02.960
<v Speaker 3>with the has owned property? A method that so in

374
00:25:03.079 --> 00:25:08.319
<v Speaker 3>JavaScript you can use there's the inoperator which tells you

375
00:25:08.400 --> 00:25:11.440
<v Speaker 3>whether or not a property exists in an object. Objects

376
00:25:11.440 --> 00:25:15.240
<v Speaker 3>in javas kind of work like property bags, and you

377
00:25:15.319 --> 00:25:19.759
<v Speaker 3>can check to see whether a particular string is the

378
00:25:19.839 --> 00:25:23.000
<v Speaker 3>name of a property in an object using the inoperator,

379
00:25:23.640 --> 00:25:27.759
<v Speaker 3>But the inoperator also looks up the prototype chain, so

380
00:25:27.839 --> 00:25:28.559
<v Speaker 3>it doesn't.

381
00:25:28.200 --> 00:25:30.799
<v Speaker 2>Always say this, this is cool. I just looked it

382
00:25:30.880 --> 00:25:33.319
<v Speaker 2>up and I am yeah. Anyway, go ahead.

383
00:25:34.440 --> 00:25:38.160
<v Speaker 3>Now has owned property has existed forever as a way

384
00:25:38.200 --> 00:25:43.599
<v Speaker 3>to check whether a property name exists in an object

385
00:25:43.640 --> 00:25:47.920
<v Speaker 3>without going up the property chain. The problem with has

386
00:25:47.960 --> 00:25:52.720
<v Speaker 3>owned property is that not all objects necessarily have it,

387
00:25:53.359 --> 00:25:58.319
<v Speaker 3>because you need to have the object prototype in your

388
00:25:58.359 --> 00:26:02.359
<v Speaker 3>prototype chain to actually have it, and it's not there

389
00:26:02.359 --> 00:26:05.559
<v Speaker 3>by definition, so you might try to use his own

390
00:26:05.599 --> 00:26:09.880
<v Speaker 3>property only to have it break because you're not actually

391
00:26:09.880 --> 00:26:16.319
<v Speaker 3>your object doesn't actually derive from object prototype. So the

392
00:26:16.440 --> 00:26:20.960
<v Speaker 3>safer way is to do object dot has own as

393
00:26:21.039 --> 00:26:24.559
<v Speaker 3>this kind of a global method static method, and the

394
00:26:24.559 --> 00:26:27.440
<v Speaker 3>first parameter is the object you want to test, and

395
00:26:27.519 --> 00:26:29.920
<v Speaker 3>the second parameter is the name of the property you

396
00:26:29.960 --> 00:26:34.839
<v Speaker 3>want to check. So it's just a safer way. So

397
00:26:34.880 --> 00:26:38.400
<v Speaker 3>the preferred way to check whether or not a specific

398
00:26:38.519 --> 00:26:43.480
<v Speaker 3>object has a particular property is not using his own property,

399
00:26:43.519 --> 00:26:47.319
<v Speaker 3>which is what most of us do, but rather using

400
00:26:47.400 --> 00:26:51.599
<v Speaker 3>object dot has owned. Yet I've don't recall ever seeing

401
00:26:51.640 --> 00:26:53.920
<v Speaker 3>code actually work like that.

402
00:26:54.039 --> 00:26:58.640
<v Speaker 1>So right, So if you've this for example, could tell

403
00:26:58.680 --> 00:27:01.279
<v Speaker 1>you if you've over ridden a property.

404
00:27:01.519 --> 00:27:04.119
<v Speaker 2>Right, you've written your own function For.

405
00:27:04.480 --> 00:27:07.720
<v Speaker 3>A lot of people, Yeah, a lot of people use

406
00:27:08.240 --> 00:27:14.119
<v Speaker 3>JavaScript object objects as dictionaries. You know. Ideally I think

407
00:27:14.160 --> 00:27:18.759
<v Speaker 3>they should be using the map object type, but a

408
00:27:18.759 --> 00:27:22.559
<v Speaker 3>lot of people still like using simple objects because you know,

409
00:27:22.640 --> 00:27:25.720
<v Speaker 3>it's easy to confer to from Jason and so forth.

410
00:27:26.519 --> 00:27:28.880
<v Speaker 3>And you want to check whether, let's say, a certain

411
00:27:28.920 --> 00:27:33.079
<v Speaker 3>property exists in a Jason object or not, so you

412
00:27:33.200 --> 00:27:37.039
<v Speaker 3>might use check using has own property. You should actually

413
00:27:37.240 --> 00:27:39.400
<v Speaker 3>check whether or not it exists using hazone.

414
00:27:41.920 --> 00:27:42.319
<v Speaker 2>Gotcha.

415
00:27:45.359 --> 00:27:49.359
<v Speaker 3>So those are two things that were added almost three

416
00:27:49.440 --> 00:27:53.400
<v Speaker 3>years ago in EES twenty twenty two. Dot at an

417
00:27:53.440 --> 00:27:59.480
<v Speaker 3>object has owned relatively new. I guess mostly not so

418
00:27:59.599 --> 00:28:04.400
<v Speaker 3>much you used, but they're there and they're useful, and

419
00:28:04.680 --> 00:28:09.160
<v Speaker 3>I guess people should be using them more. Moving on,

420
00:28:09.680 --> 00:28:14.599
<v Speaker 3>Yes twenty twenty three. Here's a nice one that a

421
00:28:14.599 --> 00:28:18.720
<v Speaker 3>lot of people I think might like, and this is

422
00:28:19.880 --> 00:28:24.000
<v Speaker 3>find last on arrays. Sometimes you want to find the

423
00:28:24.119 --> 00:28:30.519
<v Speaker 3>last element matching a particular thing rather than the first. Now,

424
00:28:30.559 --> 00:28:34.920
<v Speaker 3>obviously you can do reverse and then find, but why

425
00:28:35.000 --> 00:28:38.079
<v Speaker 3>reverse the entire array when you can just do fine last.

426
00:28:41.559 --> 00:28:45.680
<v Speaker 2>Nice. It's funny because I'm I'm looking at the.

427
00:28:49.880 --> 00:28:51.480
<v Speaker 1>Oh, it does have fine last in here, but it

428
00:28:51.519 --> 00:28:54.480
<v Speaker 1>also had fine last index, of which I guess is

429
00:28:55.599 --> 00:28:56.759
<v Speaker 1>related but not the same.

430
00:28:56.839 --> 00:29:03.000
<v Speaker 3>Yeah, find and find last, return the actual value, find

431
00:29:03.079 --> 00:29:06.400
<v Speaker 3>index off, and find less index off. Return the index

432
00:29:06.559 --> 00:29:07.559
<v Speaker 3>of the found element.

433
00:29:08.400 --> 00:29:12.000
<v Speaker 1>Right, and this this finds a matching element, right, So

434
00:29:12.039 --> 00:29:14.839
<v Speaker 1>you can pass it a function and you can say

435
00:29:14.880 --> 00:29:17.640
<v Speaker 1>if this returns true on the element, then Yeah.

436
00:29:17.960 --> 00:29:20.000
<v Speaker 3>Let's say you want you have an area of numbers

437
00:29:20.039 --> 00:29:22.359
<v Speaker 3>and you want to find the first one bigger than

438
00:29:22.400 --> 00:29:25.920
<v Speaker 3>forty two. So you can pass in a function that

439
00:29:26.000 --> 00:29:29.799
<v Speaker 3>compares the x. You know, you would do x errow

440
00:29:30.000 --> 00:29:34.920
<v Speaker 3>x forty two, Yeah, exactly, and would find regular find

441
00:29:34.920 --> 00:29:37.279
<v Speaker 3>you would find the first element greater than forty two,

442
00:29:37.279 --> 00:29:39.759
<v Speaker 3>would find lass. You simply find the last item greater

443
00:29:39.839 --> 00:29:43.359
<v Speaker 3>than forty two. Yeah, And like I said, usually what

444
00:29:43.480 --> 00:29:45.799
<v Speaker 3>people would do is that they would reverse the array.

445
00:29:46.359 --> 00:29:49.000
<v Speaker 3>And it's kind of silly to need to reverse just

446
00:29:49.039 --> 00:29:55.240
<v Speaker 3>to find the last one, right. Speaking about reverse, the

447
00:29:55.240 --> 00:29:57.599
<v Speaker 3>next things that I wanted to mention that came out

448
00:29:57.640 --> 00:30:01.920
<v Speaker 3>in twenty twenty three are the change array by copy

449
00:30:03.480 --> 00:30:07.440
<v Speaker 3>again talking about things that were in JavaScript that are

450
00:30:07.640 --> 00:30:12.920
<v Speaker 3>a bit unfortunate but cannot be fixed because backward compatibility.

451
00:30:13.559 --> 00:30:18.519
<v Speaker 3>We have certain methods that modify arrays in place. So

452
00:30:18.559 --> 00:30:21.440
<v Speaker 3>for example, if you do dot reverse on an array,

453
00:30:22.440 --> 00:30:27.079
<v Speaker 3>it reverses the array in place. Likewise, if you do

454
00:30:27.079 --> 00:30:32.279
<v Speaker 3>dot sort, it sorts the array in place, and that's

455
00:30:32.359 --> 00:30:34.680
<v Speaker 3>not how we want to work in a more quote

456
00:30:34.759 --> 00:30:38.119
<v Speaker 3>unquote functional world. I guess they did it back in

457
00:30:38.680 --> 00:30:43.480
<v Speaker 3>ninety five because for efficiency's sake, to avoid the extra locations.

458
00:30:44.079 --> 00:30:47.839
<v Speaker 3>But you really, you know, it's you really want to

459
00:30:47.920 --> 00:30:53.839
<v Speaker 3>avoid methods that modify objects in place if you can,

460
00:30:54.119 --> 00:30:58.359
<v Speaker 3>if you can avoid it. So what they did is

461
00:30:58.400 --> 00:31:05.640
<v Speaker 3>they introduced an alternatives, well not an alternatives, alternatives to

462
00:31:05.799 --> 00:31:11.960
<v Speaker 3>these methods that create a copy. So instead of reverse,

463
00:31:12.559 --> 00:31:18.920
<v Speaker 3>there's this new dot too reversed, and to reverse does

464
00:31:18.960 --> 00:31:23.359
<v Speaker 3>not modify the original array. Instead it returns a new

465
00:31:23.519 --> 00:31:30.279
<v Speaker 3>array which is reversed. Likewise, you've got the dot two sorted,

466
00:31:31.039 --> 00:31:36.960
<v Speaker 3>which again sorts an array, but rather than sorting in place,

467
00:31:37.160 --> 00:31:45.240
<v Speaker 3>returns a new sorted copy. And you should be using these.

468
00:31:46.839 --> 00:31:50.039
<v Speaker 3>There's absolutely no reason. What I used to see are

469
00:31:50.119 --> 00:31:54.599
<v Speaker 3>people copying the array by doing a dot slice and

470
00:31:54.640 --> 00:31:57.799
<v Speaker 3>then doing a reverse on the copied array, And now

471
00:31:57.799 --> 00:32:02.200
<v Speaker 3>they can just do too reversed or too sorted. There's

472
00:32:02.279 --> 00:32:08.720
<v Speaker 3>also there's also a too spliced reminder splice. Unlike slice,

473
00:32:09.839 --> 00:32:12.839
<v Speaker 3>it can be used to replace, to delete parts of

474
00:32:12.880 --> 00:32:17.079
<v Speaker 3>an array and replace parts of an array. Too spliced

475
00:32:18.119 --> 00:32:21.880
<v Speaker 3>does that, but instead of modifying the original array again

476
00:32:22.039 --> 00:32:24.839
<v Speaker 3>returns a modified copy.

477
00:32:24.960 --> 00:32:27.640
<v Speaker 2>Yeah, there's also a two sorted.

478
00:32:28.640 --> 00:32:34.640
<v Speaker 3>Yeah, I mentioned already the two sorts and is Yeah. Yeah.

479
00:32:34.799 --> 00:32:37.519
<v Speaker 3>The dot with is confusing because it's kind of not

480
00:32:37.799 --> 00:32:41.480
<v Speaker 3>to something, So where did this come from? Dot with

481
00:32:42.039 --> 00:32:46.160
<v Speaker 3>is like dot at, but it modifies the copy, so

482
00:32:46.559 --> 00:32:49.960
<v Speaker 3>it modifies a particular item. You know. With dot at

483
00:32:50.039 --> 00:32:54.480
<v Speaker 3>you could change the value of a particular item. With

484
00:32:54.640 --> 00:32:57.119
<v Speaker 3>dot with, you give an index and a new value,

485
00:32:57.519 --> 00:33:01.000
<v Speaker 3>and it replaced, and it creates a copy where that

486
00:33:01.240 --> 00:33:07.359
<v Speaker 3>particular element you know, with that index has the new value.

487
00:33:09.119 --> 00:33:11.359
<v Speaker 3>So you might have an array let's say with one

488
00:33:11.400 --> 00:33:15.720
<v Speaker 3>two three, you do dot with one comma forty two,

489
00:33:16.480 --> 00:33:18.559
<v Speaker 3>so it will become one forty two three.

490
00:33:21.720 --> 00:33:24.839
<v Speaker 1>Yeah, and that I agree with you on this should

491
00:33:24.839 --> 00:33:31.440
<v Speaker 1>be your default way to move through arrays. I mean,

492
00:33:31.640 --> 00:33:33.839
<v Speaker 1>we we run into these problems all the time where

493
00:33:33.880 --> 00:33:37.519
<v Speaker 1>you inadvertently change something that you didn't intend to, and

494
00:33:37.599 --> 00:33:40.440
<v Speaker 1>so by doing things in this way, you'll avoid those

495
00:33:40.440 --> 00:33:43.880
<v Speaker 1>issues unless you explicitly want to be changing that for

496
00:33:44.039 --> 00:33:46.000
<v Speaker 1>a real good reason.

497
00:33:46.400 --> 00:33:50.960
<v Speaker 3>Exactly, and especially because in JavaScript, when you pass arrays

498
00:33:51.000 --> 00:33:56.559
<v Speaker 3>into functions or methods, you're passing the reference to the array, right,

499
00:33:56.799 --> 00:34:02.279
<v Speaker 3>so you're actually passing the reference to the original array.

500
00:34:02.400 --> 00:34:06.440
<v Speaker 3>And if that method then or function then calls dot

501
00:34:06.519 --> 00:34:09.639
<v Speaker 3>reverse on the array that was provided to it because

502
00:34:09.679 --> 00:34:13.920
<v Speaker 3>it needs a reverse copy for some reason. But use

503
00:34:14.000 --> 00:34:17.840
<v Speaker 3>reverse instead of two reversed. It not only modifies the

504
00:34:17.960 --> 00:34:21.960
<v Speaker 3>array for itself but also for whomever called it, which

505
00:34:22.039 --> 00:34:29.800
<v Speaker 3>is totally unexpected behavior in most cases. Yep. So yeah,

506
00:34:29.840 --> 00:34:33.719
<v Speaker 3>for sure going forward, always used two reversed instead of reverse,

507
00:34:33.840 --> 00:34:38.320
<v Speaker 3>two sorted instead of sorts too, spliced instead of splice,

508
00:34:38.400 --> 00:34:45.400
<v Speaker 3>and dot with whenever that makes sense. Continuing to move

509
00:34:45.480 --> 00:34:48.440
<v Speaker 3>up the calendar, where you know we are now in

510
00:34:48.480 --> 00:34:52.280
<v Speaker 3>twenty twenty five, let's look one year back twenty twenty four.

511
00:34:53.159 --> 00:34:57.960
<v Speaker 3>We also got a couple of things. We got top

512
00:34:58.039 --> 00:35:05.239
<v Speaker 3>level away and by top level. It means top level

513
00:35:05.360 --> 00:35:10.440
<v Speaker 3>of a module. So if you're creating an ECMAScript module,

514
00:35:11.320 --> 00:35:14.880
<v Speaker 3>you can have a weight outside of a function body.

515
00:35:15.239 --> 00:35:18.639
<v Speaker 3>In the past, you could only use a weights inside

516
00:35:18.679 --> 00:35:24.920
<v Speaker 3>a sink functions. Now you can actually use a weights

517
00:35:25.800 --> 00:35:31.760
<v Speaker 3>outside but at the global scope as it were, but

518
00:35:31.960 --> 00:35:38.360
<v Speaker 3>only inside modules. You might use it to maybe import

519
00:35:38.440 --> 00:35:41.400
<v Speaker 3>some sort of a dynamic mode, do some sort of

520
00:35:41.519 --> 00:35:46.119
<v Speaker 3>dynamic module import, or maybe get some configuration file or

521
00:35:46.159 --> 00:35:48.199
<v Speaker 3>something like that. So you might want to do a

522
00:35:48.239 --> 00:35:51.320
<v Speaker 3>fetch in order to get some configuration or something like that.

523
00:35:54.280 --> 00:35:57.360
<v Speaker 3>But you really need to be careful with top level

524
00:35:57.400 --> 00:36:02.960
<v Speaker 3>of weights because they block the module load. So if

525
00:36:03.000 --> 00:36:07.800
<v Speaker 3>you've got one module weight importing a submodule and that

526
00:36:08.000 --> 00:36:14.440
<v Speaker 3>submodule does a global a weight, then it blocks the

527
00:36:14.480 --> 00:36:22.079
<v Speaker 3>module that imports it until that promise resolves. Is that clear?

528
00:36:22.679 --> 00:36:23.079
<v Speaker 2>Mm hmm.

529
00:36:23.920 --> 00:36:24.119
<v Speaker 3>Yeah.

530
00:36:24.239 --> 00:36:29.039
<v Speaker 1>There's there's a really good example on the proposal itself,

531
00:36:29.079 --> 00:36:31.360
<v Speaker 1>and I posted a link to that the TC thirty

532
00:36:31.480 --> 00:36:36.800
<v Speaker 1>nine proposal, where essentially what they're doing is they're running

533
00:36:36.920 --> 00:36:43.119
<v Speaker 1>the A weight within a function. That's kind of the

534
00:36:43.239 --> 00:36:45.320
<v Speaker 1>So you create a function and then you call the

535
00:36:45.360 --> 00:36:48.480
<v Speaker 1>function is effectively what you're doing with the A weight

536
00:36:48.559 --> 00:36:51.440
<v Speaker 1>in it that's an acin function, and they've done it

537
00:36:51.480 --> 00:36:56.360
<v Speaker 1>with an immediately invoked acin function as well as just

538
00:36:57.800 --> 00:37:00.320
<v Speaker 1>a named function that they call that's an acing function.

539
00:37:00.880 --> 00:37:07.119
<v Speaker 2>But yeah, yeah, I can see where this could be

540
00:37:07.159 --> 00:37:10.079
<v Speaker 2>a foot gun or you can shoot yourself in the

541
00:37:10.079 --> 00:37:13.400
<v Speaker 2>foot doing this, for sure, But I can also see

542
00:37:13.400 --> 00:37:14.480
<v Speaker 2>the utility in it. Right.

543
00:37:14.519 --> 00:37:18.320
<v Speaker 1>It's like, in order for this module to do anything useful,

544
00:37:18.360 --> 00:37:19.760
<v Speaker 1>I have to have this other thing.

545
00:37:20.679 --> 00:37:24.119
<v Speaker 3>Yeah. Without this data, I can't do anything. Yeah, so

546
00:37:24.199 --> 00:37:27.719
<v Speaker 3>I really need to wait on that data before I

547
00:37:27.760 --> 00:37:32.960
<v Speaker 3>can actually even finish loading. Right, But again, you should

548
00:37:32.960 --> 00:37:37.119
<v Speaker 3>definitely be really careful about using top level of weight

549
00:37:37.199 --> 00:37:38.440
<v Speaker 3>inside your actual code.

550
00:37:39.599 --> 00:37:42.480
<v Speaker 2>Yeah, I definitely have a reason to be doing this.

551
00:37:45.119 --> 00:37:47.440
<v Speaker 3>The next ones I want to mention, and they're really

552
00:37:47.559 --> 00:37:50.039
<v Speaker 3>useful functions and have been available in a lot of

553
00:37:50.079 --> 00:37:53.719
<v Speaker 3>other languages and are provided by libraries like low dash

554
00:37:54.199 --> 00:37:57.760
<v Speaker 3>is object to dot group by and map dot group BI.

555
00:37:58.960 --> 00:38:02.519
<v Speaker 3>Let's start with object group by. With object dot group by,

556
00:38:02.840 --> 00:38:08.559
<v Speaker 3>you provide an array of stuff and the function that

557
00:38:09.199 --> 00:38:16.480
<v Speaker 3>you invoke it sorry on on a collection of items,

558
00:38:16.840 --> 00:38:22.679
<v Speaker 3>and you also provide a callback function which returns strings

559
00:38:22.760 --> 00:38:26.679
<v Speaker 3>that describe each item in the sequence, and then it

560
00:38:26.800 --> 00:38:32.239
<v Speaker 3>groups the items based on the string value. It's kind

561
00:38:32.280 --> 00:38:36.400
<v Speaker 3>of difficult to explain, but very often we want to

562
00:38:37.079 --> 00:38:41.800
<v Speaker 3>take a collection of stuff and group those things according

563
00:38:42.360 --> 00:38:45.880
<v Speaker 3>to what they are. So, for example, I've got I

564
00:38:46.000 --> 00:38:49.639
<v Speaker 3>might have like different types of different objects in an array,

565
00:38:50.280 --> 00:38:53.239
<v Speaker 3>and they also all of them have let's say a

566
00:38:53.280 --> 00:38:56.639
<v Speaker 3>different type which is a string. So I can group

567
00:38:56.679 --> 00:38:59.800
<v Speaker 3>them according to that the value of their type property

568
00:39:00.280 --> 00:39:06.320
<v Speaker 3>and have some return to one array of all the

569
00:39:06.360 --> 00:39:09.159
<v Speaker 3>objects of one type, another area of all the objects

570
00:39:09.199 --> 00:39:12.719
<v Speaker 3>of another type. It's instead of having to filter again

571
00:39:12.760 --> 00:39:15.400
<v Speaker 3>and again and again, I can do it in one go.

572
00:39:16.880 --> 00:39:19.239
<v Speaker 1>Yeah, this is something that I use pretty frequently in

573
00:39:19.280 --> 00:39:23.559
<v Speaker 1>other languages as well. But and there's a really good

574
00:39:23.599 --> 00:39:27.840
<v Speaker 1>example on the MDM doc that I just posted. But yeah,

575
00:39:27.880 --> 00:39:30.639
<v Speaker 1>I mean they give a list asparagus, bananas, goat, cherries,

576
00:39:30.639 --> 00:39:32.800
<v Speaker 1>and fish. They all have a type property of vegetable,

577
00:39:32.840 --> 00:39:35.480
<v Speaker 1>fruit or meat, and then it tells it to a

578
00:39:35.599 --> 00:39:38.880
<v Speaker 1>group by type essentially. And I'm not going to read

579
00:39:38.920 --> 00:39:41.000
<v Speaker 1>the syntax for you. You'll have to go look at

580
00:39:41.039 --> 00:39:43.639
<v Speaker 1>it because it's hard to just read out. But yeah,

581
00:39:43.679 --> 00:39:47.360
<v Speaker 1>then it gives back an object that has properties of vegetables, fruit,

582
00:39:47.400 --> 00:39:47.719
<v Speaker 1>and meat.

583
00:39:48.000 --> 00:39:50.280
<v Speaker 2>And it's shoved those objects up underneath that.

584
00:39:50.480 --> 00:39:54.320
<v Speaker 1>So it makes it really easy to, like you said,

585
00:39:54.519 --> 00:39:56.800
<v Speaker 1>not have to iterate over at a zillion times if

586
00:39:56.800 --> 00:40:00.079
<v Speaker 1>you're just sorting things or handling things based on on

587
00:40:00.119 --> 00:40:01.840
<v Speaker 1>their type exactly.

588
00:40:02.239 --> 00:40:05.880
<v Speaker 3>Now, the only difference really between object dot group by

589
00:40:06.119 --> 00:40:08.719
<v Speaker 3>and map dot group by is whether or not the

590
00:40:08.800 --> 00:40:13.400
<v Speaker 3>result is an object with the various fields or a

591
00:40:13.480 --> 00:40:17.199
<v Speaker 3>map with the various entries. Some people would prefer to

592
00:40:17.239 --> 00:40:19.440
<v Speaker 3>work with a map, some people would prefer to work

593
00:40:19.440 --> 00:40:21.800
<v Speaker 3>with an object, so they can use either object dot

594
00:40:21.800 --> 00:40:24.719
<v Speaker 3>group by or map dot group by, but the algorithm

595
00:40:24.760 --> 00:40:26.199
<v Speaker 3>is essentially exactly the same.

596
00:40:27.079 --> 00:40:33.400
<v Speaker 1>Yeah, it's interesting too because the so the on MDM

597
00:40:33.519 --> 00:40:38.519
<v Speaker 1>for map dot group by, it hands it an array

598
00:40:39.239 --> 00:40:41.400
<v Speaker 1>for the things that it's and it has the same

599
00:40:41.559 --> 00:40:44.719
<v Speaker 1>list of things actually is object dot group by, but

600
00:40:44.800 --> 00:40:47.199
<v Speaker 1>it hands it in an array for the thing that it's sorting,

601
00:40:47.239 --> 00:40:51.000
<v Speaker 1>and yeah, it just gives back a map instead.

602
00:40:51.920 --> 00:40:54.920
<v Speaker 2>So kind of interesting there.

603
00:40:56.840 --> 00:41:00.480
<v Speaker 3>Now. The final one that I want to mention is

604
00:41:00.599 --> 00:41:02.639
<v Speaker 3>one that's going to make a lot of our listeners

605
00:41:02.719 --> 00:41:06.760
<v Speaker 3>kind of grown because a lot of people have really

606
00:41:06.800 --> 00:41:09.920
<v Speaker 3>wanted something like that and have written a lot of

607
00:41:09.960 --> 00:41:16.360
<v Speaker 3>boilerplate code to effectively implement this functionality, and so it's

608
00:41:16.440 --> 00:41:18.400
<v Speaker 3>kind of nice to have it now built in out

609
00:41:18.400 --> 00:41:22.280
<v Speaker 3>of the box. But on the other hand, I'm kind

610
00:41:22.280 --> 00:41:26.719
<v Speaker 3>of worried that people will abuse it or misuse it.

611
00:41:26.719 --> 00:41:32.599
<v Speaker 3>It's promise dot with resolvers. When we create a promise,

612
00:41:33.599 --> 00:41:36.920
<v Speaker 3>only the promise can kind of resolve or reject itself.

613
00:41:37.199 --> 00:41:40.000
<v Speaker 3>So you do new promise, you pass in a function

614
00:41:40.679 --> 00:41:46.199
<v Speaker 3>to the constructor with the resolve and reject, and that

615
00:41:46.280 --> 00:41:51.159
<v Speaker 3>function and the promised constructor invokes that function, and only

616
00:41:51.239 --> 00:41:53.880
<v Speaker 3>that code has access to the resolve or reject. You

617
00:41:53.960 --> 00:41:58.280
<v Speaker 3>can't resolve or reject a function a promise sorry from

618
00:41:58.360 --> 00:42:03.360
<v Speaker 3>the outside. Now, what people do when they do want

619
00:42:03.440 --> 00:42:07.079
<v Speaker 3>to be able to resolve reject a method of promise

620
00:42:07.119 --> 00:42:12.960
<v Speaker 3>from the outside is then they actually copy resolve and

621
00:42:13.000 --> 00:42:20.159
<v Speaker 3>reject into global variables outside the promised scope. And it

622
00:42:20.400 --> 00:42:23.480
<v Speaker 3>kind of kind of feels wonky. Are you following what

623
00:42:23.519 --> 00:42:24.559
<v Speaker 3>I'm trying to describe?

624
00:42:25.280 --> 00:42:27.159
<v Speaker 2>Uh, not entirely.

625
00:42:28.400 --> 00:42:32.599
<v Speaker 3>Let's say I have a promise, but I want to

626
00:42:33.119 --> 00:42:37.440
<v Speaker 3>have some sort of an external event resolve it. So

627
00:42:37.599 --> 00:42:42.880
<v Speaker 3>I do a new promise and I pass in the

628
00:42:42.960 --> 00:42:46.840
<v Speaker 3>function that gets the resolve, but I can't resolve it

629
00:42:46.920 --> 00:42:50.199
<v Speaker 3>from inside the promise. I want to have just an

630
00:42:50.280 --> 00:42:54.239
<v Speaker 3>access to that resolve to resolve it somewhere else. So

631
00:42:54.280 --> 00:42:58.920
<v Speaker 3>I copy the reference to the resolve and hand it

632
00:42:58.960 --> 00:43:02.719
<v Speaker 3>over to somebody else, and then that somebody else can

633
00:43:02.760 --> 00:43:03.320
<v Speaker 3>resolve me.

634
00:43:04.960 --> 00:43:09.079
<v Speaker 1>Okay, sounds complicated, but I think I understand. Let me

635
00:43:09.119 --> 00:43:10.760
<v Speaker 1>see how I can restate it, just so that I

636
00:43:10.880 --> 00:43:15.800
<v Speaker 1>get it. So I have a promise for whatever reason,

637
00:43:15.880 --> 00:43:19.239
<v Speaker 1>I'm not going to use the default you know dot

638
00:43:19.280 --> 00:43:22.599
<v Speaker 1>then to resolve or you know dot what are the

639
00:43:22.599 --> 00:43:23.239
<v Speaker 1>other ones like that?

640
00:43:24.280 --> 00:43:27.599
<v Speaker 3>Or no, you're not, it's not exactly correct. Let's say

641
00:43:27.639 --> 00:43:31.719
<v Speaker 3>you've got you do a new promise and you pass

642
00:43:31.760 --> 00:43:35.559
<v Speaker 3>in a function with the resolve and that gets resolve

643
00:43:35.599 --> 00:43:38.960
<v Speaker 3>and reject, and then you take the resolve and put

644
00:43:39.000 --> 00:43:42.239
<v Speaker 3>it in window dot resolve, and you take the reject

645
00:43:42.239 --> 00:43:44.960
<v Speaker 3>and you put it in window dot reject. Now you

646
00:43:45.039 --> 00:43:49.400
<v Speaker 3>can call window dot resolve to resolve that promise. Uh huh.

647
00:43:50.079 --> 00:43:54.639
<v Speaker 3>So you're copying that resolve method out of the promise

648
00:43:55.119 --> 00:43:57.639
<v Speaker 3>into somewhere else, and that in the case I just

649
00:43:58.159 --> 00:44:00.280
<v Speaker 3>gave it to an into a glow effective into a

650
00:44:00.280 --> 00:44:04.800
<v Speaker 3>global but you can also copy it into a local

651
00:44:04.920 --> 00:44:08.039
<v Speaker 3>variable in a in a scope, but you're just helping

652
00:44:08.079 --> 00:44:12.000
<v Speaker 3>it out of the promise. And I've seen a lot

653
00:44:12.079 --> 00:44:15.840
<v Speaker 3>of instances where people needed to do that for some reason.

654
00:44:16.599 --> 00:44:20.039
<v Speaker 3>They want to be they have a promise, but they

655
00:44:20.079 --> 00:44:23.760
<v Speaker 3>want to be able to just resolve it from somewhere else.

656
00:44:24.239 --> 00:44:26.760
<v Speaker 2>Mm hm, I'm trying to think of why you would

657
00:44:26.760 --> 00:44:27.280
<v Speaker 2>need to do.

658
00:44:27.199 --> 00:44:33.679
<v Speaker 3>This, but there's there are good examples in the end

659
00:44:33.679 --> 00:44:36.039
<v Speaker 3>in the m d N, but I've seen a lot

660
00:44:36.079 --> 00:44:39.000
<v Speaker 3>of examples of such things. I've even seen example of

661
00:44:39.039 --> 00:44:43.000
<v Speaker 3>something like that within reacts on code when they implement UH,

662
00:44:44.119 --> 00:44:48.320
<v Speaker 3>when they they kind of throw promises to UH to

663
00:44:48.960 --> 00:44:55.119
<v Speaker 3>do too in order to implement suspense. So it's implemented

664
00:44:55.159 --> 00:44:57.639
<v Speaker 3>by throwing promises, and you need to be able to

665
00:44:57.679 --> 00:45:00.800
<v Speaker 3>resolve those promises from the outside, so they also kind

666
00:45:00.840 --> 00:45:03.679
<v Speaker 3>of hold on to the resolve and reject of the

667
00:45:03.719 --> 00:45:10.320
<v Speaker 3>promises on the outside of the promise itself. Okay, So

668
00:45:10.920 --> 00:45:15.000
<v Speaker 3>with resolvers actually does that for you in a kind

669
00:45:15.000 --> 00:45:19.400
<v Speaker 3>of built in way. Instead of returning a promise, it

670
00:45:19.519 --> 00:45:24.719
<v Speaker 3>returns an object that has three properties. A property called

671
00:45:24.760 --> 00:45:29.039
<v Speaker 3>promise which is the promise, a property called resolve which

672
00:45:29.079 --> 00:45:32.199
<v Speaker 3>is the resolver function, and a property called reject, which

673
00:45:32.280 --> 00:45:39.199
<v Speaker 3>is the rejector function. Okay, So and you can destruct

674
00:45:39.840 --> 00:45:43.920
<v Speaker 3>the return value and basically get the promise, get the resolver,

675
00:45:44.039 --> 00:45:44.920
<v Speaker 3>and get the rejector.

676
00:45:47.199 --> 00:45:47.400
<v Speaker 2>Right.

677
00:45:49.880 --> 00:45:53.000
<v Speaker 3>So in cases where you need this kind of functionality,

678
00:45:53.440 --> 00:45:56.199
<v Speaker 3>and as I said, I've seen this pattern used a

679
00:45:56.239 --> 00:45:59.960
<v Speaker 3>whole bunch of times. It's now much easier and clean

680
00:46:00.320 --> 00:46:03.039
<v Speaker 3>to do it because it's built into the language itself.

681
00:46:03.760 --> 00:46:07.440
<v Speaker 2>Okay, so from what I'm because I'm looking at the

682
00:46:07.440 --> 00:46:13.760
<v Speaker 2>proposal as well. Now, so essentially what you do is you, yeah,

683
00:46:13.880 --> 00:46:14.920
<v Speaker 2>you pat.

684
00:46:14.760 --> 00:46:18.599
<v Speaker 1>You do promise with resolvers, and it deconstructs the promise

685
00:46:18.679 --> 00:46:21.599
<v Speaker 1>so that you just have references to the promise resolve

686
00:46:21.960 --> 00:46:25.000
<v Speaker 1>and reject as as functions or objects.

687
00:46:25.440 --> 00:46:27.719
<v Speaker 2>And then and then you can yeah, and then you.

688
00:46:27.679 --> 00:46:31.079
<v Speaker 3>Can promise as an object and resolve and reject right.

689
00:46:31.480 --> 00:46:33.519
<v Speaker 1>And so so then what I can do is I

690
00:46:33.599 --> 00:46:39.079
<v Speaker 1>can I can basically reference those wherever I need. So

691
00:46:39.119 --> 00:46:42.480
<v Speaker 1>if I have something else that needs to resolve or

692
00:46:42.519 --> 00:46:45.679
<v Speaker 1>reject the promise, it just.

693
00:46:46.079 --> 00:46:48.519
<v Speaker 3>It just called it can just called resolve or reject

694
00:46:48.599 --> 00:46:49.119
<v Speaker 3>right directly.

695
00:46:49.320 --> 00:46:52.199
<v Speaker 1>Yeah, it can just do it without having to write,

696
00:46:52.199 --> 00:46:55.039
<v Speaker 1>without having to do work some magic on the promise

697
00:46:55.119 --> 00:46:58.880
<v Speaker 1>object to you know, get it the internals or something.

698
00:46:58.679 --> 00:47:05.639
<v Speaker 3>Like that exactly. So it's a it's a convenience method.

699
00:47:05.840 --> 00:47:08.840
<v Speaker 3>You can definitely write the code yourself, but it was

700
00:47:09.000 --> 00:47:13.800
<v Speaker 3>just really ugly boilerplate code. I've seen it done lots

701
00:47:13.840 --> 00:47:17.199
<v Speaker 3>of code bases that that I've looked at, and it's

702
00:47:17.280 --> 00:47:20.440
<v Speaker 3>nice to have a cleaner alternative, but you should have

703
00:47:20.519 --> 00:47:22.920
<v Speaker 3>a good reason to use it rather than use it

704
00:47:23.079 --> 00:47:25.599
<v Speaker 3>regular function promise semantics.

705
00:47:26.440 --> 00:47:28.599
<v Speaker 1>Yeah, it's funny because you were talking about people having

706
00:47:28.679 --> 00:47:32.519
<v Speaker 1>implemented it, and on the TC thirty nine proposal, it's

707
00:47:32.559 --> 00:47:35.920
<v Speaker 1>like existing implementations and it shows where reacted it and

708
00:47:36.000 --> 00:47:37.400
<v Speaker 1>view did it, and Axios did.

709
00:47:37.239 --> 00:47:41.599
<v Speaker 2>It, and Typescript did it.

710
00:47:40.719 --> 00:47:43.480
<v Speaker 3>Exactly exactly, and so now it's built in and there's

711
00:47:43.519 --> 00:47:46.000
<v Speaker 3>no reason for any of them to actually do it themselves.

712
00:47:46.280 --> 00:47:47.159
<v Speaker 2>Yeah, makes sense.

713
00:47:49.199 --> 00:47:51.599
<v Speaker 3>Okay, now we're kind of done with things that have

714
00:47:51.760 --> 00:47:55.400
<v Speaker 3>already actually in the language. Let's look at things that

715
00:47:55.480 --> 00:47:57.920
<v Speaker 3>are not yet officially part of any standard.

716
00:47:58.199 --> 00:48:01.760
<v Speaker 2>But are they are Stage four.

717
00:48:01.960 --> 00:48:05.760
<v Speaker 3>Which means that they are effectively part of the standard,

718
00:48:05.920 --> 00:48:08.360
<v Speaker 3>just that the standard, the relevant standard has not been

719
00:48:08.400 --> 00:48:11.760
<v Speaker 3>released yet. Now, funnily enough.

720
00:48:11.519 --> 00:48:13.519
<v Speaker 2>Hang on, so what does that mean?

721
00:48:13.559 --> 00:48:16.400
<v Speaker 1>It means that the they've adopted the proposal, but they

722
00:48:16.400 --> 00:48:19.000
<v Speaker 1>haven't rewritten the ACMASCRIPT standard to include them yet.

723
00:48:19.559 --> 00:48:23.199
<v Speaker 3>Exactly. They release the standard once a year, so they'll

724
00:48:23.239 --> 00:48:27.000
<v Speaker 3>release yes, twenty twenty five, sometimes later this year. But

725
00:48:27.559 --> 00:48:30.239
<v Speaker 3>these things are kind of waiting for that document to

726
00:48:30.280 --> 00:48:31.239
<v Speaker 3>be released.

727
00:48:31.320 --> 00:48:31.880
<v Speaker 2>I gotcha.

728
00:48:32.679 --> 00:48:36.639
<v Speaker 1>So people might be furiously working away at them now

729
00:48:36.719 --> 00:48:37.599
<v Speaker 1>because they know now.

730
00:48:37.519 --> 00:48:39.679
<v Speaker 3>They're actually all of them. Are actually the ones that

731
00:48:39.719 --> 00:48:44.039
<v Speaker 3>I'm going to mention are actually implemented in browsers. Oh okay,

732
00:48:46.000 --> 00:48:50.760
<v Speaker 3>but but they're not because from the browsers manufacturer's perspective,

733
00:48:51.199 --> 00:48:55.239
<v Speaker 3>they've they've arrived, right, So why wait for the document

734
00:48:55.280 --> 00:48:57.079
<v Speaker 3>if we know that they are going to be part

735
00:48:57.079 --> 00:48:57.800
<v Speaker 3>of the document?

736
00:48:59.000 --> 00:49:00.960
<v Speaker 2>Makes sense extra to the browsers.

737
00:49:02.000 --> 00:49:06.719
<v Speaker 3>Yes. Indeed, the funny thing is that I've actually mentioned

738
00:49:06.760 --> 00:49:10.599
<v Speaker 3>them in that episode five ninety a year and a

739
00:49:10.639 --> 00:49:14.199
<v Speaker 3>half ago. Only then they were stage three, so it

740
00:49:14.280 --> 00:49:16.400
<v Speaker 3>took them a year and a half to progress the

741
00:49:16.440 --> 00:49:17.000
<v Speaker 3>stage four.

742
00:49:18.239 --> 00:49:21.719
<v Speaker 2>Yeah, so again I like that they're being deliberate about it, So.

743
00:49:22.400 --> 00:49:27.039
<v Speaker 3>Yeah, for sure. So the first one are set methods.

744
00:49:27.599 --> 00:49:30.360
<v Speaker 3>Do you know the set object type in JavaScript? Have

745
00:49:30.440 --> 00:49:35.639
<v Speaker 3>you used it? No? Set is kind of like the set.

746
00:49:35.719 --> 00:49:40.119
<v Speaker 3>In math, it's basically a collection type. Oh yes, where

747
00:49:40.519 --> 00:49:42.960
<v Speaker 3>something can either be part of the set or not

748
00:49:43.119 --> 00:49:43.840
<v Speaker 3>part of the set.

749
00:49:44.199 --> 00:49:47.239
<v Speaker 1>I thought you were talking about like a method on

750
00:49:47.440 --> 00:49:49.239
<v Speaker 1>object or something called set object type.

751
00:49:49.239 --> 00:49:50.840
<v Speaker 2>But no, the set, yeah, I've.

752
00:49:50.800 --> 00:49:53.960
<v Speaker 3>Yeah, you do new set exactly, new set. You pass

753
00:49:54.039 --> 00:49:58.280
<v Speaker 3>in an area of stuff to the constructor, and then

754
00:49:58.480 --> 00:50:00.880
<v Speaker 3>those things are in the set. You can check whether

755
00:50:00.960 --> 00:50:03.400
<v Speaker 3>something is in the set or not. You can add

756
00:50:03.920 --> 00:50:06.239
<v Speaker 3>more stuff to the set or remove it from the set,

757
00:50:06.599 --> 00:50:09.719
<v Speaker 3>but it's basically just to check if something is a

758
00:50:09.800 --> 00:50:16.880
<v Speaker 3>part of a collection or not, and they and the

759
00:50:16.960 --> 00:50:20.840
<v Speaker 3>thing is. As I alluded, set is really similar to

760
00:50:20.960 --> 00:50:23.440
<v Speaker 3>set in math. And there are a whole bunch of

761
00:50:23.480 --> 00:50:27.679
<v Speaker 3>operators that you can apply on sets in math, and

762
00:50:27.760 --> 00:50:30.320
<v Speaker 3>it makes sense to have them on sets in JavaScript

763
00:50:30.400 --> 00:50:33.880
<v Speaker 3>as well. So you've got, for example, union, which can

764
00:50:33.920 --> 00:50:37.239
<v Speaker 3>take two sets and return a new set, which is

765
00:50:37.280 --> 00:50:40.519
<v Speaker 3>then union of those two sets, so that it contains

766
00:50:40.599 --> 00:50:43.480
<v Speaker 3>all the items that are in each one of them.

767
00:50:43.760 --> 00:50:49.039
<v Speaker 3>Now it's an union rather than a concatenation because everything

768
00:50:49.119 --> 00:50:53.639
<v Speaker 3>is in a set either either zero or one time. Right,

769
00:50:54.159 --> 00:50:56.559
<v Speaker 3>So if it's a set of one two and another

770
00:50:56.639 --> 00:50:58.960
<v Speaker 3>set of two three, and you do a union, you

771
00:50:59.000 --> 00:51:03.440
<v Speaker 3>get a set with one two free right. Likewise, you've

772
00:51:03.480 --> 00:51:08.800
<v Speaker 3>got dot intersection which can create an intersection of two sets,

773
00:51:09.000 --> 00:51:13.559
<v Speaker 3>or dot difference which returns the difference between two sets.

774
00:51:14.280 --> 00:51:17.239
<v Speaker 3>And uh, and these whole bunch of methods that have

775
00:51:17.280 --> 00:51:21.320
<v Speaker 3>been introduced to sets and just makes working with sets,

776
00:51:22.119 --> 00:51:26.599
<v Speaker 3>like working with mathematical sets, much cleaner and easier. I

777
00:51:26.679 --> 00:51:29.760
<v Speaker 3>assume that they were there was probably more than one

778
00:51:30.360 --> 00:51:34.119
<v Speaker 3>package package on NPM that implemented all this functionality. It's

779
00:51:34.119 --> 00:51:37.119
<v Speaker 3>pretty straightforward to implement, but now it's built in, so

780
00:51:37.239 --> 00:51:39.320
<v Speaker 3>you don't need those NPM packages anymore.

781
00:51:40.519 --> 00:51:40.920
<v Speaker 2>Yeah.

782
00:51:41.000 --> 00:51:44.119
<v Speaker 1>Yeah, And it makes a lot of sense because typically

783
00:51:44.199 --> 00:51:47.280
<v Speaker 1>when you're using because because other collection types, you know,

784
00:51:47.320 --> 00:51:49.519
<v Speaker 1>dictionaries or arrays, you're you're.

785
00:51:49.519 --> 00:51:53.559
<v Speaker 2>Usually using those to hold all your data.

786
00:51:53.719 --> 00:51:55.559
<v Speaker 1>And like you said, I like the way you put

787
00:51:55.599 --> 00:51:58.320
<v Speaker 1>it where it's a mathema like the mathematical set. So

788
00:51:58.480 --> 00:52:02.360
<v Speaker 1>this is you typical use sets for certain types of operations,

789
00:52:02.800 --> 00:52:06.400
<v Speaker 1>and so if you need a friendly and easy way

790
00:52:06.440 --> 00:52:11.480
<v Speaker 1>to do those kinds of operations, you can use sets exactly.

791
00:52:11.639 --> 00:52:16.639
<v Speaker 3>That's what sets are for. So it's really nice to

792
00:52:16.719 --> 00:52:20.480
<v Speaker 3>have those methods now built into the jobscript programming language.

793
00:52:20.519 --> 00:52:23.440
<v Speaker 3>It's not like this big revolution. It's not like errow

794
00:52:23.480 --> 00:52:27.559
<v Speaker 3>functions or like letter cons but it just makes JavaScript

795
00:52:27.559 --> 00:52:29.280
<v Speaker 3>a nicer language out of the box.

796
00:52:30.599 --> 00:52:32.719
<v Speaker 2>Yeah, so sets are a new edition.

797
00:52:32.840 --> 00:52:36.199
<v Speaker 3>They didn't well, sets have been here for a long time.

798
00:52:36.320 --> 00:52:39.719
<v Speaker 3>Sets were introduced with maps, I think way back in

799
00:52:40.079 --> 00:52:44.480
<v Speaker 3>ES what's called ES six or EES twenty fifteen, so

800
00:52:44.519 --> 00:52:48.320
<v Speaker 3>they've been here for like a decade. But it's nice

801
00:52:48.360 --> 00:52:53.519
<v Speaker 3>to have these operations on sets now part of the standard. Okay,

802
00:52:55.239 --> 00:52:57.519
<v Speaker 3>as I said, previously, you had sets, but if you

803
00:52:57.599 --> 00:53:00.880
<v Speaker 3>wanted to do these an operation like union, you would

804
00:53:00.920 --> 00:53:03.519
<v Speaker 3>have kind of needed to implement it yourself, and it

805
00:53:03.639 --> 00:53:06.599
<v Speaker 3>wasn't difficult. You could spread the set into an array,

806
00:53:07.199 --> 00:53:11.360
<v Speaker 3>then cancat into the two arrays and create a new

807
00:53:11.400 --> 00:53:14.239
<v Speaker 3>set out of them, and you would get the union,

808
00:53:14.440 --> 00:53:17.679
<v Speaker 3>but a whole bunch of copying going on. So now

809
00:53:17.719 --> 00:53:23.639
<v Speaker 3>you've got a cleaner, more efficient implementation and certainly an

810
00:53:23.679 --> 00:53:29.719
<v Speaker 3>alternative to bringing in yet another NPM package. Right. The

811
00:53:29.800 --> 00:53:33.159
<v Speaker 3>other thing that was Stage three and now is released

812
00:53:33.199 --> 00:53:37.320
<v Speaker 3>and it's a bit more difficult to explain are sync

813
00:53:37.480 --> 00:53:43.800
<v Speaker 3>iterator helpers. So we've had episodes in the past, way

814
00:53:43.840 --> 00:53:47.360
<v Speaker 3>back in twenty twenty one where I actually gave I

815
00:53:47.599 --> 00:53:51.559
<v Speaker 3>talked for two whole episodes about iterators and why I

816
00:53:51.599 --> 00:53:54.800
<v Speaker 3>think they're great, and I think I might have been

817
00:53:54.840 --> 00:53:58.599
<v Speaker 3>able to convince AJ for the duration of the episode,

818
00:53:58.639 --> 00:54:01.480
<v Speaker 3>and then he immediately chan is mine once then episode

819
00:54:01.559 --> 00:54:04.960
<v Speaker 3>was over. Those were episodes for six eight and four

820
00:54:05.079 --> 00:54:07.679
<v Speaker 3>six nine. For those who are interested in the details

821
00:54:07.719 --> 00:54:13.000
<v Speaker 3>of what iterators are and how they work, I won't

822
00:54:13.039 --> 00:54:15.960
<v Speaker 3>go into too much detail. Basically, it means that we

823
00:54:16.079 --> 00:54:20.719
<v Speaker 3>now have methods like dot map, map or dot filter

824
00:54:21.559 --> 00:54:26.159
<v Speaker 3>or dot reduce on iterators like we have them on

825
00:54:26.440 --> 00:54:31.400
<v Speaker 3>let's say arrays, And the easiest way to explain how

826
00:54:31.400 --> 00:54:33.920
<v Speaker 3>to use them is think of let's say I have

827
00:54:33.960 --> 00:54:38.000
<v Speaker 3>an array of stuff, and I would do array dot

828
00:54:38.239 --> 00:54:42.880
<v Speaker 3>let's say map, and then dot filter and then dot

829
00:54:43.199 --> 00:54:48.400
<v Speaker 3>reduce or something like that. Now I can wrap the

830
00:54:48.639 --> 00:54:54.079
<v Speaker 3>array itself in something that in something it's iterator dot from.

831
00:54:54.159 --> 00:54:57.440
<v Speaker 3>So I do iterator with a capital I dot from

832
00:54:57.880 --> 00:55:01.280
<v Speaker 3>on the array, and then on the return value from that,

833
00:55:01.400 --> 00:55:04.920
<v Speaker 3>I do the dot map, dot filter, dot reduced, et cetera.

834
00:55:06.559 --> 00:55:10.119
<v Speaker 3>Now you might ask yourself why would I do that

835
00:55:10.880 --> 00:55:14.280
<v Speaker 3>and what's the difference. So, first of all, if it

836
00:55:14.360 --> 00:55:17.320
<v Speaker 3>turns an iterator rather than an array. So if I

837
00:55:17.360 --> 00:55:19.480
<v Speaker 3>then want to actually get an array in results as

838
00:55:19.519 --> 00:55:21.719
<v Speaker 3>a result, I need to actually spread it into the

839
00:55:21.800 --> 00:55:24.480
<v Speaker 3>result into an array. So you say, hey, this is

840
00:55:24.559 --> 00:55:27.280
<v Speaker 3>actually even more work. I needed to do add an

841
00:55:27.280 --> 00:55:30.280
<v Speaker 3>iterator from on the original array and then spread the

842
00:55:30.320 --> 00:55:33.599
<v Speaker 3>result into an array. And you know what's the upside

843
00:55:33.639 --> 00:55:36.400
<v Speaker 3>of all this? Why would I want to do all

844
00:55:36.400 --> 00:55:40.639
<v Speaker 3>this stuff? There are a couple of reasons. First of all,

845
00:55:40.719 --> 00:55:43.559
<v Speaker 3>iterator dot from is not just for arrays. It's for

846
00:55:43.679 --> 00:55:47.920
<v Speaker 3>anything that's iterable. So it means that if I now

847
00:55:48.039 --> 00:55:52.559
<v Speaker 3>have a new collection type. So for example, maps or sets.

848
00:55:52.960 --> 00:55:57.840
<v Speaker 3>In JavaScript, there are collections they actually implement the four each,

849
00:55:58.679 --> 00:56:02.800
<v Speaker 3>but they don't implement the filter, they don't implement a find,

850
00:56:03.039 --> 00:56:10.199
<v Speaker 3>they don't implement a reduce, they don't implement filter. So

851
00:56:10.800 --> 00:56:16.400
<v Speaker 3>how do I How do I invoke those methods on

852
00:56:16.480 --> 00:56:19.280
<v Speaker 3>those types of collections. What I would usually see people

853
00:56:19.320 --> 00:56:22.719
<v Speaker 3>doing is either avoid using these collections if they needed

854
00:56:22.760 --> 00:56:27.880
<v Speaker 3>these methods, or alternatively copy them into arrays. And if

855
00:56:27.880 --> 00:56:29.840
<v Speaker 3>you're going to copy them into arrays, then you might

856
00:56:29.840 --> 00:56:34.199
<v Speaker 3>as well have just used arrays. So now I can

857
00:56:34.360 --> 00:56:40.079
<v Speaker 3>apply iterator from to anything that supports iterators, any collection

858
00:56:40.199 --> 00:56:43.440
<v Speaker 3>type that supports iterators, and then I can use all

859
00:56:43.480 --> 00:56:48.920
<v Speaker 3>these methods on that collection. So that's advantage number one.

860
00:56:49.360 --> 00:56:53.280
<v Speaker 3>I don't need to implement those methods directly on each

861
00:56:53.320 --> 00:56:57.079
<v Speaker 3>and every collection type. I just need to implement iterators

862
00:56:57.119 --> 00:56:59.960
<v Speaker 3>in the collection, and then I can use these methods

863
00:57:00.159 --> 00:57:02.519
<v Speaker 3>on any collection type, be it a built in collection

864
00:57:03.079 --> 00:57:07.519
<v Speaker 3>or one that I implement myself. Okay, so that's advantage

865
00:57:07.599 --> 00:57:15.519
<v Speaker 3>number one. Okay. The second advantage is that it avoids

866
00:57:15.559 --> 00:57:21.400
<v Speaker 3>all the intermediate arrays. When you do a dot map

867
00:57:21.480 --> 00:57:24.079
<v Speaker 3>on an array, you get as a result or an

868
00:57:24.159 --> 00:57:26.480
<v Speaker 3>array of the of the map. So when you do

869
00:57:26.480 --> 00:57:29.960
<v Speaker 3>dot map, dot filter, dot whatever, you're getting a whole

870
00:57:29.960 --> 00:57:33.400
<v Speaker 3>bunch of intermediate arrays that you're copying stuff from one

871
00:57:33.440 --> 00:57:35.039
<v Speaker 3>to the next, to the next to the next and

872
00:57:35.079 --> 00:57:41.320
<v Speaker 3>so forth. With iterators, they don't create those intermediate arrays.

873
00:57:41.360 --> 00:57:45.679
<v Speaker 3>They work by doing lazy evaluation. You just get the

874
00:57:45.760 --> 00:57:49.599
<v Speaker 3>results that you need, only the computations that are required

875
00:57:50.119 --> 00:57:53.679
<v Speaker 3>without all the intermediate arrays. So they're actually they can

876
00:57:53.760 --> 00:57:57.840
<v Speaker 3>actually be a lot more efficient in cases where you

877
00:57:57.920 --> 00:58:04.840
<v Speaker 3>don't need all the values, right, And I'm really happy

878
00:58:04.880 --> 00:58:08.880
<v Speaker 3>that they're here because iterators have been kind of a

879
00:58:08.960 --> 00:58:15.880
<v Speaker 3>dud feature in JavaScript because they lacked all these helper functions. Hopefully,

880
00:58:16.159 --> 00:58:19.960
<v Speaker 3>now maybe they'll they'll get some more love from the

881
00:58:20.039 --> 00:58:24.360
<v Speaker 3>JavaScript developing the developer community. Time will tell. Maybe it's

882
00:58:24.400 --> 00:58:25.960
<v Speaker 3>too late. I don't know, we'll see.

883
00:58:27.760 --> 00:58:32.519
<v Speaker 2>Yeah, So these are the aerator helpers, right, No.

884
00:58:32.639 --> 00:58:37.719
<v Speaker 3>These are the sync iterator helpers, the serator. The sync

885
00:58:37.800 --> 00:58:42.119
<v Speaker 3>iterator helpers are here. They exist in browsers. You can

886
00:58:42.159 --> 00:58:48.760
<v Speaker 3>already do iterator from inside Chrome, inside the Safari, inside Firefox.

887
00:58:50.320 --> 00:58:54.880
<v Speaker 3>But what we don't have yet are a sync iterator helpers.

888
00:58:55.800 --> 00:58:57.400
<v Speaker 3>They're stuck in stage two.

889
00:58:57.599 --> 00:59:00.800
<v Speaker 2>I think yes they are. This one says, so.

890
00:59:02.079 --> 00:59:05.280
<v Speaker 3>Yeah, the sync ones are stage four. The async ones

891
00:59:05.320 --> 00:59:08.119
<v Speaker 3>are stuck in stage two. They've been stuck there for

892
00:59:08.159 --> 00:59:15.119
<v Speaker 3>a whole while. That's really unfortunate. Again, what's the difference between? Yeah?

893
00:59:15.159 --> 00:59:18.280
<v Speaker 3>And If our listeners are interested in the difference between

894
00:59:18.360 --> 00:59:22.119
<v Speaker 3>sync inperators and a sync iterators, they should listen to

895
00:59:22.199 --> 00:59:25.440
<v Speaker 3>episode four sixty nine where I explained the difference in detail.

896
00:59:29.000 --> 00:59:31.159
<v Speaker 3>The other thing that I wanted to mention, which is

897
00:59:31.239 --> 00:59:37.159
<v Speaker 3>kind of here are JSON modules you can now import

898
00:59:37.880 --> 00:59:41.679
<v Speaker 3>not only JavaScript, you can import json.

899
00:59:43.960 --> 00:59:44.920
<v Speaker 2>I'm sorry say that again.

900
00:59:46.079 --> 00:59:51.239
<v Speaker 3>You know the JavaScript import command well, you can now

901
00:59:51.480 --> 00:59:57.039
<v Speaker 3>import not only JavaScript modules, you can import JSON files

902
00:59:57.440 --> 01:00:00.400
<v Speaker 3>and the result of the import is the Jason object.

903
01:00:01.800 --> 01:00:02.400
<v Speaker 2>Oh cool.

904
01:00:03.920 --> 01:00:08.760
<v Speaker 3>You just need to tell the import that you're importing

905
01:00:08.800 --> 01:00:15.840
<v Speaker 3>a Jason it you you basically tell it, you assert

906
01:00:16.039 --> 01:00:23.000
<v Speaker 3>that this is the type of what you're importing. Is

907
01:00:23.039 --> 01:00:24.199
<v Speaker 3>that is that kind of clear?

908
01:00:24.800 --> 01:00:27.760
<v Speaker 2>Yep? I'm just trying to find an example on the internet,

909
01:00:27.840 --> 01:00:28.599
<v Speaker 2>but that makes sense.

910
01:00:28.639 --> 01:00:33.119
<v Speaker 3>You do you do import json from something dot json

911
01:00:33.719 --> 01:00:36.320
<v Speaker 3>and then at the end of that instruction you add

912
01:00:36.400 --> 01:00:43.360
<v Speaker 3>with open curly brackets type colon json close curly brackets. Okay,

913
01:00:45.599 --> 01:00:48.760
<v Speaker 3>Theoretically in the future we might have other types I

914
01:00:48.760 --> 01:00:52.480
<v Speaker 3>don't know, maybe will import CSS or text files or

915
01:00:52.480 --> 01:00:55.159
<v Speaker 3>I don't know what. But for now, we've got it

916
01:00:55.239 --> 01:00:58.519
<v Speaker 3>for json. Now why is this useful? Because I mean,

917
01:00:58.679 --> 01:01:02.760
<v Speaker 3>you could just do a fetch and then do a

918
01:01:02.880 --> 01:01:08.400
<v Speaker 3>JSON parts. Why do we need to import? To be honest,

919
01:01:08.519 --> 01:01:12.280
<v Speaker 3>it's more of a convenience than a necessity. But the

920
01:01:12.360 --> 01:01:15.119
<v Speaker 3>convenience is that in a lot of cases we use

921
01:01:15.199 --> 01:01:19.480
<v Speaker 3>JSON as configuration, and it's really useful to be able

922
01:01:19.519 --> 01:01:29.639
<v Speaker 3>to directly import such configurations into the code. Yeah, think

923
01:01:29.679 --> 01:01:33.119
<v Speaker 3>about I don't know, a wet back configuration or something

924
01:01:33.159 --> 01:01:42.079
<v Speaker 3>like that. So you're creating some sort of node based utility,

925
01:01:42.639 --> 01:01:46.840
<v Speaker 3>and that utility uses some sort of Jason configuration and

926
01:01:46.920 --> 01:01:50.239
<v Speaker 3>now you can just import that configuration at the top

927
01:01:50.320 --> 01:01:53.360
<v Speaker 3>of your file and then just use that configuration because

928
01:01:53.440 --> 01:01:57.039
<v Speaker 3>if that configuration is missing, there's really nothing that you

929
01:01:57.119 --> 01:02:03.679
<v Speaker 3>can do. And it also works with dynamic imports by

930
01:02:03.679 --> 01:02:04.000
<v Speaker 3>the way.

931
01:02:05.840 --> 01:02:06.519
<v Speaker 2>Oh nice.

932
01:02:07.480 --> 01:02:10.599
<v Speaker 3>So yeah, it's it's again, it's not earth shaking, but

933
01:02:10.719 --> 01:02:13.639
<v Speaker 3>it's really useful, I think, and it's nice to have

934
01:02:13.679 --> 01:02:15.119
<v Speaker 3>it built into the language.

935
01:02:16.119 --> 01:02:16.360
<v Speaker 2>Yeah.

936
01:02:16.519 --> 01:02:19.199
<v Speaker 3>Well it's stage four, so that means that it's here.

937
01:02:20.159 --> 01:02:20.400
<v Speaker 2>Yeah.

938
01:02:20.599 --> 01:02:22.760
<v Speaker 1>The way I think about it is you import all

939
01:02:22.760 --> 01:02:25.760
<v Speaker 1>the things that are required to run your application, and yeah,

940
01:02:25.800 --> 01:02:29.960
<v Speaker 1>typically that's going to be other JavaScript files. But yeah,

941
01:02:30.159 --> 01:02:33.920
<v Speaker 1>it makes sense right that you may have some set

942
01:02:34.000 --> 01:02:35.880
<v Speaker 1>up data or whatever that you need in order for

943
01:02:35.920 --> 01:02:38.880
<v Speaker 1>it to work, and so it's another requirement.

944
01:02:38.920 --> 01:02:43.119
<v Speaker 3>It's just not code exactly. It's a declarative way to

945
01:02:43.320 --> 01:02:49.679
<v Speaker 3>load your configuration data into your code basically, and you

946
01:02:49.719 --> 01:02:55.360
<v Speaker 3>can be certain that if that configuration fails to load,

947
01:02:55.800 --> 01:03:00.519
<v Speaker 3>then your code fails to load. And if it's successfully loads,

948
01:03:00.559 --> 01:03:03.920
<v Speaker 3>than your code then gets to run with that configuration.

949
01:03:04.000 --> 01:03:06.760
<v Speaker 3>It kind of blocks on that configuration. It doesn't proceed

950
01:03:07.400 --> 01:03:10.880
<v Speaker 3>until that configuration is loaded. So it's not like I'm

951
01:03:10.880 --> 01:03:14.239
<v Speaker 3>loading some configuration asynchronously I need to wait for it

952
01:03:14.360 --> 01:03:17.360
<v Speaker 3>or write code that waits for it or something like that.

953
01:03:17.440 --> 01:03:20.239
<v Speaker 3>I can just import it and use and rely on

954
01:03:20.280 --> 01:03:24.519
<v Speaker 3>the fact that if I load it successfully, it means

955
01:03:24.519 --> 01:03:26.159
<v Speaker 3>that I have this configuration data.

956
01:03:27.400 --> 01:03:33.760
<v Speaker 2>Yep. Also for the iterator conversation, I did post episode

957
01:03:33.880 --> 01:03:38.239
<v Speaker 2>for sixty nine just so that people can go reference

958
01:03:38.239 --> 01:03:38.800
<v Speaker 2>that if they want.

959
01:03:39.119 --> 01:03:41.360
<v Speaker 3>Yeah, basically they probably want to listen to both for

960
01:03:41.519 --> 01:03:44.239
<v Speaker 3>sixty eight and for sixty nine together. To be honest,

961
01:03:45.719 --> 01:03:48.480
<v Speaker 3>since we're running short on time, I want to mention

962
01:03:48.840 --> 01:03:54.519
<v Speaker 3>just one Stage three standout. It's being stage streets means

963
01:03:54.639 --> 01:03:58.320
<v Speaker 3>it's not yet here, so don't go try to use it.

964
01:03:58.480 --> 01:04:03.599
<v Speaker 3>But there are various existing ways for you to actually

965
01:04:03.639 --> 01:04:09.960
<v Speaker 3>test implementation, either NPM modules that implement it, or you know,

966
01:04:10.079 --> 01:04:13.840
<v Speaker 3>Babel plug ins or some suff something like that. It's

967
01:04:14.280 --> 01:04:18.840
<v Speaker 3>the temporal object or temporal namespace. Actually it's a more

968
01:04:18.880 --> 01:04:22.760
<v Speaker 3>accurate way to put it. We all know that the

969
01:04:22.880 --> 01:04:30.119
<v Speaker 3>JavaScript date object is pretty bad, uh it it has

970
01:04:30.280 --> 01:04:34.440
<v Speaker 3>it has a lot of uh problems and limitations with it.

971
01:04:35.760 --> 01:04:38.559
<v Speaker 2>I've done hand to hand combat with it before and

972
01:04:40.159 --> 01:04:41.840
<v Speaker 2>I have lost some of those battles.

973
01:04:43.719 --> 01:04:47.880
<v Speaker 3>Yeah, there are problems around working with the time zones

974
01:04:47.920 --> 01:04:51.000
<v Speaker 3>with it. It only really supports your own your own time

975
01:04:51.119 --> 01:04:56.280
<v Speaker 3>zone and doing all sorts of daylight saving time computation

976
01:04:56.599 --> 01:05:00.199
<v Speaker 3>is really challenging and it and it's mutable with which

977
01:05:00.199 --> 01:05:07.639
<v Speaker 3>makes it really problematics. It was created back in nineteen

978
01:05:07.760 --> 01:05:13.000
<v Speaker 3>ninety five based on the Java the then Java date object.

979
01:05:13.119 --> 01:05:16.920
<v Speaker 3>Java actually fixed their date object, but in JavaScript you

980
01:05:16.960 --> 01:05:20.119
<v Speaker 3>couldn't for backward compatibility reasons, so we are stuck with it.

981
01:05:21.199 --> 01:05:27.159
<v Speaker 3>So Temporal aims to fix these problems by providing an

982
01:05:27.199 --> 01:05:30.000
<v Speaker 3>alternative to date, so date will still be there because

983
01:05:30.039 --> 01:05:33.639
<v Speaker 3>obviously you can't take something away, but now instead you

984
01:05:33.679 --> 01:05:36.880
<v Speaker 3>can use temporal. And by using Temporal you'll avoid the

985
01:05:36.960 --> 01:05:41.199
<v Speaker 3>need for stuff like moment jas and other NPM modules

986
01:05:41.199 --> 01:05:44.880
<v Speaker 3>which aim to fix a lot of the time problems

987
01:05:44.920 --> 01:05:48.199
<v Speaker 3>that we face when we need to deal with date

988
01:05:48.239 --> 01:05:53.920
<v Speaker 3>and time in JavaScript. Other things, it supports non Gregorian

989
01:05:53.960 --> 01:05:57.400
<v Speaker 3>calendars for people who care about these things, for example

990
01:05:57.559 --> 01:06:03.440
<v Speaker 3>the Hebrew calendar. You've got a more date format, parsing

991
01:06:03.480 --> 01:06:06.239
<v Speaker 3>of options, so on and so forth. Just as a

992
01:06:06.239 --> 01:06:09.320
<v Speaker 3>whole bunch of functionality for dealing with date and time

993
01:06:09.360 --> 01:06:13.159
<v Speaker 3>in JavaScript. Now, as I said, unfortunately it's still stuck

994
01:06:13.199 --> 01:06:16.239
<v Speaker 3>in stage three. I guess it's really complicated to get

995
01:06:16.280 --> 01:06:21.880
<v Speaker 3>everything right in such a complex, complex domain. So they're

996
01:06:21.920 --> 01:06:24.840
<v Speaker 3>taking their time. Hopefully we'll get it eventually.

997
01:06:25.960 --> 01:06:31.159
<v Speaker 1>Yeah, I was gonna say, I as fraught as time

998
01:06:31.400 --> 01:06:34.679
<v Speaker 1>and time zone and all of that stuff gets.

999
01:06:35.400 --> 01:06:36.880
<v Speaker 2>And it's not just JavaScript.

1000
01:06:37.079 --> 01:06:39.079
<v Speaker 1>I know that that we have some listeners that are

1001
01:06:39.119 --> 01:06:42.159
<v Speaker 1>kind of polyglot folks, so they work on the back

1002
01:06:42.280 --> 01:06:45.719
<v Speaker 1>end and Ruby or Rust or go or something right,

1003
01:06:45.800 --> 01:06:49.360
<v Speaker 1>and so you folks know that, hey, some of this

1004
01:06:49.440 --> 01:06:53.639
<v Speaker 1>stuff is maybe easier in that language, but it's still

1005
01:06:53.719 --> 01:06:59.079
<v Speaker 1>hard sometimes. And then the folks that only do JavaScript

1006
01:06:59.159 --> 01:07:02.360
<v Speaker 1>like this is it's a hard problem. And so yeah,

1007
01:07:02.400 --> 01:07:08.280
<v Speaker 1>I understand why. Yeah, they may be working through some

1008
01:07:08.320 --> 01:07:11.320
<v Speaker 1>of the finer details to make sure that they get

1009
01:07:11.320 --> 01:07:13.920
<v Speaker 1>it right, because, yeah, if they put in an implementation

1010
01:07:14.000 --> 01:07:18.039
<v Speaker 1>that really does kind of just shine. I mean, that's

1011
01:07:18.119 --> 01:07:19.719
<v Speaker 1>a big area of pain that a lot of people

1012
01:07:19.840 --> 01:07:23.480
<v Speaker 1>have to deal with. Now, you said at stage three,

1013
01:07:23.639 --> 01:07:27.960
<v Speaker 1>so is it implemented or somewhat implemented or partially implemented

1014
01:07:28.000 --> 01:07:28.760
<v Speaker 1>in browsers.

1015
01:07:29.199 --> 01:07:31.880
<v Speaker 3>No, it's not really implemented in browsers as far as

1016
01:07:31.880 --> 01:07:32.400
<v Speaker 3>I can tell.

1017
01:07:32.519 --> 01:07:36.000
<v Speaker 1>Okay, they do have some polyphills that are listed in

1018
01:07:36.039 --> 01:07:36.719
<v Speaker 1>the proposal.

1019
01:07:36.840 --> 01:07:40.119
<v Speaker 3>Oh yeah, for sure. It's it's an object in JavaScript,

1020
01:07:40.400 --> 01:07:42.760
<v Speaker 3>it's a name space in JavaScript, so you can definitely

1021
01:07:42.760 --> 01:07:46.320
<v Speaker 3>poly fill it. But you know some of these polyfils.

1022
01:07:46.360 --> 01:07:49.599
<v Speaker 3>First of all, I haven't checked how complete these polyfields are.

1023
01:07:50.400 --> 01:07:51.360
<v Speaker 3>And uh.

1024
01:07:53.760 --> 01:07:59.000
<v Speaker 2>Yeah, the REA says so it was updated. Oh that's helpful.

1025
01:07:59.039 --> 01:08:02.920
<v Speaker 2>It says it was updated last year, very very helpful.

1026
01:08:03.400 --> 01:08:05.880
<v Speaker 1>It does list other changes two months and four months ago,

1027
01:08:05.920 --> 01:08:08.920
<v Speaker 1>so it might be longer ago than that.

1028
01:08:09.159 --> 01:08:12.159
<v Speaker 2>But the two that it lists are at.

1029
01:08:12.079 --> 01:08:15.519
<v Speaker 1>JASS temporal slash polyphil, which I'm assuming is an NPM package,

1030
01:08:15.880 --> 01:08:19.039
<v Speaker 1>and that says that the alpha release is available. And

1031
01:08:19.079 --> 01:08:24.479
<v Speaker 1>then temporal dash polyphil, which is a full calendar implementation

1032
01:08:24.880 --> 01:08:27.760
<v Speaker 1>is it says the beta release is available.

1033
01:08:27.279 --> 01:08:27.439
<v Speaker 3>So.

1034
01:08:30.159 --> 01:08:31.319
<v Speaker 2>It might be worth looking at.

1035
01:08:31.359 --> 01:08:33.800
<v Speaker 1>But yeah, it doesn't look like any of these are

1036
01:08:34.479 --> 01:08:35.399
<v Speaker 1>entirely stable.

1037
01:08:36.720 --> 01:08:39.479
<v Speaker 3>Now we've effectively run out of time. I was going

1038
01:08:39.520 --> 01:08:44.000
<v Speaker 3>to talk about two more. One is the explicit resource

1039
01:08:44.079 --> 01:08:49.560
<v Speaker 3>management with the using keyword. It's this one actually does

1040
01:08:49.640 --> 01:08:56.159
<v Speaker 3>modify JavaScript semantics. I did actually discuss it way back

1041
01:08:56.279 --> 01:08:59.520
<v Speaker 3>in episode five and ninety a year and a half ago.

1042
01:08:59.600 --> 01:09:05.479
<v Speaker 3>It was then it's still stage three now, so uh.

1043
01:09:05.800 --> 01:09:10.079
<v Speaker 3>The one interesting thing is that Typescript actually added it

1044
01:09:10.880 --> 01:09:14.800
<v Speaker 3>in version five point two about a year and a

1045
01:09:14.840 --> 01:09:17.760
<v Speaker 3>half ago, So it seems that typescip kind of jumped

1046
01:09:17.760 --> 01:09:20.960
<v Speaker 3>the gun on that one. They saw it in stage three,

1047
01:09:21.039 --> 01:09:23.439
<v Speaker 3>they assumed it was going to be released soon, and

1048
01:09:23.479 --> 01:09:26.199
<v Speaker 3>so they added support for it, and but it's not

1049
01:09:26.359 --> 01:09:29.359
<v Speaker 3>here yet. So it exists in typescript but not in JavaScript,

1050
01:09:29.600 --> 01:09:30.399
<v Speaker 3>which is amusing.

1051
01:09:32.680 --> 01:09:35.199
<v Speaker 2>Yeah, I just episode as well.

1052
01:09:35.880 --> 01:09:39.560
<v Speaker 3>Yeah, and the other one is something with this really

1053
01:09:39.600 --> 01:09:42.800
<v Speaker 3>cool name called Shadow Realm. I guess we'll need to

1054
01:09:42.840 --> 01:09:45.359
<v Speaker 3>find a different episode to talk about that one. It's

1055
01:09:45.399 --> 01:09:48.079
<v Speaker 3>that one is currently in stage two point seven, which

1056
01:09:48.119 --> 01:09:55.640
<v Speaker 3>means it's not even stage three, but it sounds good. Yeah.

1057
01:09:55.680 --> 01:09:57.960
<v Speaker 3>You know, one of the things that I've been thinking about,

1058
01:09:58.319 --> 01:10:01.640
<v Speaker 3>and maybe if we get requests from our audience to

1059
01:10:01.720 --> 01:10:05.479
<v Speaker 3>do it, is to do another episode about JavaScript features

1060
01:10:05.600 --> 01:10:10.640
<v Speaker 3>stuck in Purgatory. There are a whole bunch of really yeah,

1061
01:10:10.720 --> 01:10:14.239
<v Speaker 3>there are a whole bunch of really interesting JavaScript features

1062
01:10:14.239 --> 01:10:17.720
<v Speaker 3>that have been staged two for like what feels like forever.

1063
01:10:19.640 --> 01:10:22.279
<v Speaker 3>I wonder if it's worthwhile to actually even talk about them,

1064
01:10:22.319 --> 01:10:24.520
<v Speaker 3>because on the one hand, some of them are really

1065
01:10:24.560 --> 01:10:27.479
<v Speaker 3>cool and really interesting and they add a lot of

1066
01:10:28.039 --> 01:10:31.720
<v Speaker 3>really interesting twists to the JavaScript language. But on the

1067
01:10:31.760 --> 01:10:36.720
<v Speaker 3>other hand, it seems like they're just they're just stuck there.

1068
01:10:37.039 --> 01:10:39.640
<v Speaker 3>So the committee is not really doing away with them,

1069
01:10:40.000 --> 01:10:43.439
<v Speaker 3>but they're also not progressing them. They're so they're kind

1070
01:10:43.439 --> 01:10:46.279
<v Speaker 3>of stuck. I wonder if it's worthwhile to even talk

1071
01:10:46.319 --> 01:10:47.640
<v Speaker 3>about them. What do you think?

1072
01:10:48.920 --> 01:10:52.600
<v Speaker 1>I think that would definitely be interesting. It's also interesting

1073
01:10:52.680 --> 01:10:57.439
<v Speaker 1>sometimes the how do I put it, There are things

1074
01:10:57.520 --> 01:10:59.960
<v Speaker 1>that kind of float.

1075
01:10:59.600 --> 01:11:00.520
<v Speaker 2>Out there for a while.

1076
01:11:00.560 --> 01:11:03.840
<v Speaker 1>I'll go back to the legislative example, right because I mentioned,

1077
01:11:03.880 --> 01:11:06.760
<v Speaker 1>you know, laws passing and bills passing and stuff. There

1078
01:11:06.760 --> 01:11:09.079
<v Speaker 1>are things that get proposed like every year that just

1079
01:11:09.159 --> 01:11:13.800
<v Speaker 1>never quite get enough traction. And sometimes what's needed is

1080
01:11:13.840 --> 01:11:17.039
<v Speaker 1>somebody just points it out and then all of a sudden,

1081
01:11:17.079 --> 01:11:20.119
<v Speaker 1>some energy comes up behind it and things move, And

1082
01:11:20.199 --> 01:11:24.439
<v Speaker 1>so I'm imagining that, you know, I don't know that

1083
01:11:24.479 --> 01:11:27.800
<v Speaker 1>we have that bit that kind of influence necessarily, but

1084
01:11:27.960 --> 01:11:31.520
<v Speaker 1>it could start the process so that other folks start

1085
01:11:31.560 --> 01:11:35.439
<v Speaker 1>talking about it too. And we get some exposure as

1086
01:11:35.439 --> 01:11:38.159
<v Speaker 1>far as oh, this really is a good idea, and

1087
01:11:38.199 --> 01:11:40.359
<v Speaker 1>we ought to just go and finish it, right, whether

1088
01:11:40.439 --> 01:11:44.600
<v Speaker 1>that's maybe we modify it to solve some of the concerns,

1089
01:11:44.840 --> 01:11:47.119
<v Speaker 1>or you know, there's a little bit more work put

1090
01:11:47.119 --> 01:11:49.920
<v Speaker 1>into just you know, putting the polish on it or whatever,

1091
01:11:50.000 --> 01:11:53.119
<v Speaker 1>and then we get another cool thing in JavaScript.

1092
01:11:53.920 --> 01:11:56.840
<v Speaker 3>Yeah, and I would imagine that AJ would be really

1093
01:11:56.880 --> 01:12:00.800
<v Speaker 3>happy that they're not here yet, not to hear maybe forever.

1094
01:12:02.640 --> 01:12:05.960
<v Speaker 1>Yeah, well cool, Well, yeah, I mean all of this

1095
01:12:06.000 --> 01:12:09.680
<v Speaker 1>stuff's really really fascinating and I'm looking forward to hopefully

1096
01:12:09.680 --> 01:12:12.199
<v Speaker 1>seeing more and more people use some of these features.

1097
01:12:13.119 --> 01:12:15.239
<v Speaker 3>Yeah, all the features that we spoke about today are

1098
01:12:15.279 --> 01:12:19.239
<v Speaker 3>effectively in the language, so there's absolutely no reason not

1099
01:12:19.359 --> 01:12:21.920
<v Speaker 3>to use them. And in fact, as I explained, in

1100
01:12:21.960 --> 01:12:25.640
<v Speaker 3>some cases it's preferably preferable to use them rather than

1101
01:12:25.640 --> 01:12:30.319
<v Speaker 3>the alternatives. So as an example, again, instead of dot reverse,

1102
01:12:31.000 --> 01:12:35.560
<v Speaker 3>use two reversed. That's like a prime example of something

1103
01:12:35.560 --> 01:12:38.399
<v Speaker 3>that we should use. Or another one, if you're doing

1104
01:12:38.399 --> 01:12:43.199
<v Speaker 3>all sorts of mathematical operations with unions, then maybe instead

1105
01:12:43.239 --> 01:12:47.560
<v Speaker 3>of using some NPM package, you just use what's now

1106
01:12:47.600 --> 01:12:49.880
<v Speaker 3>built into the JavaScript language itself.

1107
01:12:51.359 --> 01:12:54.560
<v Speaker 2>Yeah, so I did a search on Shadow Realm, and

1108
01:12:54.600 --> 01:12:55.279
<v Speaker 2>it looks like.

1109
01:12:55.199 --> 01:13:00.439
<v Speaker 1>There's a Twilight something Twilight I think it's D and

1110
01:13:00.520 --> 01:13:03.159
<v Speaker 1>D book that's called Shadow Realm.

1111
01:13:03.479 --> 01:13:05.520
<v Speaker 2>And then there were.

1112
01:13:05.399 --> 01:13:10.199
<v Speaker 1>Like eighteen of the front page links were you gi

1113
01:13:10.279 --> 01:13:13.039
<v Speaker 1>oh okay card game?

1114
01:13:13.159 --> 01:13:15.920
<v Speaker 3>So in other way, it must be a cool Java's

1115
01:13:15.960 --> 01:13:18.680
<v Speaker 3>good feature if it's called shadow Realm. I mean, right,

1116
01:13:19.239 --> 01:13:20.319
<v Speaker 3>the name is really cool.

1117
01:13:21.000 --> 01:13:24.439
<v Speaker 1>Yeah, So anyway, but yeah, I'd love to dive into

1118
01:13:24.439 --> 01:13:26.279
<v Speaker 1>some of these features. Yeah, some of the ones that

1119
01:13:26.319 --> 01:13:29.000
<v Speaker 1>are in limbo or purgatory or whatever you want to

1120
01:13:29.000 --> 01:13:32.359
<v Speaker 1>call it. And yeah, but it's also good to just

1121
01:13:32.399 --> 01:13:35.800
<v Speaker 1>see some of this stuff come along. And like you said,

1122
01:13:36.000 --> 01:13:39.600
<v Speaker 1>none of these are huge changes, but some of these

1123
01:13:39.880 --> 01:13:43.079
<v Speaker 1>sure seem like they'd make my coding either more stable

1124
01:13:43.199 --> 01:13:44.479
<v Speaker 1>or easier to do, and so.

1125
01:13:46.760 --> 01:13:51.680
<v Speaker 2>I'm all about that. So all right, well, let's go

1126
01:13:51.680 --> 01:13:54.239
<v Speaker 2>ahead and do our picks. Do you want to do

1127
01:13:54.279 --> 01:13:55.800
<v Speaker 2>picks first or do you want me to go first?

1128
01:13:56.079 --> 01:13:59.399
<v Speaker 3>I can go first. So first of all, people are

1129
01:13:59.399 --> 01:14:01.239
<v Speaker 3>listening my I've noticed that I've got a bit of

1130
01:14:01.319 --> 01:14:03.520
<v Speaker 3>a head cold and the stuff he knows, hopefully that

1131
01:14:03.680 --> 01:14:05.800
<v Speaker 3>goes away. So my first pick would be for my

1132
01:14:05.840 --> 01:14:10.560
<v Speaker 3>head cault to go away. Yeah, it's not really such

1133
01:14:10.600 --> 01:14:14.199
<v Speaker 3>a huge bother, just annoying, So that would be my

1134
01:14:14.199 --> 01:14:16.439
<v Speaker 3>first pick. My second pick is, we actually had a

1135
01:14:16.479 --> 01:14:19.960
<v Speaker 3>fun day to day at work. We are the team

1136
01:14:20.000 --> 01:14:22.720
<v Speaker 3>that I'm mostly working with. We went out together to

1137
01:14:22.760 --> 01:14:26.239
<v Speaker 3>do to play laser Tag, which was a whole was

1138
01:14:26.600 --> 01:14:29.159
<v Speaker 3>a lot of fun. So my second pick would be

1139
01:14:29.239 --> 01:14:34.000
<v Speaker 3>to have fun days as team building exercises. And the

1140
01:14:34.119 --> 01:14:36.079
<v Speaker 3>third pick would be to do it a laser tag

1141
01:14:36.119 --> 01:14:40.199
<v Speaker 3>game because it's just fun. And those would be my

1142
01:14:40.319 --> 01:14:41.800
<v Speaker 3>picks for today. Short and sweet.

1143
01:14:42.239 --> 01:14:47.319
<v Speaker 2>Yeah, laser Tag is fun. I'm gonna pick it's it's

1144
01:14:47.359 --> 01:14:50.479
<v Speaker 2>a second version of a board game I've picked in

1145
01:14:50.479 --> 01:14:53.479
<v Speaker 2>the past, so I've picked Machi Koro in the past,

1146
01:14:54.399 --> 01:14:59.520
<v Speaker 2>and essentially, just to give you an overview of Machi Korro, essentially,

1147
01:14:59.520 --> 01:15:00.520
<v Speaker 2>your building a town.

1148
01:15:01.920 --> 01:15:05.920
<v Speaker 1>You buy buildings, and then you roll dice and you

1149
01:15:05.960 --> 01:15:11.279
<v Speaker 1>get money based on whether it's somebody else's team or

1150
01:15:11.319 --> 01:15:13.319
<v Speaker 1>your team, and whether you have a card with that

1151
01:15:13.399 --> 01:15:17.319
<v Speaker 1>number on it, and then you buy landmarks and once

1152
01:15:17.359 --> 01:15:19.920
<v Speaker 1>you've built all four landmarks, you win. That's Machi Korro.

1153
01:15:20.640 --> 01:15:25.399
<v Speaker 1>Machi Koro two is a little bit different, so instead

1154
01:15:25.399 --> 01:15:27.560
<v Speaker 1>of building four landmarks, you only have to build three.

1155
01:15:29.159 --> 01:15:31.560
<v Speaker 1>But the other thing is is that in Machi Koro

1156
01:15:32.079 --> 01:15:34.439
<v Speaker 1>you put out all the different types of buildings you

1157
01:15:34.439 --> 01:15:38.119
<v Speaker 1>can build in your town. In Machi Koro two, what

1158
01:15:38.199 --> 01:15:41.600
<v Speaker 1>you do is you have decks of cards that have

1159
01:15:41.720 --> 01:15:44.359
<v Speaker 1>numbers one through six, decks of cards that have numbers

1160
01:15:44.399 --> 01:15:46.279
<v Speaker 1>seven through twelve, and then you have landmarks.

1161
01:15:46.840 --> 01:15:49.560
<v Speaker 2>And so you flip cards over until you.

1162
01:15:49.479 --> 01:15:56.199
<v Speaker 1>Have basically five unique buildings in each row, and then

1163
01:15:56.479 --> 01:15:59.399
<v Speaker 1>you win when you build three landmarks. And so you

1164
01:15:59.439 --> 01:16:01.279
<v Speaker 1>play the rest of the game plays the same. You

1165
01:16:01.359 --> 01:16:04.279
<v Speaker 1>roll the dice, if you have the building, you get

1166
01:16:04.319 --> 01:16:11.439
<v Speaker 1>paid the landmarks in Machi Korro, the original have fixed

1167
01:16:11.439 --> 01:16:12.840
<v Speaker 1>pricing for each landmark.

1168
01:16:13.279 --> 01:16:16.520
<v Speaker 2>In Machi Korro too. Your first landmark has a cost,

1169
01:16:16.560 --> 01:16:18.600
<v Speaker 2>your second landmark has a cost, and your third landmark

1170
01:16:18.600 --> 01:16:20.239
<v Speaker 2>has a cost, and those costs are on the card.

1171
01:16:20.680 --> 01:16:22.880
<v Speaker 1>I mean, those are the only differences. The rest of

1172
01:16:22.920 --> 01:16:25.760
<v Speaker 1>the game plays the same. It does give you a

1173
01:16:25.760 --> 01:16:28.560
<v Speaker 1>little bit more variety, and it makes the strategy just

1174
01:16:28.600 --> 01:16:33.920
<v Speaker 1>slightly a little bit more. You really have to think

1175
01:16:33.960 --> 01:16:36.119
<v Speaker 1>about it a little extra in order to get what

1176
01:16:36.199 --> 01:16:39.680
<v Speaker 1>you want, because the cards do give you different abilities,

1177
01:16:39.920 --> 01:16:42.439
<v Speaker 1>but it's not such a wide breadth of abilities that

1178
01:16:42.479 --> 01:16:43.399
<v Speaker 1>you're going, oh.

1179
01:16:43.239 --> 01:16:46.000
<v Speaker 2>Man, I don't know how to figure this game out.

1180
01:16:46.159 --> 01:16:52.159
<v Speaker 2>So we played it with some friends of ours. We

1181
01:16:52.199 --> 01:16:54.479
<v Speaker 2>got it for Christmas, my family did.

1182
01:16:54.920 --> 01:16:58.119
<v Speaker 1>And it's board game geek has a weight of one

1183
01:16:58.119 --> 01:17:00.840
<v Speaker 1>point four to eight, so it's still a pretty simple game.

1184
01:17:00.880 --> 01:17:03.840
<v Speaker 1>I think Machi Koro's like one point three. So yeah,

1185
01:17:04.039 --> 01:17:08.159
<v Speaker 1>very very approachable. Simple game. Says age ten plus can

1186
01:17:08.199 --> 01:17:08.560
<v Speaker 1>play it.

1187
01:17:09.159 --> 01:17:10.000
<v Speaker 2>My daughter's nine.

1188
01:17:10.039 --> 01:17:13.439
<v Speaker 1>I think she'd be fine playing this game. It says

1189
01:17:13.439 --> 01:17:16.239
<v Speaker 1>playtimes forty five minutes. I'm not sure if I remember

1190
01:17:16.239 --> 01:17:17.920
<v Speaker 1>how long it took us. Probably about that long.

1191
01:17:18.560 --> 01:17:21.800
<v Speaker 2>So anyway, it's a fun game if you're looking for

1192
01:17:21.880 --> 01:17:27.640
<v Speaker 2>just something short, not terribly complicated that you can play

1193
01:17:27.680 --> 01:17:30.119
<v Speaker 2>and kind of chat over the table while you play it.

1194
01:17:31.399 --> 01:17:34.079
<v Speaker 3>Chuck, I'm kind of curious, since you are such a

1195
01:17:34.119 --> 01:17:38.720
<v Speaker 3>board game geek slash expert, if you had to name

1196
01:17:38.960 --> 01:17:42.920
<v Speaker 3>your like top board game, or at least one of

1197
01:17:42.960 --> 01:17:45.880
<v Speaker 3>your top board games, just out of curiosity, what would

1198
01:17:45.880 --> 01:17:50.399
<v Speaker 3>that be? One in the top three or top five? Please?

1199
01:17:51.600 --> 01:17:56.359
<v Speaker 2>So that's a little bit tricky, just because there's so

1200
01:17:56.439 --> 01:17:57.960
<v Speaker 2>many kinds of board games.

1201
01:17:59.159 --> 01:18:01.520
<v Speaker 3>Yeah, but there must be something you really like.

1202
01:18:02.880 --> 01:18:06.479
<v Speaker 1>So the ones that I've been playing a bunch lately

1203
01:18:07.960 --> 01:18:09.319
<v Speaker 1>and I can, I can give you a couple of them.

1204
01:18:09.359 --> 01:18:10.720
<v Speaker 2>I've already picked them on the show.

1205
01:18:11.920 --> 01:18:14.520
<v Speaker 3>I'm just curious which one you like the most.

1206
01:18:16.399 --> 01:18:17.800
<v Speaker 2>I'd really have to think about that.

1207
01:18:17.960 --> 01:18:19.720
<v Speaker 1>Like I said, the ones that we've been playing lately

1208
01:18:19.760 --> 01:18:26.479
<v Speaker 1>that we're really liking our Mysterium. We got expansion for that.

1209
01:18:27.000 --> 01:18:29.880
<v Speaker 1>It doesn't change the gameplay at all. It's just more cards.

1210
01:18:31.720 --> 01:18:32.880
<v Speaker 1>We got two expansions.

1211
01:18:33.520 --> 01:18:35.840
<v Speaker 2>The other one that we've been playing lately is Betrayal

1212
01:18:36.000 --> 01:18:38.800
<v Speaker 2>at House on the Hill. I should put links to

1213
01:18:38.840 --> 01:18:41.279
<v Speaker 2>these in here. And that one's a fun one.

1214
01:18:41.359 --> 01:18:44.199
<v Speaker 1>It's it's relatively fast too, but it's more of a

1215
01:18:45.279 --> 01:18:50.720
<v Speaker 1>role play game almost. The idea is you have you're

1216
01:18:50.760 --> 01:18:53.279
<v Speaker 1>a group of people that come into a haunted house,

1217
01:18:54.039 --> 01:18:57.279
<v Speaker 1>and you explore the house, and eventually a haunting happens,

1218
01:18:57.319 --> 01:19:00.880
<v Speaker 1>and then you're trying to complete goals. One of you

1219
01:19:01.000 --> 01:19:04.680
<v Speaker 1>frequently becomes the trader, almost always, not always, but almost always,

1220
01:19:04.800 --> 01:19:07.359
<v Speaker 1>one of you becomes the trader, and then everybody's playing

1221
01:19:07.359 --> 01:19:12.840
<v Speaker 1>against that other player. And the thing that's fun about

1222
01:19:12.840 --> 01:19:16.279
<v Speaker 1>it is that the scenario you wind up playing changes

1223
01:19:16.319 --> 01:19:20.800
<v Speaker 1>from game to game, and so it's and the as

1224
01:19:20.840 --> 01:19:23.800
<v Speaker 1>you explore a room, you place tiles for the rooms,

1225
01:19:23.840 --> 01:19:26.159
<v Speaker 1>and so your map changes every game too, and so

1226
01:19:26.880 --> 01:19:34.000
<v Speaker 1>there's a lot to like about that. Honestly, sometimes I

1227
01:19:34.079 --> 01:19:41.399
<v Speaker 1>really really like the kind of the thinker games. I'm

1228
01:19:41.439 --> 01:19:45.239
<v Speaker 1>not so some of the big big ones that people

1229
01:19:45.279 --> 01:19:48.239
<v Speaker 1>tend to like that I'm not a fan of, or

1230
01:19:48.359 --> 01:19:51.520
<v Speaker 1>like Seven Wonders, or there are some.

1231
01:19:51.399 --> 01:19:54.960
<v Speaker 2>Of them where you're almost playing your own game and

1232
01:19:55.000 --> 01:19:57.159
<v Speaker 2>then at the end you see who played it the best.

1233
01:19:57.039 --> 01:19:59.520
<v Speaker 1>But you do interact with each other as far as

1234
01:19:59.560 --> 01:20:02.079
<v Speaker 1>did I do better at you with this than that?

1235
01:20:04.680 --> 01:20:06.479
<v Speaker 1>But then you've got other games.

1236
01:20:06.520 --> 01:20:07.079
<v Speaker 2>I'm trying to think.

1237
01:20:07.079 --> 01:20:10.359
<v Speaker 1>We've been playing Risk Legacy, which I like but I

1238
01:20:10.359 --> 01:20:16.039
<v Speaker 1>don't love. With my friends, we played Heat, and I.

1239
01:20:16.000 --> 01:20:18.920
<v Speaker 3>Think with Risk is that play properly it can take

1240
01:20:18.960 --> 01:20:19.880
<v Speaker 3>such a long time.

1241
01:20:20.680 --> 01:20:23.119
<v Speaker 2>Yeah, And we're getting to the stage with Risk Legacy.

1242
01:20:23.159 --> 01:20:26.279
<v Speaker 2>So Risk Legacy modifies the board every time and has

1243
01:20:26.279 --> 01:20:28.720
<v Speaker 2>special rules for how you win, and so it doesn't

1244
01:20:28.760 --> 01:20:29.840
<v Speaker 2>take as long.

1245
01:20:30.159 --> 01:20:32.880
<v Speaker 1>But the last time we played it, it's starting to

1246
01:20:32.920 --> 01:20:34.960
<v Speaker 1>get to the point where you really almost have to

1247
01:20:34.960 --> 01:20:37.079
<v Speaker 1>do world domination to win the round.

1248
01:20:37.600 --> 01:20:41.439
<v Speaker 2>And so it does take quite a bit longer. Yeah,

1249
01:20:41.520 --> 01:20:44.640
<v Speaker 2>I tend to like Settlers of Catan.

1250
01:20:45.880 --> 01:20:47.319
<v Speaker 1>That was one of the games that I kind of

1251
01:20:47.399 --> 01:20:54.960
<v Speaker 1>got into gaming board gaming on. But anymore, it's like

1252
01:20:55.000 --> 01:20:57.760
<v Speaker 1>there are so many games that just have better mechanisms

1253
01:20:57.760 --> 01:20:58.079
<v Speaker 1>in them.

1254
01:20:59.000 --> 01:21:03.640
<v Speaker 3>And so, yeah, if if somebody likes Catan and wants

1255
01:21:03.680 --> 01:21:08.840
<v Speaker 3>a better alternative, what would you recommend? Uh, well, you

1256
01:21:08.880 --> 01:21:09.920
<v Speaker 3>need to think about.

1257
01:21:09.640 --> 01:21:13.000
<v Speaker 2>It, Yeah I do. Uh let me let me. I'll

1258
01:21:13.319 --> 01:21:16.000
<v Speaker 2>I'll come next time with my top two or three.

1259
01:21:15.800 --> 01:21:18.039
<v Speaker 3>Games that your homework for next time.

1260
01:21:18.840 --> 01:21:20.000
<v Speaker 2>Yeah, but I will tell you that.

1261
01:21:20.600 --> 01:21:26.640
<v Speaker 1>Yeah, for the social games, we're really liking Mysterium. If

1262
01:21:26.680 --> 01:21:30.880
<v Speaker 1>you want a lighter social game, things like Sushi Go

1263
01:21:31.000 --> 01:21:35.359
<v Speaker 1>Party are fun if you're if you're looking at like

1264
01:21:35.479 --> 01:21:38.399
<v Speaker 1>maps and things like that. I mean, there are games

1265
01:21:38.439 --> 01:21:41.359
<v Speaker 1>out there. I kind of have this nostalgic feel for

1266
01:21:43.520 --> 01:21:45.439
<v Speaker 1>Access and Allies. But that's another one.

1267
01:21:45.279 --> 01:21:48.039
<v Speaker 2>That takes like three or four hours to play.

1268
01:21:51.119 --> 01:21:52.800
<v Speaker 1>Yeah, there are a bunch of good ones out there.

1269
01:21:52.880 --> 01:21:54.479
<v Speaker 1>Let me think about that and I'll come back to it.

1270
01:21:54.520 --> 01:21:57.119
<v Speaker 3>But to be honest, I don't see myself playing a

1271
01:21:57.119 --> 01:21:58.800
<v Speaker 3>board game for six hours.

1272
01:21:59.399 --> 01:22:01.279
<v Speaker 2>Yeah. The ones that I like, they take you about

1273
01:22:01.319 --> 01:22:03.800
<v Speaker 2>an hour and a half, and.

1274
01:22:05.079 --> 01:22:09.000
<v Speaker 1>You have some idea about where you're at as far

1275
01:22:09.079 --> 01:22:11.800
<v Speaker 1>as like am I winning or not, but you don't

1276
01:22:12.279 --> 01:22:16.319
<v Speaker 1>entirely know because there's always some twist that you know,

1277
01:22:16.560 --> 01:22:19.119
<v Speaker 1>and so somebody could be building towards something and you

1278
01:22:19.159 --> 01:22:21.359
<v Speaker 1>don't really see it until they resolve it and then

1279
01:22:21.399 --> 01:22:24.319
<v Speaker 1>you go oh wow, right, but then you turn around

1280
01:22:24.359 --> 01:22:26.399
<v Speaker 1>and you resolve your thing on the next turn, and

1281
01:22:26.399 --> 01:22:30.600
<v Speaker 1>then everybody goes, oh, now he's you know. So those

1282
01:22:30.640 --> 01:22:32.760
<v Speaker 1>are the kinds that I like, and the ones where

1283
01:22:32.920 --> 01:22:37.720
<v Speaker 1>I have enough room to get creative on the strategy right,

1284
01:22:38.079 --> 01:22:40.039
<v Speaker 1>where there's not just kind of a tried and true

1285
01:22:40.279 --> 01:22:41.880
<v Speaker 1>if you do this every time you're going to win,

1286
01:22:42.560 --> 01:22:47.119
<v Speaker 1>they go yeah, go is a good example of that

1287
01:22:48.279 --> 01:22:59.800
<v Speaker 1>with fairly simple rules. So anyway, other picks, My wife

1288
01:22:59.840 --> 01:23:02.239
<v Speaker 1>and I started watching prison Break, which is an older

1289
01:23:02.319 --> 01:23:03.199
<v Speaker 1>TV show.

1290
01:23:03.039 --> 01:23:06.279
<v Speaker 3>On Oh yeah, that's on the nineties.

1291
01:23:06.319 --> 01:23:12.680
<v Speaker 1>I think I think it's early two thousand's but still. Yeah,

1292
01:23:12.680 --> 01:23:15.079
<v Speaker 1>I've been liking that. I'm still watching. I have the

1293
01:23:15.159 --> 01:23:21.880
<v Speaker 1>last season of what's it called Reacher, No, not Reacher

1294
01:23:22.920 --> 01:23:24.680
<v Speaker 1>Jack Ryan. I've been watching that.

1295
01:23:25.119 --> 01:23:27.479
<v Speaker 3>Yeah, I tried to watch it. I couldn't really get

1296
01:23:27.520 --> 01:23:31.920
<v Speaker 3>into it. I actually read some of the what's his

1297
01:23:32.000 --> 01:23:34.720
<v Speaker 3>name Clancy I think, Uh, yeah, I read some of

1298
01:23:34.720 --> 01:23:37.359
<v Speaker 3>the books. Yeah, I read some of the Tom Clancy books.

1299
01:23:37.359 --> 01:23:40.039
<v Speaker 3>I could never actually get into either the movies or

1300
01:23:40.079 --> 01:23:41.239
<v Speaker 3>the TV shows. I don't know.

1301
01:23:41.399 --> 01:23:46.600
<v Speaker 1>Yeah, there are older movies to hunt for. Red October

1302
01:23:46.680 --> 01:23:47.439
<v Speaker 1>is a terrific book.

1303
01:23:48.159 --> 01:23:50.760
<v Speaker 3>Yeah, that's his best one, I think.

1304
01:23:51.600 --> 01:23:54.399
<v Speaker 1>Yeah, I've read a few others of his books. But

1305
01:23:55.760 --> 01:23:59.760
<v Speaker 1>the TV show is not based on any.

1306
01:23:59.560 --> 01:24:02.399
<v Speaker 2>Of the books. Oh yeah, they just pulled some of

1307
01:24:02.439 --> 01:24:05.399
<v Speaker 2>the characters out and they basically have a new threat

1308
01:24:05.479 --> 01:24:12.840
<v Speaker 2>every season. That said, it's not the best ever kind

1309
01:24:12.840 --> 01:24:16.319
<v Speaker 2>of action spy TV show that I've ever seen, but

1310
01:24:16.359 --> 01:24:17.119
<v Speaker 2>I'm enjoying it.

1311
01:24:17.880 --> 01:24:20.600
<v Speaker 3>If you've got Peacock, I would I actually picked it

1312
01:24:20.840 --> 01:24:23.199
<v Speaker 3>a while back, but it might be nice for you

1313
01:24:23.239 --> 01:24:25.439
<v Speaker 3>to watch. If you've got Peacock. I don't know who

1314
01:24:25.520 --> 01:24:28.960
<v Speaker 3>has Peacock, but I do. Then it's a Day of

1315
01:24:28.960 --> 01:24:29.439
<v Speaker 3>the Jackal.

1316
01:24:30.600 --> 01:24:33.199
<v Speaker 1>Yeah, you recommended that a few weeks ago, and that's

1317
01:24:33.279 --> 01:24:39.880
<v Speaker 1>kind of on my list. But yeah, anyway, so I've

1318
01:24:39.920 --> 01:24:42.439
<v Speaker 1>been watching that. I'm in the middle right now, and

1319
01:24:42.479 --> 01:24:45.840
<v Speaker 1>I'm gonna pick these books again. I'm on book like

1320
01:24:46.000 --> 01:24:50.600
<v Speaker 1>nine or ten of the sort of truth books, and

1321
01:24:50.760 --> 01:24:55.640
<v Speaker 1>they they are so good. I've gotten so I read

1322
01:24:55.640 --> 01:24:58.079
<v Speaker 1>them in high school and then I hadn't really touched

1323
01:24:58.079 --> 01:25:01.319
<v Speaker 1>them again, and so he put out more books. The

1324
01:25:01.359 --> 01:25:04.840
<v Speaker 1>author had passed away a few years ago, but he

1325
01:25:05.359 --> 01:25:06.199
<v Speaker 1>wrote like very good.

1326
01:25:07.359 --> 01:25:11.399
<v Speaker 3>Yeah, I recall reading some of his stuff. I'm trying

1327
01:25:11.399 --> 01:25:12.119
<v Speaker 3>to remember what.

1328
01:25:13.680 --> 01:25:22.359
<v Speaker 2>Yeah, those were his big series, but yeah, I.

1329
01:25:20.720 --> 01:25:23.319
<v Speaker 3>Yeah, see he died five years ago.

1330
01:25:24.560 --> 01:25:29.640
<v Speaker 1>But anyway, he's I've just been really really enjoying these books,

1331
01:25:29.680 --> 01:25:33.560
<v Speaker 1>and so yeah, I'll pick those as well. I don't know,

1332
01:25:33.560 --> 01:25:36.119
<v Speaker 1>I'm kind of rambling at this point because you derailed

1333
01:25:36.159 --> 01:25:37.920
<v Speaker 1>me with the question about board games.

1334
01:25:38.039 --> 01:25:41.439
<v Speaker 2>But yeah, and then I'm.

1335
01:25:41.359 --> 01:25:44.880
<v Speaker 1>Just working on getting JavaScript Geniuses and the AI boot

1336
01:25:44.920 --> 01:25:53.520
<v Speaker 1>camp roll it out. So yeah, anyway, I guess we'll

1337
01:25:53.560 --> 01:25:55.520
<v Speaker 1>wrap it up because I am not going to keep

1338
01:25:55.560 --> 01:25:56.680
<v Speaker 1>rambling about this stuff.

1339
01:25:59.359 --> 01:26:01.399
<v Speaker 2>But yeah, until next time, pokes Max out
