• 关于

    数组末尾

    的搜索结果

回答

从Swift 3/4/5开始,操作如下。 向数组末尾添加新元素。 anArray.append("This String") 将另一个数组附加到数组的末尾。 anArray += ["Moar", "Strings"] anArray.append(contentsOf: ["Moar", "Strings"]) 向您的数组中插入一个新元素。 anArray.insert("This String", at: 0) 将另一个数组的内容插入到数组中。 anArray.insert(contentsOf: ["Moar", "Strings"], at: 0) 问题来源于stack overflow
保持可爱mmm 2020-01-15 16:50:56 0 浏览量 回答数 0

问题

将单个元素添加到numpy中的数组

我有一个numpy数组,其中包含: [1, 2, 3] 我想创建一个包含以下内容的数组: [1, 2, 3, 1] 也就是说,我想将第一个元素添加到数组的末尾。 我已经尝试了明显...
保持可爱mmm 2020-02-08 11:56:33 0 浏览量 回答数 1

回答

首先,javascript中的数组和对象是不同的概念(学术上来说,数组也是对象,但这里不考虑这一层面)。数组是没有key的(确切地说,只有数字key)。假如有数组arr要在数组中追加元素的话,加在末尾用arr.push(新元素),加在开头用arr.unshift(新元素)。对象是有key的键值对。要在对象中增加新的键值对,直接为该key赋值即可,比如obj对象中新增一个key叫test,value为testValue,写法是obj.test = 'testValue'。
a123456678 2019-12-02 02:06:04 0 浏览量 回答数 0

回答

这不是“静态内存分配”。您的数组k是可变长度数组(VLA),这意味着该数组的内存在运行时分配。大小将由的运行时值确定n。 语言规范没有规定任何特定的分配机制,但是在典型的实现中,您k通常最终将成为一个简单的int *指针,并在运行时在堆栈上分配实际的内存块。 对于VLA sizeof运算符,还需要在运行时对其进行评估,这就是为什么您在实验中从中获得正确值的原因。只需使用%zu(而不是%ld)打印type的值size_t。 malloc(和其他动态内存分配功能)的主要目的是覆盖适用于本地对象的基于范围的生存期规则。即,分配给内存的内存将malloc“永远”分配,或者直到您使用显式取消分配内存为止free。分配malloc有的内存不会在块的末尾自动释放。 在您的示例中,VLA不提供这种“破坏范围”的功能。您的数组k仍然遵守常规的基于作用域的生存期规则:其生存期在块末尾结束。因此,在一般情况下,VLA无法替换malloc其他动态内存分配功能。 但是在特定情况下,当您不需要“破坏作用域”而只malloc需要分配运行时大小的数组时,VLA确实可以被视为替代malloc。再次请记住,VLA通常是在堆栈上分配的,到目前为止,在堆栈上分配大块内存仍然是一个相当可疑的编程实践。
保持可爱mmm 2020-02-09 12:01:24 0 浏览量 回答数 0

问题

在Swift中向数组添加元素

假设我有一个数组,例如: var myArray = ["Steve", "Bill", "Linus", "Bret"] 然后我想将一个...
保持可爱mmm 2020-01-15 16:50:38 0 浏览量 回答数 1

问题

数组处理函数是什么?

array_distinct(x) → array 从数组 x 删除相同的值. array_intersect(x, y) → array 返回 x 与 y 的交集,没有重复. array_union(x, y) → array 返回 ...
nicenelly 2019-12-01 21:26:41 1224 浏览量 回答数 0

回答

array_push()的主要用途是可以将多个值压入数组的末尾。 它在文档中说: 如果使用array_push()将一个元素添加到数组中,则最好使用$ array [] =,因为这样就不会产生调用函数的开销。
保持可爱mmm 2020-02-08 10:56:07 0 浏览量 回答数 0

回答

