[阅读MDN]之Array.prototype.toString的过程探究

一、数组toString方法的执行过程

 Array原型对象上的toString方法与Object.prototype上的toString方法不同,它进行了重写。Array.prototype.toString会先查看执行时上下文(this)及其原型链上是否具有join方法。

  1. join方法存在则会在内部执行join方法,类似this.join(',')
  2. join方法不存在则会调用Object.prototype.toString方法。

 我们通过一个简单的例子便可以验证:

// eg1:
console.log(Array.prototype.toString.call({ join: () => 1 })); // 1

// eg2:
console.log(Array.prototype.toString.call({ join: () => undefined })); // undefined

// eg3:
console.log(Array.prototype.toString.call({ join: 'not a function' })); // [object Object]

 上述的第一个例子是如何得到结果1的呢?首先我们要注意到上述的代码将toString的执行时上下文绑定为具有join方法的对象,那么 按照上述的执行过程,将执行第一步:执行执行时上下文中的join方法,此时得到join方法的执行结果1,也就是该行代码的结果。

 第二个例子可以更有力的证明,Array的原型对象将优先执行join方法,而从第三个例子则可以验证上述的第二个过程,此时的join并不是一个方法,因此将调用Object.prototyp.toString方法。

二、利用join的"数组扁平化"

 比较有意思的是我们发现使用数组的join方法能够扁平化一些高维的数组(注意:数组中只能存放基础数据类型!!)为字符串。先举个例子吧:

[1, [2, [3, [4, [5]]]]].join(","); //'1,2,3,4,5'

 上述的例子我们将一个高维度的数组转为了一串一维的字符串,如果当我们知道数组中的元素全都为同一个类型时完全可以利用join完成一个简单的扁平化操作:

[1, [2, [3, [4, [5]]]]].join(",").split(",").map(Number); // [1, 2, 3, 4, 5]

 当然了,这样的写法缺陷太大了,首先你得明确元素的类型都为同一个元素、且不能有引用类型的属性存在,否则将以[object Object]的形式出现在结果中。

 细心的小伙伴在这里应该能猜到为什么使用join能够将一个高维度的数组转为一串简单字符,这是因为join的执行时会将每一个元素都先转为String的形式,因此对于引用类型将执行其身上的toString方法,而在前文提到了数组的toString方法本质上是调用的join方法,那么这就形成了一个"小递归"。过程如下:

[1, [2, [3, [4, [5]]]]].join(", ") 
=> "1, " + [2, [3, [4, [5]]]].toString() 
=> "1, " + "2, " + [3, [4, [5]]].toString() 
=> "1, 2, " + "3, " + [4, [5]].toString() 
=> "1, 2, 3, " + "4, " + [5].toString() 
=> "1, 2, 3, 4, " + "5"
=> "1, 2, 3, 4, 5"

 这样我们将一个高维数组扁平成了一个基础字符串,当然将外层的join修改为toString同样可行。这一小节的"扁平化"并不推荐使用到项目中去,因为Array.prototype上有一个专门的扁平化方法flat,是由JS内部引擎优化过的代码,性能上远远优于本节中的"错误"方式。

三、总结

 本文主要探究了数组原型上的toString方法的内部执行过程,以及使用简单的例子来验证这个过程。并通过一个"扁平化"的小例子基础的了解了join方法的执行过程。

MDN(Mozilla Developer Network)和javascript.info都是非常受欢迎的JavaScript文档和教程网站,它们在JavaScript开发社区中都享有很高的声誉。然而,它们在内容、风格和目标受众上有一些不同之处。 MDN作为Mozilla基金会的官方文档网站,提供了广泛的Web技术文档,包括JavaScript。它的内容非常全面,详细介绍了JavaScript的各个方面,从语法基础到高级概念和API参考都有涉及。MDN的文档通常更加正式、详实,并且有良好的组织结构和维护。 javascript.info是由一位独立开发者编写和维护的教程网站,旨在提供简洁、易于理解的JavaScript教程。它以教学为主,适合初学者和中级开发者。javascript.info的教程风格更加友好、亲切,并且提供了大量的实例和示例代码。 关于哪个网站更权威,这取决于你所追求的目标和需求。如果你需要详细、全面的参考文档和规范解释,MDN是一个非常可靠的选择。如果你是初学者或更倾向于通过教程来学习和理解JavaScriptjavascript.info提供了更加友好和易于理解的教程。 在实际开发中,建议结合两个网站的内容,根据自己的学习和开发需求来查阅和参考。不同的网站可能在某些主题或方面提供了不同的解释和示例,多方参考可以帮助你获得全面的理解和知识。同时,也可以参考其他可靠的资源,如官方规范、书籍和其他开发者社区的贡献。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Donp1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值