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

这篇具有很好参考价值的文章主要介绍了[阅读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方法的执行过程。文章来源地址https://www.toymoban.com/news/detail-497412.html

到了这里,关于[阅读MDN]之Array.prototype.toString的过程探究的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js判断类型:typeof Object.prototype.toString instanceof constructor有什么区别?一文讲清楚

    相信很多小伙伴在使用js的过程中,经常会需要对js的数据类型进行判断,而js中可以对数据类型进行判断的方法有很多种,最常见的有typeof、Object.prototype.toString、instanceof、constructor这四种,那么他们有什么区别呢? 目录 js数据类型 typeof 为啥typeof会将null判断为object Object.pr

    2024年02月11日
    浏览(40)
  • JavaScript中手动实现Array.prototype.map方法

    在前端开发中,我们经常需要对数组进行操作和处理。在JavaScript中,数组是常用的数据类型之一。而数组的map方法可以将一个数组中的每个元素都进行某种操作,并返回一个新的数组。今天,我们就来手动实现JavaScript中数组原型的map方法。 首先,让我们回顾一下map方法的基

    2024年02月21日
    浏览(42)
  • javascript二维数组(9)toString的用法

    在JavaScript中, toString() 是一个内置方法,用于将特定的对象转化为字符串表示形式。 以下是一些 toString() 方法的基本使用示例: 数字的 toString() : 日期的 toString() : 数组的 toString() : 注意,对于数组, toString() 方法在每个元素之间添加逗号,而在字符串的末尾添加一个逗

    2024年02月07日
    浏览(36)
  • shell 数组 ${array[@]} ${array[*]}的使用及区别

    shell中用括号来表示数组,数组元素间使用空格隔开。 例如: a=(1 2 3 4) 表示a数组且有元素为1,2,3,4 也可单个元素逐步来赋值 关联数组 定义关联数组,数组元素带键,键是唯一的。  declare -A array_name 通常使用下标来选择元素  可以使用${array[@]} ,${array[*]}来获取所有元素 区别

    2024年02月11日
    浏览(53)
  • 二维数组(Dyadic Array)

    一维数组 : 数组中直接存放数据 二维数组 : 数组中存放数组 二维数组可以看成以数组为元素的数组。就是一个特殊的一维数组,其每一个元素都是一个一维数组 其实多维数组不仅仅只有二维数组,还有三维数组,四维数组…, 但是三维以上很少见到,所以大家重点了解二维数组即

    2024年03月24日
    浏览(41)
  • JS对象-数组(Array)

    1.        arr1.concat(arr2,arr3..) 合并数组 2.        arr1.join(\\\"指定字符串\\\"); 将数组按指定字符串拼接成一个新的字符串             arr1.toString() 转字符串,默认,分割 无法指定 3.    arr1.pop() 删除最后一个元素         arr1.push(\\\"元素\\\") 在结尾添加元素(可多个) 4.       

    2024年02月11日
    浏览(46)
  • python中的数组(Array)

    作者简介 :一名后端开发人员,每天分享后端开发以及人工智能相关技术,行业前沿信息,面试宝典。 座右铭 :未来是不可确定的,慢慢来是最快的。 个人主页 :极客李华-CSDN博客 合作方式 :私聊+ 这个专栏内容 :BAT等大厂常见后端java开发面试题详细讲解,更新数目10

    2024年02月08日
    浏览(37)
  • 【论文阅读】Self-supervised Image-specific Prototype Exploration for WSSS

    一篇CVPR2022上的论文,用于弱监督分割 Self-supervised Image-specific Prototype Exploration for Weakly Supervised Semantic Segmentation https://github.com/chenqi1126/SIPE https://openaccess.thecvf.com/content/CVPR2022/papers/Chen_Self-Supervised_Image-Specific_Prototype_Exploration_for_Weakly_Supervised_Semantic_Segmentation_CVPR_2022_paper.pdf 现

    2024年02月11日
    浏览(40)
  • 数据结构与算法 | 数组(Array)

    数组(Array)应该是最基础的数据结构之一,它由相同类型的元素组成的集合,并按照一定的顺序存储在内存中。每个元素都有一个唯一的索引,可以用于访问该元素。 数组索引(Index): 数组中的每个元素都有一个唯一的整数索引,从0开始计数。索引用于访问数组中的元素

    2024年02月08日
    浏览(51)
  • Hive中数组array的相关应用

    array():创建一个数组。split(string,delimiter):按指定字符分隔字符串成数组。 array[int]:获取数组元素。 角标从0开始,越界返回NULL。 array_max(array):返回数组中的最大值。 array_min(array):返回数组中的最小值。 array_join(array, delimiter):使用指定的分隔符将数组中的元素连接成一

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包