00:12
<styfle>
Thanks! I updated the readme and transferred it to the org: https://github.com/tc39-transfer/proposal-import-bytes
17:06
<bakkot>
queue needs to be advanced I think
17:06
<Michael Ficarra>
reminder: add your slides links to the notes
17:10
<nicolo-ribaudo>
Does anybody have the link to share here?
17:11
<nicolo-ribaudo>
Also, I still see the queue at the notetakers item
17:13
<Justin Ridgewell>
I advanced the queue
17:20
<Chris de Almeida>
if this gets stage 2, don't let us forget to assign reviewers 😇
17:25
<ljharb>
kevin, those don't cover symbols, only strings (re tcq)
17:26
<ljharb>
but if you mean the weird API design part, yes, and it's gross
17:30
<nicolo-ribaudo>
Are there use cases for having just the number of symbols?
17:31
<Michael Ficarra>
I like the -Length functions design
17:31
<nicolo-ribaudo>
The readme has a ton of links, last time I asked to write for the various links which option they are supporting, but it has not been done, so it's difficult to actually navigate through them
17:32
<kriskowal>
I like -Length and has- as a mnemonic pattern.
17:32
<nicolo-ribaudo>

I really struggle to imagine use cases other than for:

  • count all properties
  • count all enumerable properties

maybe with the matrix of "include all properties, or just string properties"

17:34
<kriskowal>
MarkM wrote a summary of property enumeration for our own edification at Agoric/Endo and I captured them for posterity here https://kriskowal.com/enumerating-properties/
17:37
<Michael Ficarra>
steal time from the other presentations?
17:37
<ljharb>
@erights Mark Miller (Agoric) MM: fwiw it does whatever you'd expect it to do on proxies, via the internal methods, just like the existing methods
17:38
<bakkot>
Ruben: assuming you mean https://github.com/tc39/proposal-object-property-count/issues/2#issuecomment-2784901702, many of those examples are devtools or otherwise not super relevant (like babel's object spread helper)
17:38
<Richard Gibson>
I don't think "whatever you'd expect" is coherent, because property keys are reported by one trap while property attributes are reported by another, so the two can disagree
17:39
<ljharb>
i mean, in terms of impact - babel's object spread helper alone being made faster is probably more beneficial to the web than many of the proposals we've advanced in the last couple years
17:39
<bakkot>
the spread operator isn't doing a count, to be clear
17:39
<ljharb>
ah, ok fair. the current spec did make a choice, iirc it's calling "ownpropertykeys"
17:39
<bakkot>
it's actually spreading enumerable symbols
17:39
<ljharb>
ah k
17:39
<bakkot>
so it isn't relevant to this proposal
17:41
<Richard Gibson>
right, but that doesn't expose enumerability
17:41
<ljharb>
it has to get the property descriptor for each key as well, yep
17:42
<ljharb>
same approach as https://tc39.es/ecma262/#sec-object.getownpropertydescriptors, iirc
17:42
<bakkot>
I still like my "just add fooLength versions of all the foo methods" suggestion, which answers this trivially
17:42
<Richard Gibson>
so the question basically comes down to: what happens when getOwnPropertyDescriptor reports nonexistence of a key that was returned from ownKeys?
17:43
<ljharb>
the same thing that Object.getOwnPropertyDescriptors does - it skips it
17:43
<Ashley Claymore>
What happens is you know you've found a proxy
17:44
<nicolo-ribaudo>

| | enmumerable | non-enumerable | all |
| ----------- | --------------- | ------------------ | ------- |
| strings | ✔️ | | ✔️ |
| symbols | ? | |
| all | ✔️ | | ✔️ |

Fyi here the checkmark is for where I'm convinced that there may be a use case (the question mark is where I'm very little convinced but more than zero). I'd like to see examples showing that the usage of the rest is so widespread that it makes more sense to design an API to explicitly support it rather than just do the difference of the other two things in the same row/column.

