let s = "12345"
let m = Array.from(s.slice(2), (_, i) => s.slice(i, i+3))
console.log(m)
输出:["123", "234", "345"]
我是JavaScript的初学者。有人可以逐步解释此代码的工作原理吗?特别是这里的那部分:(_, i) => s.slice(i, i+3)
答案 0 :(得分:5)
首先,s.slice(2)
接受"12345"
并返回"345"
(以从索引2
开始直到结尾的字符串为对象,因为没有提供end
参数)
Array.from
的作用是获取一个可迭代的对象(例如字符串,它是一个字符数组),并从中创建一个数组。创建新数组时,它需要一个可选的第二个参数(也是第三个参数,但此处不适用),该参数是一个函数,用于遍历该可迭代对象中的每个项目。它的第一个参数是每个步骤中可迭代项,第二个参数是索引。在这种情况下,该功能用ES6 Arrow Function syntax定义。可以更详细地写为:
let s = "12345"
let m = Array.from(s.slice(2), function(_, i) {
return s.slice(i, i + 3);
});
我不确定这是否是争论的焦点,但是_
是JavaScript编程中针对不需要或“丢弃”的变量或参数的约定。在这种情况下,您不需要第一个参数,但是您需要第二个参数,因此_
。
因此,如果我们在Array.from
上运行"345"
,则会发生以下情况:
"3"
和索引0
:运行函数s.slice(0, 0 + 3)
(从0
开始获取三个字符)。返回值:"123"
。"4"
和索引1
:运行函数s.slice(1, 1 + 3)
(从1
开始获取三个字符)。返回值:"234"
。"5"
和索引2
:运行函数s.slice(2, 2 + 3)
(从2
开始获取三个字符)。返回值:"345"
。[ "123", "234", "345" ]
。答案 1 :(得分:1)
Array.from
使您可以从另一个“事物集合”中获取数组。
第一个参数是从索引2开始的子字符串,即“ 345”。 Array.from
会将其作为字符“ 3”,“ 4”,“ 5”的集合。
第二个参数是一个函数,该函数将应用于从第一个参数获得的每个对象。并且,该函数有2个参数,它的第一个是第一个参数产生的值,第二个是当前迭代的索引。这样就依次产生值“ 3”,“ 4”,“ 5”:索引为0的“ 3”,索引为1的“ 4”,索引为2的“ 5”。夫妻('3',0),('4',1),('5',2)。但是给定的函数只是忽略其第一个参数,使用_
表示将被忽略的事实(由from
的第一个参数产生的结果),并且基本上为所有函数调用str.slice(i,i+3)
i
的值分别为0、1、2。最后生成3个字符串“ 123”,“ 234”和“ 345”。
尝试一下:
var str="12345"
var m = Array.from(str.slice(2), (x,i)=>"Got ("+x+","+i+") and compute \""+str+"\".slice("+i+","+(i+3)+")")
console.log(m)
答案 2 :(得分:1)
=>
部分称为Arrow function。让我们分解一下您发布的整个部分:
(_, i) => s.slice(i, i+3)
这可以分为3个部分:
(_, i) /* The function parameters */
=> /* The arrow */
s.slice(i, i+3) /* The function body */
在此示例中,作者为参数指定了名称_
(可能因为它将被忽略)和i
(因为它是数组的索引)。
箭头本身就是箭头语法。
身体是主要部分。它需要一部分s
字符串。箭头功能会自动返回该语句。
如果以完整格式写出,则看起来像这样:
let s = "12345"
let m = Array.from(s.slice(2), function (ignore, i) {
return s.slice(i, i + 3);
})
console.log(m)
该函数本身将占据s
字符串的一部分,该字符串从i
开始,并在其后结束3个位置(因此需要3个字符)。
我希望有帮助。