不懂一段JavaScript代码?

时间:2019-12-20 15:58:39

标签: javascript

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)

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",则会发生以下情况:

  1. 迭代对象#1,"3"和索引0:运行函数s.slice(0, 0 + 3)(从0开始获取三个字符)。返回值:"123"
  2. 迭代对象#2,"4"和索引1:运行函数s.slice(1, 1 + 3)(从1开始获取三个字符)。返回值:"234"
  3. 迭代对象#3,"5"和索引2:运行函数s.slice(2, 2 + 3)(从2开始获取三个字符)。返回值:"345"
  4. 由以下三个返回值组成[ "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个字符)。

我希望有帮助。