Location: #jquery-meeting on Freenode
Attending: James, Jörn
John Neumann (JN), Allen Wirfs-Brock (AWB), Yehuda Katz (YK), Eric Ferraiuolo (EF), Erik Arvidsson (EA), Rick Hudson (RH), Matt Sweeney (MS), Rick Waldron (RW), Dmitry Soshnikov (DS), Sebastian Markbage (SM), Ben Newman (BN), Reid Burke (RB), Waldemar Horwat (WH), Doug Crockford (DC), Tom Van Custem (TVC), Mark Miller (MM), Brian Terlson (BT), Andreas Rossberg (ARB), Alex Russell (AR)
(Istvan Sebestyen)
January 2014 Meeting deadline
(Waldemar Horwat)
WH: In ES3 we added the ability to use unicode escape sequences in Identifiers, ie.
|
1
|
|
The restriction was that the unicode escape sequence still had to be a valid identifier. ES3 and ES5 never allowed unicode escapes to substitute non-user-data characters of other tokens such as reserved words or punctuation.
the contention is that ES6 has an incompatible lexical grammar change that lets you write things like:
|
1
2
3
4
5
6
7
8
9
10
|
|
AWB: Things that came up in ES5:
|
1
|
|
|
1
2
|
|
ie. Identifier vs IdentifierName
WH: Cannot use escapes to create identifiers that would be invalid. Also opposed to allowing escapes inside keywords; there should be just one spelling of the keyword if, and it should not include \u0069f.
So what should we do about \u0069f(x===15) ? It depends on how we interpret the ES3/ES5 rule that states that escapes cannot be used to create identifiernames that don't conform to the identifiername grammar.
Option A: Treat the if there as an identifier because there are some contexts in which "if" can be used as an identifier (notably after a dot), making this into a function call.
Option B: The if there cannot be an identifier in this context, so it's a syntax error because we're trying to spell a reserved word with an escape.
AWB: Agree there is ambiguity
MM: https://code.google.com/p/google-caja/wiki/SecurityAdvisory20131121 "Handling of unicode escapes in identifiers can lead to security issues" Records the vulnerability that has now been fixed in Caja at the price of additional pre-processing. This vulnerability which was caused by ambiguity in interpretations of the ES5 spec by different browser makers.
STH: If there are systems that need to search code for specific forms
MM: It would be harmful to code that looked at keywords, then this could circumvent those assumptions.
AWB/WH: (recapping acceptable use of reserved words as identifiernames)
BE: We can fix it, but it's just not how ES6 spec works
WH: If it is a ReservedWord, it may not be spelled with an escape.
MM: This solves Sam's static code case
BE: No escape processing upstream?
WH: (agreeing)
AWB: We can specify in the grammar that where we write "if" it means that exact character sequence
...Anywhere we express literal keywords, we mean those character sequences.
(Brian Terlson)
BT: Wondering if any implementors have begun work on these? Are there considerations for existing code that will become tail call?
YK/AWB: Any examples?
BT: Stack frame manipulation
BE: It's not a zero work to new work, it's an old work to different work.
STH: There's a lot of work on this subject, presumably tail calls should be able to run as fast as it does currently. No advice that's implementation independent.
ARB: Standard techniques should be applicable. Foresee a lot of work.
YK: The only real value for practioners is for compile-to-js cases.
DC: This is actually the most exciting feature for me, because it allows
BE: Will have someone work on this for SpiderMonkey
RW: Agree that implementors will feel the pressure once practioners experience the benefits that Doug describes.
DH: Allows for real cps transformations that won't blow the stack and don't require awful setTimeout hacks. FP idioms being available to JS.
(Allen Wirfs-Brock)
(needs slides)
AWB: Issue: how do you mixin some methods that reference super?
|
1
|
|
In the process of mixing, Object.mixin will rebind super references to the target. The big problem: super is currently explicitly illegal within an object literal:
|
1
2
3
4
5
|
|
BE: are we asking to allow super anywhere?
MM: We're not adding a restriction?
AWB: No, removing.
MM: Strictly a simplification.
Discussion re: Object.mixin
WH: Curious about the design of exposing super to user code, but only via the Object.mixin API. If we're going to be storing and retrieving super from a hidden slot, this seems a very roundabout API that's going to bite us.
AWB: Allow super in concise methods
EA: All object literals?
RW: No, because the property value could be defined elsewhere. Ensure invalid in function and it's ok
EA/AWB/RW: Allow super in concise methods within object literals.
Clarification of Object.mixin capabilities.
MM: (has issue with the naming)
AWB: Let's defer discussion of naming.
YK: We should allow super in function expressions within object literals
MM: Refactoring hazard
DH: There is always a refactoring hazard when scope is involved (super)
RW: On board with Erik and Yehuda, super should be allowed in both concise methods and function expression literals that are the value of properties defined in an object literal.
DH: Object.mixin creates a new function when rebound?
AWB: Yes.
MM: (whiteboard)
|
1
2
3
4
5
6
7
8
9
|
|
DS: Concern about having a reference to a function object that doesn't equal the rebound method
|
1
2
3
4
5
6
7
|
|
BE: No way to define a property on a concise method declaratively.
WH: RebindSuper doesn't copy expandos (referring to Allen's claim that it does) http://people.mozilla.org/~jorendorff/es6-draft.html#sec-rebindsuper (The actual copying of expandos takes place in MixinProperties http://people.mozilla.org/~jorendorff/es6-draft.html#sec-mixinproperties
DH: Issue: bind does a similar operation, but doesn't copy expandos. ... Any other deep traversals? If you have a non-callable object, it only does a shallow copy? ... The existance of super creates an inconsistency.
AWB: Alternatives are always clone or never.
DS: All methods should be copied to avoid the distinction
YK: Don't copy exandos?
EA: Happy to go back to Object.defineMethod
YK: Still need to decide if it copies expandos
DH: That's the smallest operation that you can build on
WH: Object.mixin breaks membranes, no way to intercept the super rebinding when the method is a proxy.
AWB: There are many operations like this
EA: No different from Function.prototype.bind
MM: What happens when the method is a Proxy?
AWB: A proxy for a method is not a function.
MM: A Proxy whose target is a function?
AWB: It's not an ordinary ECMAScript function
MM: Anything we do, we should ask "What does it do across membranes?" There are two criteria that often come into conflict:
Discussion about Security vs. Transparency
EA: What happens when do bind on a function proxy?
MM: fail?
DH: This is shocking.
MM: bind is a perfect example, there is no conflict between security and transparency. You'd like bind to work on proxy functions
EA: (whiteboard)
|
1
|
|
MM: They're saying, do the [[get]] on the proxy, you don't get bindSuper back, you get a proxy for bindSuper ... membrane safe.
YK: Change bind?
DH: Can't change bind, varargs
Mixed discussion re: home binding.
AWB: Expose the home binding via trap?
DH: trap makes sense to me
MM: From the method you have access to the home binding?
AWB: yes
MM: Don't like that
AWB: Another way
WH: The method calls "super" and expects to reach it's super
AWB: There could be a super call trap
YK: Any objects to bindSuper?
DH: No idea what this means.
BN: What is the material difference between defineMethod and bindSuper?
bindSuper: like bind, but only changes super. Could be defined in terms of Object.defineMethod:
|
1
2
3
4
|
|
changing this and super is a two step change:
|
1
2
3
4
5
6
7
8
|
|
DH: bindSuper is the max/min of define
on a bound function?
BE: On a function with this and super, changing both will create two new functions
AWB: This is a "clone function"
DH: Meaning, only clone the this-binding, not the expandos
...
AWB: you'll need to bindSuper, then bind
AWB: If you want it to work in either direction
WH: binding super after binding this will cause problems. That would be an anti-feature that breaks abstraction. A lot of times, code will return a bound function specifically to prevent you from changing this. Changing super in such a function would break the abstraction.
?: Want bind and bindSuper to commute
WH: Don't want them to commute. They're fundamentally different. bind can only be done once and freezes the this binding. bindSuper can be done repeatedly and doesn't freeze the super binding.
?: You can already rebind this in a bound function
MM: No. If you bind it again, it doesn't mutate the bound this value; the second one is ignored.
DH: (whiteboard)
bindSuper can be called on the result of bindSuper (which is why YK/MM dislike the use of "bind")
Alternative names: resuper, bindSuper, supersede, withSuper, super?
withSuper, bindSuper?
bindSuper(obj[, ...])
BN: what does super.valueOf() return?
DH: should be this, similar to what super evaluates to in Smalltalk (according to AWB)
Discussion re: naming. The shed is pink? It's more of a mauve, I think. You would.
Function.prototype.toMethod(home[, mname])
Dave, please review the details above.
(Dave Herman)
DH: Something incredibly gross about having an API that allows exactly one string, but I know we need to solve the bigger problem which is being able to provide performant custom comparators.
Can we just get rid of this argument?
WH: [Recaps consensus decision from prior meeting and the reasoning route by which we arrived at it.]
MM: (gives memoization example)
DH: This can be addressed in ES7
Discussion re: -0/+0 difference.
It was pointed out the only difference between the default comparator and the is comparation is the handling of -0/+0 and that a subclass of Map that ditingishes between +0 and -1 using Object.is can easily be written in ES code.
(Dave Herman)
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.hypot
DH: Oliver Hunt brought this up, do we want to maximize precision (by sorting) and take the performance hit? Or do them in the provided order. Prefer the latter. Oliver prefererred sorting for precision but taking the performance hit.
BE/DH: He's not here.
Referring to IEEE 754
Luke provided the original spec text, but it's changed since then.
BE: need to look at SpiderMonkey implementation and possibly provide new spec text.
WH: Sorting doesn't matter much in this case; it's a second-order effect. Cancellation is impossible because all squares being added are nonnegative.
WH: What does greatly matter is not overflowing for values > sqrt(largest finite double). What does hypot(1e200, 1e210) do? BE (runs it on bleeding edge Firefox): About 1e210 WH: Good. We do want to avoid the intermediate overflow that would turn this into +?.
[ more discussion ]
?: This isn't just about hypot. How should we specify precision in general for things such as transcendental function.
WH: It's a moving target. Do not want to encode precision requirements in the standard on anything other than basic arithmetic or number?string conversion in the spec because those are complicated and how to specify them varies depending on the function. Best thing to do is link to some existing writeup describing best practices.
BE: I'll beat the drum to get a spec. Dave's right that it's bad language.
(Brendan Eich)
BE: This isn't a big deal and should be easy to bring into ES6. Experience so far has been that people love arrow functions and generators and want a generator arrow
(whiteboard)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
|
WH: Don't like => because it swaps the order from function.
WH: The ! problem in =>* can be solved by using % or ? instead of !. Would prefer those characters anyway.
BN: Another (strawman) possibility is the presense of yield.
BE/WH: No
DH: Recalls implied generator (yield presense) footgun
DH: There is not a 1-to-1 correspondance to where you'd use function or function *. Arrow is not a replacement for all functions that want lexical this.
(Brian Terlson)
BT: We've shipped for-let without fresh bindings per iteration (according to the current spec) but we're ok with updating.
MM: Consensus?
RW: recalling the consensus from yahoo 2012
DH: Need consensus on the semantics of capturing in the expression positions
DH: if there's something that "closes over" that variable, what's that referring to? I remember that thead, but I don't reacall the otucome
AWB: no definitive outcome... no satisfactory solutions
DH: we have this job on this committee... ;-)
BT: that we shipped in IE has no weighting on this?
AWB: nope. Should have looked at the spec which has notes to this effect
(discussion about binding per iteration)
AWB: C# addresses this by saying "this is insane, so for C-style of or, we have per-iteration bindings, not per-loop bindings"
MM: so let in the head of the loop creates only one location?
(yes)
EA: if we don't resolve this today, we sould fallback to what IE 11 does.
DH: sure, but we have to go through this thread
AWB: The first time you initialize, create an extra scope contour, the zeroth iteration. This is where the capture occurs and the subsequent iterations propagate to that scope.
AWB: if you order these things right, the 3rd part happens at the end, but before your propagate
MM: you mutate and then the value gets copied... seems fine
|
1
2
3
4
5
6
7
|
|
|
1
2
|
|
This is an infinite loop. Reasoning: 1) The outer scope receives its initial value for i and f. Critically, f's i now binds to this outer binding. 2) The outer scope forwards these values into the first iteration of the loop 3) In the beginning of the 1st loop iteration, the test is executed. At this point, i is still zero. 4) After, still on the first iteration, the test for i < 1 fails because i is zero. 5) Since we never modify the loop variable, this must be an infinite loop.
BE: FWIW, Dart has the same semantics.
|
1
2
3
4
5
6
7
8
9
10
|
|
outputs
|
1
2
3
4
5
6
|
|
(Rafael Weinstein)
Train model.
BE: FIFO
AWB: In the ES6 we need to say something.
?: Examples of why browsers want to use priority queues to schedule tasks
[ Debate about whether in ES6 we need to mention the priority queues ]
?: DOM and other tasks are beyond the scope of the standard. Just say that ES6 tasks are in FIFO.
WH: Would prefer to mention a richer priority structure in the spec; otherwise other groups (W3C) will want to fit their tasks into our FIFO, which is not desirable. At the very least we must say that other tasks with visible effects may get arbitrarily interleaved between the ES6 tasks we talk about in the spec, so don't assume that nothing can come between adjacent ES6 tasks in the FIFO.
MM: Rafael and I went throught the existing DOM behavior...
YK: Disagrees with Rafael. Bucketing. Series of buckets. The first bucket is the cheapest operations and the last bucket is the most expensive bucket. If a bucket adds something to an earlier bucket then you go back to to earliest bucket that has items in it. Each bucket is a FIFO queue.
WH: Can you reorder the operations so that the DOM operation happens next to each other.
YK: I think a priority queue is isomorphic to buckets.
AWB: In ES6 we only have one class of priority which is the priority of Promises. We do not need to spec that there might be different priorities.
John Neumann (JN), Allen Wirfs-Brock (AWB), Yehuda Katz (YK), Eric Ferraiuolo (EF), Erik Arvidsson (EA), Rick Hudson (RH), Matt Sweeney (MS), Rafael Weinstein (RWS), Alex Russell (AR), Rick Waldron (RW), Dmitry Soshnikov (DS), Jeff Morrison (JM), Sebastian Markbage (SM), Ben Newman (BN), Reid Burke (RB), Waldemar Horwat (WH), Doug Crockford (DC), Tom Van Custem (TVC), Mark Miller (MM)
JN: (Introductions)
DC: (Logistics)
JN: ...updating status of RFTG ...Adopt agenda?
Unanimous approval
JN: Approval of Sept Minutes?
Unanimous approval
AWB: (presenting Luke's spreadsheet with remaining features that need attention) https://skydrive.live.com/view.aspx?resid=704A682DC00D8AAD!59602&app=Excel&authkey=!AAMixsO0TuyPYwc
...Function.prototype.toString still needs attention
BE: Mark is to write spec, in this case under-specify
AWB:
BE: We agreed on semantics
AWB: We agreed on outer capture, but won't try to update per iteration. Need per iteration binding.
YK: This is the consensus I recall
AWB:
YK: (confirms that it's complete)
AWB: Yes, but not yet in the spec.
(TVC dials in)
(Presented by Tom Van Cutsem)
TVC: First three relate to es-discuss threads, re: simplifying Proxy. Jason Orendorff expressed concerns.
WH:
AWB: Looked for traps for call
BE: Total traps?
AWB: Now 14 traps.
BE: Cool. Not including hasOwn()?
AWB: Not including
TVC: The next is invoke() trap. Leave out for now to avoid inconsistencies with get()?
YK: How do you implement virtual objects? ie. an object whose this object is always the proxy. Can't do it reliably without invoke.
WH: Still not reliable, even with invoke.
YK: So what are the cases?
AWB: Can still implement a virtual object or full membrane, or thin wrapper.
YK: Not the use case. Want to make an object where this is the proxy and not the target.
TVC: Are you arguing that this should remain bound to the proxy object upon forwarding? If yes, this is the default.
YK: As long as maintaining equivalence between foo.bar() and bar.call(foo)
AWB: yes.
TVC: Regarding Handler API: not enough motivating use cases for proxy handlers without community use. Propose to defer.
AWB: Let's publish the library code TVC: It's already on github, as part of my shim. I will publish it as a separate project to make it more accessible.
TVC: Proxy as a constructor? Currently, no new throws TypeError
AWB: Not really a "class"
AR: You create new ones?
AWB: No prototype
AR: Gives an instance, why not "new"
AWB: Would need an @@create
YK: Then shouldn't be capitalized
BE: We can do "proxy"
AWB: (to Tom) the concern is: if it's not "new-able", should it be little-p proxy?
TVC: Given choice between little-p proxy and requiring new, I prefer new
RW: Agree with Alex, new Proxy() creates new Proxies, so allow new
AR: Let's not duck the charge on @@create.
WH: Proxy is not a class.
YK: ...But has allocation
WH: I would hate to specify what happens when subclassing from Proxy
AWB: Must create a special constructor
TVC: @@create doesn't make sense here
BE: Is Proxy a class?
(General: no)
TVC:
DS: What is typeof and instanceof
AWB/BE: object
BE: Capital P
AWB: Ca???
DS: Whatever Proxy creates?
BE: That depends on what is created.
DS: By default?
BE: typeof depends if there is a call trap. instanceof depends on the prototype chain. All in the spec, so can create any object (apart from private state issues)
AWB: Ok, into the future... would value objects allow new?
BE: (int64 example)
...back to why should new throw on Proxy constructor.
BE: Seems counter intuitive: Proxy constructs objects. int64 creates a value. callables construct objects
[ inaudible ]
BE: these are object constructor functions, which is what people want to do with "new"
AWB: this is somewhere in the middle between newing a class and a random function that returns an object
BE: in either case, it returns a new object and proxies are factories for object
AWB: yeah, I agree...spec currently calls them "proxy factory functions"
BE: pretty weird not to have "new" on this.. feels natural
YK: Intuitively, the difference between returning an object and not a value
AWB: we can do it...need to make it an exotic object with a special [[Construct]]
AR: agree. Making it exotic is good.
TVC: what's the summary?
AWB: we allow new, we do it by making it exotic.
EA: Do we REQUIRE "new"?
WH: what does Map do without new?
EA: Throws
BE: Why are we requiring new again?
RW: Needed for subclassing
AWB: my objection is that we're trying to tell a story about objects, classes, and @@create... this confuses the story
YK: there's already a weird split...saying you have to use new avoids the confusion
AR/RW: agree
AWB: we could go either way, and it's subtle, but most people won't see the subtlety
RW/BE: the conservative thing to do is to throw now and we can walk it back later
AWB: agree
JM: Removing the throw might change control flows?
BE: non-issue, rare.
hasOwn()invoke()new Proxy by making Proxy an exotic function that has it's own internal construct. (this is only "action" item)AWB: - Symbols in place - Binary data deferred - RegExp look behind deferred
WH: No comprehensive specification of which variant of RegExp lookbehind was wanted. Followed up on es-discuss and got no good answer to questions.
AWB: No one has stepped up, deferred to ES7
MM: If Tom will collaborate with me on this, I will commit to producing this.
AWB: I can live without this section
MM: ES5 had that section, I will talk to Tom about creating this for ES6
...
AWB: For the end of this year, we need a feature complete spec. Essentially a "candidate spec". This means all the features there are sufficiently specified to allow an implementor to implement. I think we have a shot at it. There is work to do. Questions remain in modules, but Dave can update us. Dave and Jason (Orendorff) have been working like crazy to finish modules, including a reference implementation.
MM: The spec we want to be feature complete includes modules?
AWB: Yes.
MM: The loader stuff as well?
AWB: Yes. ... Over the next 6-9 months, we need implementors to work and provide feedback. We should push forward with what he have now (this includes modules)
(Allen Wirfs-Brock)
(request slides)
Discussion re: arguments.caller, arguments.callee in non-strict and strict mode.
Discussion re: default param aliasing
BE: (tries aliasing on SM)
YK: Issues with arguments.caller, arguments.callee in framework uses.
BE: Do we want three types of arguments?
YK: It's not really three types
...
YK:
MM: Adopt some semantics where aliasing
BE: Deep aliasing of destructured parameters is bad
AR: Walk back poisoning entirely?
MM: No.
MM: Any simple parameter is aliased and any new style parameter is not ... on defaults I could go either way.
AWB: Back to scheduling
BE: If there is destructuring, no deep aliasing.
WH: Easier to explain if the rules are compositional.
... Continue discussion re: do Arrow Functions have an arguments object?
(Brendan Eich)
AWB: Arrows don't have an arguments object, but arguments is a keyword inside arrow functions.
WH: let arguments = ...?
not allowed, recapping ES5 strict rules that were applied to new forms in ES6.
questions about conditionally reserved words
AWB: what if the outer function does say let arguments = ...;, what is it in the arrow function?
MM: (whiteboard)
|
1
2
3
4
5
|
|
YK: this, super, arguments should refer to its outer.
WH: 11.6.2.2 and 13.2.1.1 are inconsistent. The former omits keywords such as "arguments", while claiming to be based on the latter.
arguments is lexically captured by arrow functionsAWB/BE: yield just follows the rules for yield
MM: (whiteboard)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
|
AWB: ...Computed property keys: No dynamic checking for duplicate computed property name in object literals or classes
|
1
2
3
4
5
|
|
MM: Cannot statically repeat properties in object literals
AWB: This isn't a static object literal
MM: ...
YK: The most common usage will by for symbols, eg. @@iterator
AWB: We don't have a mechanism for runtime checks like this and shouldn't be adding such checks
MM: The create and overwrite paths are very different (define v. assign)
WH: Pick one or the other. If we're going to do static checking, do it consistently. Either always check or never check
AWB: The complications I ran into were in gets and sets, it's not just "does this property exist"...
BE: We do want computed property gets and sets ...We should do checks.
AWB: It's not that non-strict doesn't check...
MM: given that we do dynamic checks in strict mode, you prefer NOT doing them in sloppy mode?
AWB: I don't like the dynamic checks either way
MM: that wasn't the question
AWB: the precedent in ES5 for object literals is that strict mode has "more" static checks.
AWB: "from a language design perspective", we should have them the same in both cases
BE: I'm w/ WH and ARB, we want the check in strict mode
AWB: so you don't want the check in sloppy mode?
BE: I don't think there is only one consistent position, and I'm ok with no dynamic check in non-strict mode
... discussion of the current static checks in non-strict mode ...
|
1
2
3
4
5
|
|
AWB: the consensus is that for dynamically computed property names we will dynamically check the things we would have statically checked.
WH: Pop quiz. What does the following parse as?
|
1
2
3
4
5
6
7
8
9
10
11
|
|
[Almost nobody guessed all of these right.]
Current answer, with all optional semicolons inserted:
|
1
2
3
4
5
6
7
8
9
10
11
|
|
yield * [Lexical goal InputElementRegexp] => yield [no LineTerminator here] * [Lexical goal InputElementRegexp]|
1
2
3
4
|
|
Proposed solutions:
BE: (whiteboard)
|
1
2
3
4
|
|
BE: Should have no trailing yield, as a static error
... lost track here...
WH: (whiteboard) Counterexample to claim about never requiring parentheses in expressions that would be unambiguous without them:
|
1
|
|
WH: Think of "extends" as having the same precedence as assignment operators. That's why class C extends (A + B) would require parentheses.
(need slide)
AWB:
|
1
2
3
4
|
|
Symbol.keyFor(Symbol.for(S)) === SSymbol.keyFor is serializationRevisiting discussion from last meeting, re: Symbol.
Discussion regarding the value, or lack of, registered Symbols over Strings.
DH: Is it necessary to be Symbol.keyFor()? What about Symbol.prototype.key`
DS: Is there direct correspondance between Symbol and toString?
DH: If the symbol is registered, toString does the same as Symbol.keyFor
AWB: is this good?
DH: What does Symbol.keyFor return if the symbol is unregistered?
undefined
Symbol.keyFor(unregistered symbol) returns undefinedSymbol.keyFor(not a symbol) throwsAWB: An issue about Symbols not being usable as WeakMap keys... ...which is ok...
This lead to discussion about (re)naming of WeakMap. It's possible that WeakMap may be renamed SideTable
Discussion re:
arguments prototypearguments.prototype.constructorAWB/MM: instanceof is generally misused
AWB: Current spec: all built-in iterators. Self hostable
MM: Issues are with consistency.
BE: (whiteboard)
|
1
2
3
|
|
MM: ...future JS programmers learning classes without understanding prototypes. Let's not unnecessarily introduce new abstractions that can't be understood within these semantics.
(meta discussion)
AWB: (describing a spec that used class inheritance for all new inherited objects, eg. Array.Iterator)
BE: Return to the question... should arguments be iterable, and how?
AWB/MM: (discussion re:
...?
MM: Why is this a spec issue?
AWB: @@iterator is bad example, @@toStringTag is better
BE: Use undefined, not "falsey"
AWB: re: new Map(?, "is")
BE/RW: new Map(undefined, "is") defaults to empty list
AWB: Happy with undefined.
undefinedSee: http://wiki.ecmascript.org/doku.php?id=harmony:function_name_property
AWB: What about anonymous function expressions?
RW: No name is made
AWB: What about bound anonymous function expressions?
RW: Same, no name.
DS: Could bound functions delegate their name? Do we want to do that?
BE: Might be interesting to find out, can chat with Brandon about this.
(Alex Russell)
AR: (recapping JSON specification leading to 404) ... There are people at the IETF that want more restrictions, eg. a number types, character encoding.
WH/MM: what does that mean?
AWB: Let's avoid doing what they're doing.
AR: They want to restrict all the things, that we're simply not willing to do. ... The draft revision includes non-normative "advice". They've also diverged on what is "valid JSON".
RW: Specifically, they've changed JSON so that JSONValue is not the top level grammar production, using JSONText instead. This means only "{}" and "[]", which is incompatible with Ecma-404.
AR: (proposal to work together)
STH: 3 levels.
(Dave Herman)
DH: Object.is might be a mistake
AWB: Could be trying to fill one of two purposes:
For general use, you want -0 and +0 to be equated, NaN to equal NaN
MM, WH: Multiple NaNs are not visible in JavaScript
AWB, DH: Different NaNs are distinguishable if aliased via TypedArrays
AWB: Hence Object.is does not discriminate as finely as possible
WH: That would be a mistake. ES1-5 clearly state that the NaN values are indistinguishable, and some implementations rely on that for NaN-boxing. Object.is should consider all NaNs to be the same.
[ discussion ]
AWB: NaNs are technically still not distinguishable in ECMAScript because an implementation has the freedom to write any quiet NaN bit pattern into a TypedArray, not necessarily the one that generated the NaN; in fact, writing the same NaN twice might generate different bit patterns.
Discussion about equating NaN values (https://github.com/rwaldron/tc39-notes/blob/master/es6/2013-01/jan-29.md#conclusionresolution)
MM: The spec allows 0/0 to be written to a TypedArray twice with different actual bit pattern.
More discussion re: IEEE NaN
Time: 2pm ET
Attending: DaveMethvin, timmywil, gibson042, m_gol
##Beta2 -- REALLY this week
Attending: DaveMethvin, gibson042, markelog
Time: 2pm ET