17:44
<ljharb>
(tbh i'm not sure why it's important what happens with a misbehaving proxy as long as it accounts for it)
17:44
<nicolo-ribaudo>
Come on matrix
17:44
<nicolo-ribaudo>
Because a 3x3 matrix with only the corners filled in is just a complete 2x2 matrix
17:44
<ljharb>
i often need all symbols
17:44
<nicolo-ribaudo>
Can you show me one code example?
17:45
<bakkot>
I have ever needed all symbols but I don't think I've ever need the number of all symbols
17:45
<ljharb>
true, the code example i was about to provide isn't getting the count, let me look more
17:53
<ljharb>
k well i can't actually find a case where i need the count of symbols and not the actual symbols themselves
17:54
<ljharb>
although if getting the count was much faster than getting the symbols themselves, i'd probably change a bunch of places to check the count first - that's a lot of "if"s tho
17:57
<Ashley Claymore>
arr.toSliced() will give you a dense array even if the original had holes
17:57
<Ashley Claymore>
oh no, not that one that my brain llm made up
17:57
<Ashley Claymore>
The other ones
17:58
<bakkot>
  • Reflect.ownKeysLength
  • Object.keysLength
  • Object.getOwnPropertyNamesLength
  • Object.getOwnPropertySymbolsLength

doesn't give you (string + symbol) x (enumerable) though I guess I would be open to a proposal for a new way to get values for (string + symbol) x (enumerable), and then also have the fooLength version of that

