搜索
首页web前端js教程jQuery中.makeArray()如何实现将多种类型转换成JS原生Array的实例分析

jQuery.makeArray(obj)这个函数从名字上来看很容易猜出它的用途:应该是用来将传入的对象转换成一个原生array

再看看官网上对它的解释:Convert an array-like object into a true JavaScript array.(将一个类似数组对象转换为JS原生的数组)

那么怎么样的object才可以称为"array-like object"呢?这个问题不急着回答,相信看完文章你会明白的,先看看下面的实验

将HTMLCollection转换成原生Array

<!doctype html>
<html lang="en">
	<head>
		<meta charset="utf-8">
		<title>jQuery.makeArray demo</title>
		<style>
			p {
				color: red;
			}
		</style>
		<script src="//code.jquery.com/jquery-1.10.2.js"></script>
	</head>
	<body>
		<p> First </p> <p> Second </p> <p> Third </p> <p> Fourth </p>
		<script>
			// Returns a NodeList
			var elems = document.getElementsByTagName("p");
			// Convert the NodeList to an Array
			var arr = jQuery.makeArray(elems);
			// Use an Array method on list of dom elements
			arr.reverse();
			$(arr).appendTo(document.body);
		</script>
	</body>
</html>

这里可以看到在chrome中通过document.getElementsByTagName("p")返回的是一个HTMLCollection

而非官网上所说的NodeList,特意去找了NodeList和HTMLCollection的区别:HTMLCollection 对象和 NodeList 对象很相似,但前者可能既能用名称索引也能用数字索引,而后者只能用数字索引来访问(当然NodeList也是“array-like object”)

经过实验发现elems可以通过名称和数组来索引,结论:在chrome中通过document.getElementsByTagName("p")返回的是一个HTMLCollection

HTMLCollection可以通过elems.length获取它的长度,并且可以通过elems[0]这样的方式来访问其中的元素

像不像数组的访问方式?其实它就是就一个“Array-like object”,但是它并不是js的原生数组,所以无法访问array的native方法,比如(.pop() and .reverse()

而后面通过jQuery.makeArray(elems)转换就得到了原生的JS数组arr,接下来就可以使用array的native方法了!

将jQuery包裹的数组转换成原生Array

除了HTMLCollection,还可以转换什么呢?听说过jQuery包裹的数组这么一个玩意儿吗?

不过肯定接触过,比如通过$('p')得到一组p,这一组p就是一个jQuery包裹的数组

又比如,通过.map()函数得到的也是一个jQuery包裹的数组,也可以length来得到长度,并通过下标索引来访问,并且jQuery包裹的数组还可以使用jQuery提供的方法。

可以通过$.makeArray(obj)来转换成原生Array,比如最常见的在.map()函数中得到jQuery数组之后转换成原生array再通过join()得到结果

当然,将jQuery包裹的数组转换成原生数组的方法不止这一种,常见的还有.get()和.toArray()

将json对象转换成原生Array

这一种情况稍微复杂一点,因为json对象本不是“array-like object”,所以我们需要一种转换

还记得之前我们说的几种“array-like object”吗?它们都可以通过.length来得到长度,并且可以通过下标索引来访问,比如:fakeArr.length、fakeArr[0]

那么我们是否可以通过让json支持这样的方式来将它变成“array-like object”呢?

先设计一下:

要让json支持fakeArr.length,简单,只需要定义一个key为length的 键值对就OK了

而支持下标访问似乎也可以迎刃而解,另外键值对都使用数字来作为key就好了~

那么试试吧:

var fakeArray = {0: "张三", 1: "李四", 2:"朱六", length:3};
var realArray = $.makeArray(fakeArray);
console.log(fakeArray)
console.log(realArray)
realArray.reverse();
console.log(realArray);

看到了吗?成功了!这里的realArray已经是js的原生array了,所以可以使用reverse()等native方法

需要注意的是,转换过程中length很重要,这个length也就是决定了转换后array的length

若将上述例子中的length指定为2,那么转换后的数组只有前2个元素,也就是["张三", "李四"]

若将上述例子中的length指定为4,那么转换后的数组并不会是我们希望的数组,而是类似于 new Array().push(fakeArray) 这样一个数组

以上是jQuery中.makeArray()如何实现将多种类型转换成JS原生Array的实例分析的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Java vs JavaScript:开发人员的详细比较Java vs JavaScript:开发人员的详细比较May 16, 2025 am 12:01 AM

javaandjavascriptaredistinctlanguages:javaisusedforenterpriseandmobileapps,while javascriptifforInteractiveWebpages.1)JavaisComcompoppored,statieldinglationallyTypted,statilly tater astrunsonjvm.2)

JavaScript数据类型:浏览器和nodejs之间是否有区别?JavaScript数据类型:浏览器和nodejs之间是否有区别?May 14, 2025 am 12:15 AM

JavaScript核心数据类型在浏览器和Node.js中一致,但处理方式和额外类型有所不同。1)全局对象在浏览器中为window,在Node.js中为global。2)Node.js独有Buffer对象,用于处理二进制数据。3)性能和时间处理在两者间也有差异,需根据环境调整代码。

JavaScript评论:使用//和 / * * / * / * /JavaScript评论:使用//和 / * * / * / * /May 13, 2025 pm 03:49 PM

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python vs. JavaScript:开发人员的比较分析Python vs. JavaScript:开发人员的比较分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

Python vs. JavaScript:选择合适的工具Python vs. JavaScript:选择合适的工具May 08, 2025 am 12:10 AM

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript:了解每个的优势Python和JavaScript:了解每个的优势May 06, 2025 am 12:15 AM

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

JavaScript的核心:它是在C还是C上构建的?JavaScript的核心:它是在C还是C上构建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript应用程序:从前端到后端JavaScript应用程序:从前端到后端May 04, 2025 am 12:12 AM

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)