通过将其原型设置为Array.prototype:我可以轻松地使普通对象看起来像一个数组:
const obj = {};
Reflect.setPrototypeOf(obj, Array.prototype);
Run Code Online (Sandbox Code Playgroud)
(我知道魔术length属性和稀疏数组也有一些问题,但这不是这个问题的重点.)
我想Array.isArray(obj)返回true(当然没有修改Array.isArray()方法).该MDN填充工具为Array.isArray()如下:
Run Code Online (Sandbox Code Playgroud)if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; }
通过使用该Symbol.toStringTag属性,我可以Object.prototype.toString.call(obj)返回'[object Array]':
obj[Symbol.toStringTag] = 'Array';
console.log(Object.prototype.toString.call(obj) === '[object Array]'); // true
Run Code Online (Sandbox Code Playgroud)
现在polyfilled Array.isArray()收益true为obj(请忽略了一个事实,没有一个浏览器不支持Array.isArray()不支持Symbol.toStringTag).然而,本地Array.isArray()函数仍返回false了obj.我查看了ECMAScript 2017规范,它说Array.isArray()使用了抽象操作IsArray,true如果参数是一个Array异常对象,则返回该操作.如果参数是一个代理,它IsArray直接调用目标对象,所以似乎使用代理在这里没有帮助.
有没有办法让 …