Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';数组的原理是什么?_Javascript_Arrays_Ecmascript 6_Ecma262 - Fatal编程技术网

Javascript 什么';数组的原理是什么?

Javascript 什么';数组的原理是什么?,javascript,arrays,ecmascript-6,ecma262,Javascript,Arrays,Ecmascript 6,Ecma262,使用数组构造函数是将类似数组的对象转换为数组的最快方法 我想弄清楚它是如何工作的,但我失败了。在中,我找不到相应的方法来解释该代码 为什么数组构造函数接受类似数组的对象可以将其转换为数组 使用,可以调用函数并传递应用作类似数组的对象的参数 所以Array.apply(null,{0:a',1:b',length:2})相当于Array('a','b') 并且可以使用()构造数组: 由于数组属于那些可以不使用new构造的对象,因此给定的代码将使用这些元素构造数组。使用这些元素,您可以调用函数并传

使用数组构造函数是将类似数组的对象转换为数组的最快方法

我想弄清楚它是如何工作的,但我失败了。在中,我找不到相应的方法来解释该代码

为什么数组构造函数接受类似数组的对象可以将其转换为数组

使用,可以调用函数并传递应用作类似数组的对象的参数

所以
Array.apply(null,{0:a',1:b',length:2})
相当于
Array('a','b')

并且可以使用()构造数组:

由于数组属于那些可以不使用
new
构造的对象,因此给定的代码将使用这些元素构造数组。

使用这些元素,您可以调用函数并传递应用作类似数组的对象的参数

所以
Array.apply(null,{0:a',1:b',length:2})
相当于
Array('a','b')

并且可以使用()构造数组:

而且,由于数组属于那些可以在不使用
new
的情况下构造的对象,因此给定的代码将使用这些元素构造一个数组。

使用时,第二个参数采用。类数组基本上是一个具有数字键和
length
属性的对象,但不一定是数组,例如

然后,该参数将被提供给您调用的函数
apply
on,就好像它是该函数的所有参数一样:

函数foo(一,二,三){ console.log(“一:”,一); console.log(“两个:”,两个); 日志(“三:”,三); } //正常调用 福(“你好”,“世界”,“!”); //。使用类似于 apply(null,{0:“nice”,1:“meeting”,2:“you”,长度:3}); //。使用数组应用 foo.apply(null,[“见”,“你”,“以后])使用时,第二个参数的值为。类数组基本上是一个具有数字键和
length
属性的对象,但不一定是数组,例如

然后,该参数将被提供给您调用的函数
apply
on,就好像它是该函数的所有参数一样:

函数foo(一,二,三){ console.log(“一:”,一); console.log(“两个:”,两个); 日志(“三:”,三); } //正常调用 福(“你好”,“世界”,“!”); //。使用类似于 apply(null,{0:“nice”,1:“meeting”,2:“you”,长度:3}); //。使用数组应用
foo.apply(null,[“见”,“你”,“以后])因为您提到了ECMAScript,所以您的答案依赖于此处:。简而言之,
Array.apply(null,a)
与使用
…项调用构造函数完全相同。但是,我不确定是否调用了该构造函数签名,或者是否调用了接受…项和长度的构造函数。由于您提到了ECMAScript,您的答案依赖于此处:。简而言之,
Array.apply(null,a)
与使用
…项调用构造函数完全相同。不过,我不确定是否调用了该构造函数签名,或者是否调用了接受…items和length的构造函数。感谢您的帮助:)在我的新测试中,Array.apply(null,'123')`将在非对象
上抛出一个类似调用的
CreateListFromArrayLike错误,因此,它似乎会在构造函数中调用CreateListFromArrayLike函数,类似地,我在其中找不到任何描述。@Erice这里的问题正是消息所暗示的-您没有对象。您传递的是一个基元,而不是具有数字键和
length
属性的基元。您可以对字符串进行数组访问,例如,
“abc”[0]
,但这实际上会将字符串原语强制转换为对象,并且仅用于操作。因此,如果您使用
.apply
传递一个字符串对象,它将运行
数组.apply(null,新字符串(“123”)
@VLAZ谢谢,我已经找到了它。
Array.from('123')
可以工作的原因是内部函数将通过
Object('123')
123
转换为
String{“123”}
,不同之处在于
Array.from()
接受类似数组的对象或iterable对象
Function.prototype.apply()
只接受类似数组的对象。字符串具有
[@@iterator]()
,并计为可迭代对象。4-6适用于当前规范中的字符串。另一方面,在apply函数中使用的具有
如果Type(obj)不是Object,则抛出TypeError异常。
@Eriice
对象(arrayLike)
不应用于字符串(即使它具有相同的效果),这在的polyfill中会产生误导。字符串是iterable是在引入
Array.from
的同时添加的。感谢您的帮助:)在我的新测试中,Array.apply(null,'123')`将抛出一个
CreateListFromArrayLike调用非object
错误,因此,它似乎会调用构造函数中的CreateListFromArrayLike函数,类似地,我在里面找不到任何描述。@Erice这里的问题正是消息所暗示的——你没有对象。您传递的是一个基元,而不是具有数字键和
length
属性的基元。您可以对字符串进行数组访问,例如,
“abc”[0]
,但这实际上会将字符串原语强制转换为对象,并且仅用于操作。因此,如果您使用
.apply
传递一个字符串对象,它将运行
数组.apply(null,新字符串(“123”)
@VLAZ谢谢,我已经找到了它。
Array.from('123')
可以工作的原因是内部函数将通过
Object('123')
123
转换为
String{“123”}
,不同之处在于
Array.from()
接受类似数组的对象或iterable对象
Function.prototype.apply()
只接受类似数组的对象。一串
let a = {0: 'a', 1: 'b', length: 2}
Array.apply(null, a) // ['a', 'b']
new Array(element0, element1[, ...[, elementN]])