相关疑难解决方法(0)

5
推荐指数
1
解决办法
856
查看次数

我可以在不使用Array构造函数或数组文字的情况下创建Array.isArray()返回true的对象吗?

通过将其原型设置为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()如下:

if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}
Run Code Online (Sandbox Code Playgroud)

通过使用该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()收益trueobj(请忽略了一个事实,没有一个浏览器不支持Array.isArray()不支持Symbol.toStringTag).然而,本地Array.isArray()函数仍返回falseobj.我查看了ECMAScript 2017规范,它说Array.isArray()使用了抽象操作IsArray,true如果参数是一个Array异常对象,则返回该操作.如果参数是一个代理,它IsArray直接调用目标对象,所以似乎使用代理在这里没有帮助.

有没有办法让 …

javascript arrays ecmascript-6 ecmascript-next

5
推荐指数
1
解决办法
406
查看次数