I can easily make a simple object look like an array by setting its prototype to Array.prototype:
const obj = {};
Reflect.setPrototypeOf(obj, Array.prototype);
(I know that there are also some problems with the magic property lengthand sparse arrays, but this is not a question of this question.)
I want to make Array.isArray(obj)return true(of course, without modifying the method Array.isArray()). The MDN polyfill for isArray.isArray() as follows:
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
Using the property Symbol.toStringTag, I can do Object.prototype.toString.call(obj)return '[object Array]':
obj[Symbol.toStringTag] = 'Array';
console.log(Object.prototype.toString.call(obj) === '[object Array]');
polyfilled Array.isArray() true obj (, , , Array.isArray(), Symbol.toStringTag). Array.isArray() false obj. ECMAScript 2017 , Array.isArray() IsArray, true, Array. , IsArray , , .
Array.isArray(obj) return true? , Array.isArray() .
, Array.isArray() ?, 5 , ECMAScript 5. ECMAScript 2017.