Mic*_*ski 5 javascript arrays ecmascript-6 ecmascript-next
通过将其原型设置为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直接调用目标对象,所以似乎使用代理在这里没有帮助.
有没有办法让Array.isArray(obj)回报true?为了说清楚,我不想修改Array.isArray()或任何其他内置对象.
这与使用用户定义的对象伪装Array.isArray()的问题基本相同吗?,但5年前被问到,答案基于ECMAScript 5规范.我正在寻找基于ECMAScript 2017规范的答案.
不,正如您已经说过的一个真正的数组(这是Array.isArray检测到的)是一个数组异域对象,这意味着它.length以一种特殊的方式运行.
构造它的唯一方法是使用数组构造函数或其子类Array(进而调用数组构造函数)或来自另一个领域的子类.也数不清的其他方法返回新的阵列(例如String::split,String::match,Array.from,Array.of,的Array原型方法Object.keys,Object.getOwnPropertyNames).
此外,用于标记模板或代理应用/构造陷阱的函数将接收全新的数组,并且数组也构造为结果Promise.all或.entries()迭代器的一部分.
如果您正在寻找创建数组的语法方法,那么数组文字将是您的主要选择,但是解构表达式(在数组文字或函数中)也可以从迭代器创建数组.
如果您的实际问题是:" 我可以把任意对象到一个数组异国对象吗? ",答案是一个坚定的没有.
| 归档时间: |
|
| 查看次数: |
406 次 |
| 最近记录: |