Brendan Eich brendan at
Fri Nov 2 16:54:50 PDT 2012

Allen Wirfs-Brock wrote:
> On Nov 2, 2012, at 10:56 AM, Jason Orendorff wrote:
>> On Fri, Nov 2, 2012 at 12:29 PM, Domenic Denicola 
>> <domenic at <mailto:domenic at>> wrote:
>>     > If we call it "has", should we also rename
>>     String.prototype.contains?
>>     I'd say no; the distinction between collections "having" an
>>     element and strings "containing" a substring seems very sensible.
>>     It's a bit more awkward to say a string "has" a substring, and a
>>     string is definitely not a collection of substrings in any
>>     reasonable sense.
>> Well, you could also note that array.has(x) looks for a particular 
>> value, while map.has(x) looks for a particular key.
>> But that's not the point. There's no common formal contract 
>> implemented by all these methods; what they share is an informal 
>> "hey, look in this thing, and tell me if you see that thing" vibe.
> There is no verifiable formal contract.  But there can be an informal 
> contract.  In my experience, it is very important when using a dynamic 
> language to recognize and try to support such informal contracts.
> All the uses of "has" we have defined so far are about the "keys". 
>  Having one place that is about the "values" to create unnecessary 
> confusion
> Note that we (the JS/ES designers) already have a history of being 
> being inconsistent in our use of names.  Consider String indexOf and 
> Array indexOf

> they are named the same and appear to have signatures.  But they 
> logically are doing quite different things.  String indexOf is looking 
> for the index of the first element of a subsequence of character 
> elements that matches a specific character sequence.  Array indexOf is 
> looking for the index of a single element that contains a specific 
> value.  You might want to implement a logically similar subsequence 
> search for Array's but if you do, you can't call it indexOf because 
> that name was already used for something with different semantics.  We 
> should try to do better as people for our example.

That one never bugged me, and I suppose one could "fix" it by allowing 
by-value search for a sub-array from Array.prototype.indexOf. I've never 
seen anyone do that.

"has" for keys (and possibly values of a Set, to preserve the value 
mapped to boolean future option that forEach also supports), "contains" 
for values in arrays?


More information about the es-discuss mailing list