编译的版本使用数组初始化程序进行初始化list1。C#语言规范§1.110(“数组初始化器”)规定: 数组初始化程序由一系列变量初始化程序组成,这些变量初始化程序由“ {”和“}”标记包围,并由“,”标记分隔。每个变量初始化器都是一个表达式,对于多维数组,则是一个嵌套数组初始化器。 使用数组初始化程序的上下文确定要初始化的数组的类型。在数组创建表达式中,数组类型紧接在初始化器之前,或者从数组初始化器中的表达式推断出来。在字段或变量声明中,数组类型是要声明的字段或变量的类型。 在字段或变量声明中使用数组初始化程序时,例如: int[] a = {0, 2, 4, 6, 8}; 它只是等效数组创建表达式的简写形式: int[] a = new int[] {0, 2, 4, 6, 8}; 因此很明显,应该编译。 第二个版本使用显式的数组创建表达式,您可以在其中明确指示编译器创建哪种类型的数组。§1.51.10.4(“数组创建表达式”)规定: 第三种形式的数组创建表达式称为 隐式类型的数组创建表达式。它与第二种形式相似,不同之处在于未明确给出数组的元素类型,而是将其确定为数组初始值设定项中表达式集的最佳通用类型(第1.50.2.14节)。 因此,第二个版本相当于 object[] list2 = new int[] { 0, 1 }; 因此,问题实际上变成了“为什么我不能分配int[]一个object[]”,就像您在问题末尾提到的那样。答案也很简单,如第1.109节(“数组协方差”)所示: 数组协方差尤其不扩展到值类型数组。例如,不存在允许将an int[] 视为的转换object[]。
保持可爱mmm 2020-02-08 22:08:13 0 浏览量 回答数 0

回答

一个解决方案是使用end和(引用)的组合:key end() 将array的内部指针前进到最后一个元素,并返回其值。 key() 返回当前数组位置的索引元素。 因此,像这样的一部分代码应该可以解决问题: $array = array( 'first' => 123, 'second' => 456, 'last' => 789, ); end($array); // move the internal pointer to the end of the array $key = key($array); // fetches the key of the element pointed to by the internal pointer var_dump($key); 将输出: string 'last' (length=4) 即我数组的最后一个元素的键。 完成此操作后,数组的内部指针将位于数组的末尾。如注释中所指出的,您可能希望reset()在数组上运行以将指针带回到数组的开头。 问题来源于stack overflow
保持可爱mmm 2020-01-15 16:49:06 0 浏览量 回答数 0

回答

以下为个人猜想没有确切的理论依据: push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。 根据MDN的说法理解,push方法应该是根据数组的length来根据参数给数组创建一个下标为length的属性,我们可以做以下测试: 根据这个测试我们发现,push方法影响了数组的length属性和对应下标的值。 在对象中加入splice属性方法,和length属性后。这个对象变成一个类数组。 我们使用题目中的代码时得到了这个结果: 这个时候控制台输出的是一个数组,但是实际上它是一个伪数组,并没有数组的其他属性和方法,我们可以通过这种方法验证: 所以我认为题目的解释应该是: 使用第一次push,obj对象的push方法设置 obj[2]=1;obj.length+=1使用第二次push,obj对象的push方法设置 obj[3]=2;obj.length+=1使用console.log输出的时候,因为obj具有 length 属性和 splice 方法,故将其作为数组进行打印打印时因为数组未设置下标为 0 1 处的值,故打印为empty,主动 obj[0] 获取为 undefined 第一第二步还可以具体解释为:因为每次push只传入了一个参数,所以 obj.length 的长度只增加了 1。push方法本身还可以增加更多参数,详见 MDN
九旬 2020-05-24 11:49:10 0 浏览量 回答数 0

回答

关键看这里while (EOF != (n = input.read(buffer)))文档里是这么说的:public int read(byte[] b) throws IOException从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。如果 b 的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少读取一个字节并将其存储在 b 中。 将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。读取的字节数最多等于 b 的长度。设 k 为实际读取的字节数;这些字节将存储在 b[0] 到 b[k-1] 的元素中,不影响 b[k] 到 b[b.length-1] 的元素。 类 InputStream 的 read(b) 方法的效果等同于:read(b, 0, b.length)就是说每次最多读4096字节,如果多于4096字节会由while循环读取多次.
蛮大人123 2019-12-02 01:55:16 0 浏览量 回答数 0

