javascript-`map()`的怪异行为
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-`map()`的怪异行为,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1591字,纯文字阅读大概需要3分钟。
内容图文
![javascript-`map()`的怪异行为](/upload/InfoBanner/zyjiaocheng/683/35e4135e2f93476494864c9786f4f2df.jpg)
答:为简单起见,变量名称已更改.
我的目标是创建一个新的类似数组的类,该类的每个实例将基于任意数量的任何参数而具有七个数字.
因此,代码是这样的:
"use strict";
class SevenNumbers extends Array {
constructor(...args) { debugger; // !
// Cut the rest; fill the gaps; convert: first to object, then to primitive
super(...Object.assign([0, 0, 0, 0, 0, 0, 0], args.slice(0, 7)).map(arg => +new Number(arg)));
}
}
它工作正常,所以新的SevenNumbers();返回由七个数字组成的数组,默认为(0),否则为默认值.
调试器部分很重要:它告诉我们有关进入SevenNumbers类的构造函数的信息.
当我尝试map()获得对象时,问题就出现了.
尝试以下代码:
var arr = new SevenNumbers(8, 7, 6, 5, 4, 3, 2, 1);
// SevenNumbers [8, 7, 6, 5, 4, 3, 2] (without the last).
arr.map(_ => _);
// Array [8, 7, 6, 5, 4, 3, 2].
第一部分以预期的方式工作,但是在第三行,我们又进入了构造函数!
最令人困惑的是,这里唯一的参数是arr的长度.为什么长?
尽管最终结果是正确的,但这种奇怪的行为在实践中干扰了我的工作,因为这之间存在其他计算.
怎么了为什么不从准备好的自定义数组中获取值,为什么要创建新的数组呢?
解决方法:
那是因为map使用ArraySpeciesCreate来创建一个类似于原始数组的数组.
如果没有发生,最后您将获得一个普通的Array而不是SevenNumbers实例.
因此,调用构造函数是为了构造新的数组,该数组将使用回调函数和原始实例的项目填充.
如果您不想要它,可以使用Symbol.species来使映射调用Array而不是SevenNumbers.
class SevenNumbers extends Array {
constructor(...args) {
console.log(args.toString());
super(...Object.assign([0, 0, 0, 0, 0, 0, 0], args.slice(0, 7)).map(arg => +new Number(arg)));
}
static get [Symbol.species]() { return Array; }
}
new SevenNumbers(8, 7, 6, 5, 4, 3, 2, 1).map(_ => _);
内容总结
以上是互联网集市为您收集整理的javascript-`map()`的怪异行为全部内容,希望文章能够帮你解决javascript-`map()`的怪异行为所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。