18:00
<Richard Gibson>
that method doesn't exist, but arr.toSpliced() does
18:00
<ljharb>
.slice()
18:00
<Richard Gibson>
nope, .slice() preserves holes
18:00
<ljharb>
oh oof, ok
18:01
<ljharb>
.flatMap(x => [x]) :-p
18:01
<ljharb>
so like, Reflect.ownEnumerableKeys?
18:01
<bakkot>
yeah sure
18:03
<Richard Gibson>
seeing those written out, I would prefer "count" rather than "length"
18:03
<snek>
[...array] kills holes right
18:03
<snek>
and ensures you have a real array
18:03
<snek>
all in one glorious expression
18:04
<rbuckton>
Yes, though holes are removed rather than replaced with undefined, so indices to elements change.
18:04
<Chris de Almeida>
nicolo-ribaudo: your topic is still in the queue
18:04
<Chris de Almeida>
(next)
18:04
<snek>
looks like they are replaced with undefined
18:05
<ljharb>
a glorious one that uses the much slower iterator protocol :-(
18:05
<ljharb>
Array.from() might work tho
18:05
<snek>
Array.from does it too
18:05
<snek>
both are probably better optimization targets than isSparse branches
18:05
<waldemar>
+1 on Nicolo's comment
18:06
<Richard Gibson>
.toSpliced() does not use Symbol.iterator
18:06
<ljharb>
the problem tho isn't "we don't want sparse arrays", it's "to accurately describe this object we need to know if it's sparse", so densification doesn't help
18:07
<Justin Ridgewell>
My topic: we can solve this with the previous property count proposal.
18:07
<Justin Ridgewell>
We don't need a sparse check that depends on internal engine details
18:07
<nicolo-ribaudo>
Wouldn;t [1, , 3, foo: 4] look like it's dense
18:07
<Justin Ridgewell>
A dense array has Object.keys(arr).length === arr.length
18:07
<Richard Gibson>
only if there's an "index" filter
18:07
<Justin Ridgewell>
No
18:07
<Justin Ridgewell>
Yes
18:07
<nicolo-ribaudo>
It has three properties and a length of three
18:07
<nicolo-ribaudo>
Oh ok
18:08
<Justin Ridgewell>
It has 2 index properties
18:08
<nicolo-ribaudo>
Well, Object.keys(arr).length === arr.length returns true on that
18:08
<Justin Ridgewell>
That's why we need the property count proposal
18:09
<Justin Ridgewell>
I was giving a really basic case
18:09
<Justin Ridgewell>
But we can build on the previous proposal for "sparse" checks
18:09
<nicolo-ribaudo>
My point about time-of-check vs time-of-use still stands though
18:09
<Justin Ridgewell>
Yes
18:09
<nicolo-ribaudo>
Even if you check like that
18:09
<waldemar>
{0: 0, 1: 0, 3: 0, 17: 0, length: 4} would have a length of 4 and four index-named properties
18:11
<ljharb>
but it'd not be Array.isArray. almost all these use cases are inside a context where that's already been checked
18:11
<Justin Ridgewell>
I thought the proposal only worked on Arrays
18:13
<waldemar>
That's still being debated.
18:13
<rbuckton>
I continue to wish JS had syntax and semantics for custom indexers, much like how TypedArrays are handled. This proposal brings that back to mind.
18:13
<Chris de Almeida>
we are going to go over time most likely. please indicate your preference: 🦆 - continue the meeting into the lunch break, and conclude plenary 🐓 - break for lunch, and return after to continue meeting ,then conclude
18:14
<Justin Ridgewell>
Wouldn't any handling of array-like (specifically excluding arrays here) have to be linear?
18:14
<Justin Ridgewell>
We could just implement in userland, there's no benefit of a native API
18:15
<waldemar>
Yes, it would be linear. But, given today's comments, a lot of cases on Arrays would also be linear.
18:15
<Justin Ridgewell>
Not if we use property count, since the length is 🪄
18:16
<Justin Ridgewell>
Index keys are stored in a special array (in V8), and length is always guaranteed to be the max index's value +1.
18:16
<Justin Ridgewell>
So the check could be constant for arrays specifically
18:17
<waldemar>
So you're saying that it is possible to implement Array.isSparse in O(1) time?
18:18
<Justin Ridgewell>
In V8 at least, without depending on the element's kind internal stucture.
18:18
<Justin Ridgewell>
Don't know about the other engines, but they had to implement special ordering rules for Object.keys(), so they may have index keys stored separately.
18:22
<nicolo-ribaudo>
Only Object.keys and Object.propertyCount, passing as the second parameter a bitflag to do all the filtering 🧠
18:23
<Richard Gibson>
now you're thinking like a 1990s DOM API 😎
18:25
<snek>
proposal: add a one true Object.getPropertyNames which accepts this options bag: https://docs.rs/v8/latest/v8/struct.GetPropertyNamesArgs.html
18:29
<Olivier Flückiger>
no. it's O(1) to skip indices (which might or might not have holes)
18:29
<rbuckton>
Rather than using 'all' to fight defaults, why not have these APIs always include everything by default and use the presence and value of enumerable et al to control behavior, much like defineProperty (which ignores missing attributes as long as the property already exists).
18:31
<Justin Ridgewell>
This response seems like a negative of a negative? I'm not sure how to understand it.
18:31
<rbuckton>
for this API and propertyCount, have it be propertyCount(target) to count all properties, and use propertyCount(target, { enumerable: true }) to count only enumerable keys. Much like how getOwnPropertyKeys gets all own keys
18:33
<Olivier Flückiger>
We can give you the max index. but not tell you how many elements up to that index exist in the array.
18:33
<nicolo-ribaudo>
+1, maybe calling it enumerableOnly
18:33
<Justin Ridgewell>
It should be the count of the index keys array, right?
18:33
<Olivier Flückiger>
which is implicitly defined by not being a hole in the array backing store...
18:34
<bakkot>
has anyone ever enumerated a sufficiently large typed array to observe this
18:34
<Justin Ridgewell>
Does a the hole have an entry in the index keys arrays?
18:35
<Olivier Flückiger>
we don't separately store keys for arrays
18:35
<bakkot>
I don't think the thing Richard said is true
18:35
<bakkot>
Richard Gibson: https://tc39.es/ecma262/multipage/ordinary-and-exotic-objects-behaviours.html#sec-typedarray-ownpropertykeys
18:36
<bakkot>
exotic objects are allowed to have different key enumeration order than the default array-index-first behavior that ordinary objects have
18:37
<ljharb>
i agree with you; TAs already cover that
18:37
<Richard Gibson>
ack, I accept the correction
18:38
<rbuckton>
I'm a fan of just mirroring the attribute names, in the event we ever care about also supporting configurable or writable
18:39
<ljharb>
if it's called enumerable tho then it can't cover "all"
18:39
<ljharb>
only true and false
18:39
<nicolo-ribaudo>
The reason I suggested that is that enumerable: true could either be "include enumerable keys" or "include only enumerable keys"
18:39
<rbuckton>
It can cover it by being missing or undefined, just like how defineProperty handles it for existing properties.
18:40
<ljharb>
true, but it's very awkward to have a three-state boolean, and in this case the default would be true, and boolean option should always default to false when absent
18:40
<rbuckton>

i.e.:

  • propertyCount(target, {}) count all properties.
  • propertyCount(target, { enumerable: true }) count only enumerable properties
  • propertyCount(target, { enumerable: false }) count only non-enumerable properties
18:40
<ljharb>
also if we added "writable" how would it work with accessor properties, i don't think we could ever add that one
18:41
<keith_miller>
Named String and Symbol properties are mixed in JSC's Structures
18:41
<keith_miller>
That said, it's easy enough to skip over the symbols and we already have that functionality
18:41
<snek>
whether a setter is present?
18:41
<rbuckton>
If we ever wanted anything that detailed, we could use propertyCount(t, { writable: true }) + propertyCount(t, { set: true })
18:42
<Michael Ficarra>
Object.getOwnEnumerablePropertySymbols, can we go home now?
18:42
<ljharb>
lol but i mean, if you say "true" or "false" then you're skipping all accessor properties?
18:42
<ljharb>
so the mirroring is broken because the type of set no longer matches
18:42
<nicolo-ribaudo>
I have to leave now, but I'm +1 on this array indexes proposal going to stage 1, and -1 on the first two advancing. For the first one until the use cases for the various combinations are clarified with actual examples, then it'll turn into +1 at a future meeting. For the one about isSparse I'm not convinced that it's what actually is needed to get a fast path. (cc ryzokuken as both Igalian and chair :P)
18:43
<waldemar>
What is doable in O(1)? Getting the total number of properties? Getting the number of indexed properties? Nonindexed properties?
18:43
<bakkot>
Object.symbols, surely
18:44
<rbuckton>
My concern with having a bunch of methods on Object over the property bag is that it is inflexible without the number of similar property names on Object ballooning out of control. I wouldn't look forward to scrolling through the autocomplete list for that case. An options bag keeps the API rational and flexible.
18:44
<ljharb>
and, as i argued earlier, more discoverable
18:44
<bakkot>
we already have almost the whole matrix
18:44
<Michael Ficarra>
WFM
18:44
<bakkot>
we have Object.keys, Reflect.ownKeys, Object.getOwnPropertyNames, Object.getOwnPropertySymbols
18:44
<bakkot>
these are all their own method
18:44
<Olivier Flückiger>
Probably number of nonindexed properties (but I would have to think about it) and if the array happens to have a particular internal shape, then the number of indexed propoerties.
18:45
<ljharb>
Object.symbols, but don't forget Object.symbolValues and Object.symbolEntries
18:45
<rbuckton>
Its still similar enough, IMO.
18:45
<bakkot>
any new thing in this matrix should also be its own method
18:45
<ljharb>
and if we add Object.symbols() then what about a .symbols() iterator method on Set/Map/Array?
18:45
<bakkot>
entries is not an item in this matrix; there's only one of it
18:45
<rbuckton>
And they could just be one method with options that allows for future extensibility without adding even more methods to Object.
18:45
<bakkot>
why would we want that?
18:45
<ljharb>
lol i'm just saying that we have a LOT of keys/values/entries parallels
18:46
<bakkot>
but they all already exist
18:46
<snek>
javascript i have seen your future https://gc.gy/d452a7e4-49d7-4b50-be21-ce3f6cdc0fb4.png
18:46
<ljharb>
if your argument for method over option bag is "filling in the matrix", then we have a much larger matrix to fill in
18:46
<bakkot>
no my argument is if we are filling in part of the matrix then it must be in keeping with the rest of the existing matrix
18:46
<Michael Ficarra>
you failed to predict when we add a new kind of property key in 2028
18:46
<ljharb>
and the matrix includes keys/values/entries on Object/Set/Map/Array.
18:46
<snek>
getOwnPropertyDecimals
18:47
<bakkot>
that is a matrix but is not the one we are talking about, no
18:47
<rbuckton>
That approach doesn't scale to a larger number of permutations.
18:47
<bakkot>
it is just not relevant at all
18:47
<bakkot>
there's no more permutations
18:47
<bakkot>
if we start doing configurable vs not or whatever, we can do that as options bags
18:50
<rbuckton>
The fact that keys vs getOwnPropertyNames differentiates by enumerability is definitely non-obvious to a new developer.
18:50
<bakkot>
I agree but it is how it works
18:50
<bakkot>
we can't say "the existing methods names are not sufficiently obvious so we're going to add a new way"
18:50
<ljharb>
why can't we?
18:50
<snek>
i would personally not put filling out matrixes over like how we have learned to design better apis from the last 25 years
18:50
<Richard Gibson>
for generic property key enumeration, I think the current (incomplete) matrix is {string, symbol, both} × {enumerable, ignore-enumerability}
18:51
<bakkot>
that is a matrix but { string, symbol } x { enumerable, all } is another matrix, which has three entries, and this is the fourth entry in that matrix
18:51
<rbuckton>
That sounds like a perfectly valid reason to consider a different design for an API.
18:51
<bakkot>
the very slightest modicum of taste?
18:52
<ljharb>
taste is a subjective thing, and my taste tends to consider "deprecate the bad thing, make a much better new thing" more pleasant than "never learn from our mistakes"
18:53
<Richard Gibson>
I disagree that such a reduced matrix is relevant, but don't want to complete either for their own sake anyway
18:53
<bakkot>
it is a fine reason to consider designing new APIs in a different way, when they are not just extensions of the existing API
18:53
<bakkot>
I strongly agree that we don't want to complete either for their own sake and have said as much on several occasions
18:53
<bakkot>
however, if we are filling a matrix of functionality then it must match the existing parts of the matrix
18:53
<Michael Ficarra>
Same, where it matters a whole lot, like with avoiding coercions. This does not matter a whole lot.
18:54
<ljharb>
"matter" is also subjective :-)
18:55
<Michael Ficarra>
aesthetics is at the bottom of the mattering ladder
18:55
<rbuckton>
Shifting from a 2x2 matrix to a 3x3 matrix when there is potential to shift to an n x n matrix seems like enough of a trigger to me.
18:55
<ljharb>
PropertyReflectionFactoryBean, then
18:55
<Richard Gibson>
I strongly disagree with this, for reasons that align with statements from others above. In short, the current representation is bad and should not be extended, although reworking might be appropriate
18:55
<bakkot>
but this proposal is not shifting from a 2x2 matrix to a 3x3 matrix
18:56
<keith_miller>
Have folks actually seen these enumeration+filters show up as a meaningful point of performance overheads? I don't think I've ever seen this as a hotspot any traces from benchmarks or live sites.
18:57
<Justin Ridgewell>
Mostly comes up in development and testing
18:57
<keith_miller>
I'm sure you can make a microbenchmark but in large codebases
18:57
<ljharb>
ruben's experience in node is directly having it be very meaningful
18:57
<bakkot>
node's experience does not generalize to the web at all
18:57
<Justin Ridgewell>
I don't think this is expected in prod code
18:57
<ljharb>
sure, not claiming it does
18:57
<ljharb>
production code does value inspection quite often, in the web and in node, sometimes in failure paths but not always.
18:58
<Richard Gibson>
Agoric code enumerates object properties as part of shape verification
18:58
<keith_miller>
Sure, but failure paths are not usually ™️ hot though
18:58
<Richard Gibson>
not limited to failure paths
18:58
<ljharb>
sure, which is why i said "not always" :-)
18:59
<Justin Ridgewell>
Making tests and logging faster would be valuable for me as the dev, but unlikely to impact my users.
18:59
<bakkot>
for extremely obscure things, I can maybe buy this on a case-by-case basis, if there's some hope people might migrate off of the current representation. but Object.keys is the opposite of obscure
19:00
<Richard Gibson>
the presence of Object.keys is not obscure, but ignoring Symbol-keyed and non-enumerable properties is
19:02
<Justin Ridgewell>
I think using symbols is obscure. And making non-enumerables (outside prototype methods)
19:03
<Michael Ficarra>
🕰️ remember to leave time if we're looking for stage advacnement
19:04
<bakkot>