回答

遍历数组中的值,并按json格式去 格式化每一组数组,拼接起来即可 以下是用例,我测试了下,是可以的,不知道有没有更加高效的办法 //1. 初始化可变字符串,存放最终生成json字串 NSMutableString *jsonString = [[NSMutableString alloc] initWithString:@"{\"actorhalls\":["]; for(ExecplanActosHall *hall in actorhalls){ //2. 遍历数组,取出键值对并按json格式存放 NSString *string; string = [NSString stringWithFormat: @"{\"ownerName\":\"%@\",\"ownerId\":\"%@\",\"channelId\":\"%@\",\"ownerType\":\"%ld\"},",hall.ownerName,hall.ownerId,hall.channelId,(long)hall.ownerType]; [jsonString appendString:string]; } // 3. 获取末尾逗号所在位置 NSUInteger location = [jsonString length]-1; NSRange range = NSMakeRange(location, 1); // 4. 将末尾逗号换成结束的]} [jsonString replaceCharactersInRange:range withString:@"]}"]; NSLog(@"jsonString = %@",jsonString);
杨冬芳 2019-12-02 03:01:11 0 浏览量 回答数 0

问题

数组与向量:入门的相似点和不同点

C ++中的数组和向量之间有什么区别?差异的示例可能包括库,符号,能力等。 数组 数组包含特定数量的特定类型的元素。为了使编译器可以在编译程序时保留所需的空间量,必须...
保持可爱mmm 2020-02-08 11:05:09 0 浏览量 回答数 1

回答

如果要连接两个以上的数组,concat()那么这样做是为了方便和可能的性能。 var a = [1, 2], b = ["x", "y"], c = [true, false]; var d = a.concat(b, c); console.log(d); // [1, 2, "x", "y", true, false]; 对于仅连接两个数组,可以使用push接受多个包含要添加到数组中的元素的参数的事实来代替将一个数组中的元素添加到另一个数组的末尾而不产生新数组。使用slice()它也可以代替它,concat()但是这样做似乎没有性能优势。 var a = [1, 2], b = ["x", "y"]; a.push.apply(a, b); console.log(a); // [1, 2, "x", "y"]; 在ECMAScript 2015及更高版本中,这可以进一步减少到 a.push(...b) 但是,对于大型数组(大约100,000个成员或更多),似乎将元素数组传递给push(使用apply()或ECMAScript 2015扩展运算符)的技术可能会失败。对于此类阵列,使用循环是一种更好的方法。 问题来源于stack overflow
保持可爱mmm 2020-01-16 15:41:49 0 浏览量 回答数 0

问题

如何在PHP的数组开头插入项目?

我知道如何通过以下方式将其插入到末尾: $arr[] = $item; 但是如何将其插入到开始呢? 问题来源于stack overflow...
保持可爱mmm 2020-02-07 00:20:12 1 浏览量 回答数 1

问题

通过PHP数组插入多行到MySQL

我正在使用插入命令通过PHP将大型数据集传递到MySQL表中,并且我想知道是否有可能通过查询而不是将每个值附加到一英里长的字符串的末尾一次插入大约1000行,然后执行它。我正在使用CodeIgniter框架&#x...
保持可爱mmm 2020-05-10 17:19:38 0 浏览量 回答数 1

回答

使用-1索引(负索引从数组末尾开始向后计数): a[-1] # => 5 b[-1] # => 6 或Array#last方法: a.last # => 5 b.last # => 6
保持可爱mmm 2020-02-08 14:24:34 0 浏览量 回答数 0

回答

