[Proposal] Array.prototype.includes should evaluate object.toString and/or object.valueOf when determining a match

# Mike Simon (6 years ago)

[Proposal] Array.prototype.includes should evaluate object.toString and/or object.valueOf when determining a match

The problem:

If I have a list of objects that contain a toString() prototype that returns a value from the object, Array.prototype.includes does not return true if the value/string returned from the object is a match for the parameter value.

Test code:

var thingy = function(name) {this.name=name;}; thingy.prototype.valueOf = function(){return this.name}; thingy.prototype.toString = function(){return this.name}; var items = [new thingy('abc'),new thingy('def')]; var inc = items.includes('abc'); alert(items[0]); // alerts abc alert(inc); // returns false

While it’s possible to create this as a list of strings using map, this would seem to conserve memory, as well as reduce the complexity of the code to perform this operation.

Link: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

# Peter Jaszkowiak (6 years ago)

If you want to check properties or methods of an array of objects, you can use Array.prototype.some.

# Andrea Giammarchi (6 years ago)

It looks like you want included to use == for comparison, opening a whole new world of issues.

You have some and your code to do that with ease, same goes for find or findIndex, very appropriate for this use case.

items.some(o => o == 'abc');
# Mike Simon (6 years ago)

True, there are many other ways to make this work. You could even use filter(function(f){f.name==‘abc’;}).length > 0 .

The focus of this proposal is that the purpose of .valueOf and .toString are to allow for objects to return a default value without requiring the matching method to know about the contents or property names of any object.

Array.prototype.some, and any method mentioned above, require a that a content aware function be passed in to facilitate the match. This proposal mitigates that, and allows Array.prototype.includes to evaluate the object as the object design was intended.

# Andrea Giammarchi (6 years ago)

You could even use filter(function(f){f.name==‘abc’;}).length > 0

not really, that's a long way to find what you are looking for, some stops ASAP instead.

The focus of this proposal is that the purpose of .valueOf and .toString

I think those have valid use cases and changing a method already shipped long time ago to make use of those methods is surely not one of them.

This will never happen, you might have better luck proposing a new method (yet I have the feeling it won't happen neither because it's too easy to do on user land).