like, to be clear, the proposal is:

  • How do you get all own strings? Object.getOwnPropertyNames()
  • How do you get all own symbols? Object.getOwnPropertySymbols()
  • How do you get enumerable own keys? Object.keys()
  • How do you get enumerable own symbols? Object.getOwnPropertySymbols({ enumerable: true })
19:04
<bakkot>
that is extremely unpleasant to me
19:04
<bakkot>
we are not doing that
19:04
<Chris de Almeida>
tempted to break for lunch and come back.. my fear is that the calls for advancement may take more time than we think
19:04
<ljharb>
fwiw i can't come back after lunch; i'd planned on not going late
19:04
<Chris de Almeida>
though the ducks did win out easily over the chickens
19:04
<Michael Ficarra>
I am not coming back
19:06
<Michael Ficarra>
it's easy to make a call for advancement go fast FWIW
19:06
<Michael Ficarra>
"if it's not blocking, I don't want to hear it"
19:06
<Michael Ficarra>
we can do all 4 in under a minute if we do it right
19:06
<ljharb>
you think it's easy to get an entire group of language pedants to willingly not voice their opinion? O.o
19:06
<Richard Gibson>
I agree with not doing that. But an alternative is introducing a single new thing that handles all four of those.
19:07
<Michael Ficarra>
yes, admins have a mute button
19:07
<keith_miller>
To further clarify, optimizing the enumerability is somewhat difficult in the semi-optimizing tiers of an engine because it's hard to prove how the JS is going to use the result of the getOwnPropertyDescriptor object without doing a full escape analysis.
19:07
<bakkot>
How do you get all own strings? Object.getOwnPropertyNames() How do you get all own symbols? Object.getOwnPropertySymbols() How do you get enumerable own keys? Object.keys() How do you get enumerable own symbols? Object.getEveryPossibleCombination({ kind: 'symbols', enumerable: true }) this is not better
19:08
<ljharb>
in that world you'd change the answer to the first 3 to use the new method
19:08
<Michael Ficarra>
y'all are lucky I'm not a chair because I would be so much stricter than our current chairs
19:08
<ljharb>
and the first 3 would just be marked legacy
19:08
<bakkot>
if these were very very obscure you might have some hope of that
19:08
<bakkot>
Object.keys is not obscure and never will be
19:08
<ljharb>
true. the others are very obscure tho
19:09
<Richard Gibson>
but the others are
19:09
<rbuckton>
This is still an API that doesn't scale if you consider propertyCount or other APIs that would filter the results (like getNonIndexPropertyNames, etc.). From a blank slate, I would strongly have preferred an API like getPropertyNames(o, { own, enumerable, ... }) and propertyCount(o, { own, enumerable, ... }) than repeating 3-4 static methods for each output type.
19:10
<bakkot>
it scales fine, just tack "Count" on the end of all of those
19:10
<bakkot>
this is my preferred solution
19:11
<ljharb>
in a world where we trimmed dozens of methods from Temporal because browsers don't want to add a ton of methods?
19:11
<rbuckton>
i.e., getPropertyNames(o, { own: true, symbol: false }) -> getOwnPropertyNames(o), getPropertyNames(o, { own: true, enumerable: true, symbol: false }) -> keys(o), etc.
19:11
<bakkot>
I agree from a blank slate we would probably do something different but this is javascript, the slate is never blank
19:12
<ljharb>
like in the same way as browser implementation reality has basically meant "no new array prototype methods", aren't we already in the world of "minimize the number of added methods"? which would strongly push options bags as The Way to add stuff when it makes sense?
19:12
<bakkot>
to be clear I do not insist on a separate fooCount method being the solution to counting thing, just that I would be fine with that outcome
19:12
<Justin Ridgewell>
DIdn't we split this from a super-everything API a few meetings ago?
19:12
<bakkot>
we do not already have fooCount methods so we can do those however we'd like
19:13
<rbuckton>
It is, however, indicative of a preferred state. We only have ~3 methods in this category for now. this doubles that and more, and any other permutations would result in needing to switch and leave behind now 6-8 "legacy" methods.
19:13
<rbuckton>
I don't look forward to completions for Object.getOwn| expanding to a large list you have to scroll through to get the correct method.
19:14
<nicolo-ribaudo>
What was the consensus outcome, for those that left earlier?
19:14
<Chris de Almeida>
😑
19:14
<snek>
Object.iterateProperties().filter(x => typeof x.name === 'symbol' && x.enumerable).reduce((c, _) => c + 1, 0)
19:14
<Michael Ficarra>
I actually look forward to this
19:15
<bakkot>
"this" does not double that, "this" is literally just Object.symbols (or some other name), I am only insisting on Object.symbols specifically as the solution to the "get enumerable own symbols"
19:15
<Michael Ficarra>
there has been no request for consensus on anything yet
19:16
<nicolo-ribaudo>
Ugh good luck
19:16
<bakkot>
I have not claimed and do not believe this means we have to add a bunch of other methods as the solution to other problems
19:16
<ljharb>
that would destroy discoverability, much like how you can't meaningfully read through the list of methods on window anymore
19:17
<rbuckton>
IMO, Object.keys() is a terrible name that does not accurately describe what it does. Object.symbols() would be going down the wrong track, IMO.
19:17
<rbuckton>
I'd much rather have a more descriptive getOwnEnumerablePropertySymbols than symbols for clarity.
19:18
<ljharb>
none yet, still going
19:18
<rbuckton>
I'll admit I needed to check the documentation for keys to clarify whether it return only own keys or inherited keys. It's a terrible name.
19:19
<Richard Gibson>
I'm very much against adding a plethora of new functions. But if the only introduction here is "get enumerable own symbols", then I agree with bakkot that it must be Object.symbols.
19:20
<ljharb>
only own
19:20
<ljharb>
nothing returns inherited keys
19:20
<bakkot>
Object.keys is not a great name but it's also among the most widely used methods in the language, we are not getting away from it
19:27
<Chris de Almeida>
I meant 'elder' as in experience, not age! 😄
19:27
<rbuckton>
True, but that doesn't mean we should continue down that path.
19:31
<kriskowal>
I’ll take a gander. Thank you.
19:32
<Chris de Almeida>

I forgot to thank our note-takers:

ABO
JMN
JRL
KG
MF
NRO
RGN
SFC
SHS
ZTZ

thank you all very much! 👏👏👏👏👏👏👏

23:32
<ljharb>
k well my matrix is taking forever to send messages, and i have to run anyways, so i'm off 👋