/** * 选择排序算法 * 在未排序序列中找到最小元素,存放到排序序列的起始位置 * 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。 * 以此类推,直到所有元素均排序完毕。 * @param numbers */ public static void selectSort(int[] numbers) { int size = numbers.length; //数组长度 int temp = 0 ; //中间变量 for(int i = 0 ; i < size ; i++) { int k = i; //待确定的位置 //选择出应该在第i个位置的数 for(int j = size -1 ; j > i ; j--) { if(numbers[j] < numbers[k]) { k = j; } } //交换两个数 temp = numbers[i]; numbers[i] = numbers[k]; numbers[k] = temp; } }
聚小编 2019-12-02 01:18:06 0 浏览量 回答数 0

问题

旋转数组的最小数字 6月22日 【今日算法】

今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题11.旋转数组的最小数字。根据统计,在腾讯的算法面试环节出现频率较高,属于简单中等难度。 一、题目描述 把一个数组最开始的若干个元素搬...
游客ih62co2qqq5ww 2020-06-22 14:00:50 0 浏览量 回答数 0

回答

您正在观察到由Java VM的JIT编译器进行的优化所引起的行为。此行为在最多包含64个元素的标量数组中触发时可重现,而在大于64个数组中则不会触发。 在进入细节之前,让我们仔细看一下循环的主体: double[] test = new double[64]; 身体没有作用(可观察到的行为)。这意味着无论是否执行该语句,在程序执行之外都没有区别。整个循环也是如此。因此,代码优化器可能会将循环转换为具有相同功能和不同定时行为的某种东西(或什么都没有)。 对于基准测试,您至少应遵守以下两个准则。如果您这样做,则差异会小得多。 通过多次执行基准测试来预热JIT编译器(和优化器)。 使用每个表达式的结果并将其打印在基准测试的末尾。 现在让我们详细介绍。毫不奇怪,对于不大于64个元素的标量数组会触发优化。优化是转义分析的一部分。它将小对象和小数组放到堆栈上,而不是在堆上分配它们-甚至更好地完全优化它们。您可以在下面由Brian Goetz在2005年撰写的文章中找到有关此信息的信息: 回顾城市绩效传奇:分配比您想象的要快,而且越来越快 可以使用命令行选项禁用优化-XX:-DoEscapeAnalysis。标量数组的魔术值64也可以在命令行上更改。如果按以下方式执行程序,则包含64和65个元素的数组之间将没有区别: java -XX:EliminateAllocationArraySizeLimit=65 Tests 话虽如此,我强烈不鼓励使用此类命令行选项。我怀疑这在实际应用中会带来巨大的不同。如果我完全确信其必要性,而不是基于某些伪基准测试的结果,我只会使用它。
保持可爱mmm 2020-02-08 13:17:06 0 浏览量 回答数 0

回答

在Java中,您可以使用: str = str.replaceAll("(/|(?!^)\\G)\\d(?=\\d*(?:/|$))", "$1X"); 正则演示 正则表达式详细信息: \G 在上一场比赛的末尾或首场比赛的字符串开头声明位置。(/|(?!^)\G):/捕获组#1中的上一场比赛或比赛的结束(但不是开始)\d:匹配一个数字(?=\d*(?:/|$)):确保数字后跟a /或末尾。替换:: $1X将其替换为捕获组#1,然后是X 回答来源:Stack Overflow
montos 2020-03-22 09:00:11 0 浏览量 回答数 0

问题

对几乎排序的数组排序(元素错位不超过k)

最近有人问我这个面试问题: 您将得到一个几乎已排序的数组,因为每个N元素的错位可能不超过k正确排序顺序的位置。寻找一种时空高效的算法对数组进行排序。 我有以下O(N log k)解决方案。 让我们来表示ar...
保持可爱mmm 2020-02-09 13:05:26 0 浏览量 回答数 1

回答

如果这是PHP,我会用键构建一个数组并array_keys在末尾使用,但是JS却没有这样的奢侈。相反,请尝试以下操作: var flags = [], output = [], l = array.length, i; for( i=0; i<l; i++) { if( flags[array[i].age]) continue; flags[array[i].age] = true; output.push(array[i].age); } 问题来源于stack overflow
保持可爱mmm 2020-01-15 16:36:54 0 浏览量 回答数 0

回答

// 1 使用i-- for (var i = 0; i < arr.length; i++) { if (arr[i] === 4) { arr.splice(i, 1); i--; } } console.log(arr); // 2 从数组的末尾一项开始遍历 for (var i = arr.length; i >= 0; i--) { if (arr[i] === 4) { arr.splice(i, 1); } } console.log(arr);
kun坤 2019-12-02 03:23:01 0 浏览量 回答数 0

问题

JavaScript中unshift()与push()的时间复杂度

我知道JavaScript unshift()和push()方法之间的区别是什么,但是我想知道时间复杂度有什么区别? 我想push()方法是O(1),因为您只是将一个项...
保持可爱mmm 2020-02-09 13:20:05 0 浏览量 回答数 1

问题

Linux重定向消息:__strlen_avx2,__mempcpy_avx_unaligned_e

我对收到的三个重定向消息有疑问。只是为了给我的程序一些背景... 我正在使用C编程和Linux。我从包含字典中所有单词的文件中读取数字。我从文件中提取单词,然后将它们保存在一个字符串对象中,该对象由3件事组成&...
祖安文状元 2020-01-16 17:40:29 0 浏览量 回答数 1

问题

JSON函数是什么?

json_array_contains(json, value) → boolean 确定json中是否存在值(包含JSON数组的字符串) SELECT json_array_contains(‘[1, 2, 3...
nicenelly 2019-12-01 21:26:37 1408 浏览量 回答数 0

回答

问题是由放置在数组中的JSON对象(在每种情况下)的末尾逗号引起的: { "number": "...", "title": ".." , //<- see that comma? } 如果删除它们,您的数据将成为 [ { "number": "3", "title": "hello_world" }, { "number": "2", "title": "hello_world" } ] 和 Wrapper[] data = gson.fromJson(jElement, Wrapper[].class); 应该工作正常。
保持可爱mmm 2020-02-08 10:41:02 0 浏览量 回答数 0

回答

干得好: var yourArray = String 上面的内容还适用于其他类型,而不仅仅是字符串。这只是一个例子。 为它增值 我想您最终将要为其添加一个值! yourArray.append("String Value") 要么 let someString = "You can also pass a string variable, like this!" yourArray.append(someString) 通过插入添加 一旦有了一些值,就可以插入新值而不是附加值。例如,如果要在数组的开头插入新对象(而不是将它们附加到末尾): yourArray.insert("Hey, I'm first!", atIndex: 0) 或者,您可以使用变量使插入更加灵活: let lineCutter = "I'm going to be first soon." let positionToInsertAt = 0 yourArray.insert(lineCutter, atIndex: positionToInsertAt) 您可能最终想删除一些东西 var yourOtherArray = ["MonkeysRule", "RemoveMe", "SwiftRules"] yourOtherArray.remove(at: 1) 当您知道该值在数组中的位置时(即,当您知道其索引值时),上述方法非常有用。当索引值从0开始时,第二个条目将在索引1处。 在不知道索引的情况下删除值 但是,如果不这样做怎么办?如果yourOtherArray具有数百个值,而您只想删除一个等于“ RemoveMe”的值,该怎么办? if let indexValue = yourOtherArray.index(of: "RemoveMe") { yourOtherArray.remove(at: indexValue) } 这应该让您开始! 问题来源于stack overflow
保持可爱mmm 2020-02-06 23:56:31 0 浏览量 回答数 0

回答

JavaScript具有强大的语义,可以遍历数组和类似数组的对象。我将答案分为两部分:真正数组的选项,以及仅是数组之类的东西的选项,例如arguments对象,其他可迭代对象(ES2015 +),DOM集合,等等。 我会很快注意到,您现在可以通过将ES2015转换为ES5 ,甚至在ES5引擎上使用ES2015选项。搜索“ ES2015 transpiling” /“ ES6 transpiling”以了解更多... 好吧,让我们看看我们的选择: 对于实际数组 您目前在ECMAScript 5(“ ES5”)中拥有三个选项,这是目前最广泛支持的版本,在ECMAScript 2015中又添加了两个选项(“ ES2015”,“ ES6”): 使用forEach及相关(ES5 +) 使用一个简单的for循环 正确使用for-in 使用for-of(隐式使用迭代器)(ES2015 +) 明确使用迭代器(ES2015 +) 细节: 1.使用forEach及相关 在任何可以访问ArrayES5(直接或使用polyfills)添加的功能的模糊现代环境(因此,不是IE8)中,都可以使用forEach(spec| MDN): var a = ["a", "b", "c"]; a.forEach(function(entry) { console.log(entry); }); forEach接受回调函数,以及(可选)this调用该回调时要使用的值(上面未使用)。依次为数组中的每个条目调用回调,从而跳过稀疏数组中不存在的条目。尽管上面只使用了一个参数,但回调函数使用以下三个参数调用:每个条目的值,该条目的索引以及对要迭代的数组的引用(以防您的函数尚未使用它) )。 除非您支持IE8之类的过时浏览器(截至2016年9月,NetApps在该市场上所占份额刚刚超过4%),forEach否则您可以在没有垫片的情况下在通用网页中愉快地使用。如果您确实需要支持过时的浏览器,forEach则可以轻松进行填充/填充(搜索“ es5 shim”以获得多个选项)。 forEach 这样做的好处是您不必在包含范围中声明索引和值变量,因为它们是作为迭代函数的参数提供的,因此可以很好地将作用域限定为该迭代。 如果您担心为每个数组条目进行函数调用的运行时成本,请不必担心;细节。 此外,forEach它是“遍历所有对象”功能,但是ES5定义了其他几个有用的“遍历数组并做事”功能,包括: every(在第一次返回回调false或出现错误时停止循环) some(在第一次返回回调true或发生错误时停止循环) filter(创建一个新数组,其中包含过滤器函数返回的元素,true并省略其返回的元素false) map (根据回调返回的值创建一个新数组) reduce (通过重复调用回调并传入先前的值来建立值;有关详细信息,请参见规范;对汇总数组内容和许多其他内容很有用) reduceRight(如reduce,但按降序而不是升序工作) 2.使用一个简单的for循环 有时,旧方法是最好的: var index; var a = ["a", "b", "c"]; for (index = 0; index < a.length; ++index) { console.log(a[index]); } 如果数组的长度将不会在循环过程中改变,它在性能敏感的代码(不可能),一个稍微复杂一点的版本抓住了长度达阵可能是一个很小的有点快: var index, len; var a = ["a", "b", "c"]; for (index = 0, len = a.length; index < len; ++index) { console.log(a[index]); } 和/或倒数: var index; var a = ["a", "b", "c"]; for (index = a.length - 1; index >= 0; --index) { console.log(a[index]); } 但是,使用现代JavaScript引擎,很少需要消耗掉最后的能量。 在ES2015及更高版本中,可以使索引和值变量在for循环本地: let a = ["a", "b", "c"]; for (let index = 0; index < a.length; ++index) { let value = a[index]; console.log(index, value); } //console.log(index); // would cause "ReferenceError: index is not defined" //console.log(value); // would cause "ReferenceError: value is not defined" 而且,当您执行此操作时,不仅会为每个循环迭代创建一个新的闭包,value而且还会index为每个循环迭代重新创建一个闭包,这意味着在循环主体中创建的闭包保留对为该特定迭代创建的index(和value)的引用: let divs = document.querySelectorAll("div"); for (let index = 0; index < divs.length; ++index) { divs[index].addEventListener('click', e => { console.log("Index is: " + index); }); } 如果您有五个div,则单击第一个将获得“索引为:0”,如果单击最后一个则将为“索引为:4”。如果您使用而不是则无法使用。varlet 3. 正确使用for-in 你会得到别人告诉你使用for-in,但是这不是for-in对。for-in遍历对象的可枚举属性,而不是数组的索引。甚至在ES2015(ES6)中也不保证顺序。ES2015 +不定义为对象属性(通过[[OwnPropertyKeys]],[[Enumerate]]以及使用他们喜欢的东西Object.getOwnPropertyKeys),但它并没有定义for-in将遵循这个顺序。(其他答案的详细信息。) for-in数组上唯一真正的用例是: 这是一个稀疏的数组,里面有巨大的空隙,或者 您正在使用非元素属性,并且希望将它们包括在循环中 仅查看第一个示例:for-in如果使用适当的保护措施,则可以用来访问那些备用阵列元素: // a is a sparse array var key; var a = []; a[0] = "a"; a[10] = "b"; a[10000] = "c"; for (key in a) { if (a.hasOwnProperty(key) && // These checks are /^0$|^[1-9]\d*$/.test(key) && // explained key <= 4294967294 // below ) { console.log(a[key]); } } 请注意以下三个检查: 该对象具有该名称的自身属性(不是从其原型继承的属性),并且 该键是所有十进制数字(例如,正常的字符串形式,而不是科学计数法),并且 该键的值在被强制为数字时为<= 2 ^ 32-2(即4,294,967,294)。这个数字从哪里来?它是规范中数组索引定义的一部分。其他数字(非整数,负数,大于2 ^ 32-2的数字)不是数组索引。它的2 ^ 32的理由- 2是使得大于2 ^ 32下一个最大的索引值- 1,这是一个数组的最大值length可以有。(例如,数组的长度适合于32位无符号整数。)(向RobG表示支持,在我的博客文章的评论中指出我先前的测试不太正确。) 当然,您不会在内联代码中执行此操作。您将编写一个实用程序函数。也许: 4.使用for-of(隐式使用迭代器)(ES2015 +) ES2015将迭代器添加到JavaScript。使用迭代器最简单的方法是new for-of语句。看起来像这样: const a = ["a", "b", "c"]; for (const val of a) { console.log(val); } 在幕后,它从数组中获取一个迭代器并循环遍历,从而从中获取值。这没有使用for-inhas 的问题,因为它使用了由对象(数组)定义的迭代器,并且数组定义了其迭代器遍历其条目(而不是其属性)。与for-inES5 不同,访问条目的顺序是其索引的数字顺序。 5.明确使用迭代器(ES2015 +) 有时,您可能想显式使用迭代器。您也可以这样做,尽管它比笨拙得多for-of。看起来像这样: const a = ["a", "b", "c"]; const it = a.values(); let entry; while (!(entry = it.next()).done) { console.log(entry.value); } 迭代器是与规范中的迭代器定义匹配的对象。每次调用时,其next方法都会返回一个新的结果对象。结果对象具有属性,done告诉我们是否完成操作,以及一个value具有该迭代值的属性。(done如果是false,value则为可选,如果是,则为可选undefined。) 的含义value取决于迭代器;数组至少支持三个返回迭代器的函数: values():这是我上面使用的那个。它返回迭代,其中每个value是用于该迭代阵列条目("a","b",和"c"在实施例更早)。 keys():返回一个迭代器,每个迭代器value都是该迭代的关键(因此,对于我们a上面的代码,将是"0",然后是"1",然后是"2")。 entries():返回一个迭代器,其中每个迭代器value都是[key, value]该迭代形式的数组。 对于类似数组的对象 除了真正的数组之外,还有一些类数组对象,它们具有一个length或多个具有数字名称的属性:NodeList实例,arguments对象等。我们如何遍历它们的内容? 对数组使用上面的任何选项 上面的至少一些(可能是大多数甚至全部)数组方法经常同样适用于类似数组的对象: 使用forEach及相关(ES5 +) 上的各种功能Array.prototype是“有意通用的”,通常可以通过Function#call或在类似数组的对象上使用Function#apply。(在此答案的末尾,请参阅警告,以了解主机提供的对象,但这是一个罕见的问题。) 假设您要forEach在Node的childNodes属性上使用。您可以这样做: Array.prototype.forEach.call(node.childNodes, function(child) { // Do something with `child` }); 如果要执行很多操作,则可能需要将函数引用的副本复制到变量中以供重用,例如: // (This is all presumably in some scoping function) var forEach = Array.prototype.forEach; // Then later... forEach.call(node.childNodes, function(child) { // Do something with `child` }); 使用一个简单的for循环 显然,一个简单的for循环适用于类似数组的对象。 正确使用for-in for-in具有与数组相同的保护措施,也应与类似数组的对象一起使用;上面#1中由主机提供的对象的警告可能适用。 使用for-of(隐式使用迭代器)(ES2015 +) for-of将使用对象提供的迭代器(如果有);我们将不得不看一下它如何与各种类似数组的对象一起运行,尤其是主机提供的对象。例如,NodeListfrom 的规范querySelectorAll已更新以支持迭代。HTMLCollectionfrom 的规格getElementsByTagName不是。 明确使用迭代器(ES2015 +) 参见#4,我们必须看看迭代器如何发挥作用。 创建一个真实的数组 其他时候,您可能希望将类似数组的对象转换为真正的数组。做到这一点非常容易: 使用slice数组的方法 我们可以使用slice数组的方法,就像上面提到的其他方法一样,它是“故意通用的”,因此可以与类似数组的对象一起使用,如下所示: var trueArray = Array.prototype.slice.call(arrayLikeObject); 因此,例如,如果我们要将a NodeList转换为真实数组,则可以执行以下操作: var divs = Array.prototype.slice.call(document.querySelectorAll("div")); 请参阅下面的警告,了解主机提供的对象。特别要注意的是,这将在IE8及更早版本中失败,这不允许您this像这样使用主机提供的对象。 使用传播语法(...) 还可以将ES2015的扩展语法与支持此功能的JavaScript引擎一起使用: var trueArray = [...iterableObject]; 因此,例如,如果我们想将a NodeList转换为真正的数组,使用扩展语法,这将变得非常简洁: var divs = [...document.querySelectorAll("div")]; 使用Array.from (规格) | (MDN) Array.from(ES2015 +,但很容易填充),从类似数组的对象创建数组,可以选择先将条目通过映射函数传递。所以: var divs = Array.from(document.querySelectorAll("div")); 或者,如果您想获取具有给定类的元素的标记名称的数组,则可以使用映射函数: // Arrow function (ES2015): var divs = Array.from(document.querySelectorAll(".some-class"), element => element.tagName); // Standard function (since `Array.from` can be shimmed): var divs = Array.from(document.querySelectorAll(".some-class"), function(element) { return element.tagName; }); 警告主机提供的对象 如果您将Array.prototype函数与主机提供的类似数组的对象一起使用(DOM列表和浏览器而非JavaScript引擎提供的其他内容),则需要确保在目标环境中进行测试,以确保主机提供的对象行为正常。大多数(现在)确实表现正常,但是测试很重要。原因是Array.prototype您可能要使用的大多数方法都依赖于主机提供的对象,该对象为抽象[[HasProperty]]操作提供了诚实的答案。在撰写本文时,浏览器在这方面做得很好,但是5.1规范确实允许由主机提供的对象可能不诚实。在§8.6.2中,该部分开头附近的大表下方的几段中),其中表示: 除非另有说明,否则宿主对象可以以任何方式实现这些内部方法。例如,一种可能性是,[[Get]]和[[Put]]对特定宿主对象确实读取与存储的属性值但[[HasProperty]]总是产生假。 (我在ES2015规范中找不到等效的用法,但情况肯定仍然如此。)同样,在撰写本文时,现代浏览器中的主机提供的类似数组的对象(NodeList例如,实例)确实可以处理[[HasProperty]]正确,但是测试很重要。) 问题来源于stack overflow
保持可爱mmm 2020-01-08 11:20:24 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT