建视频网站,腾讯云wordpress镜像ip访问不了,网站流量多少可以盈利,建网站赚钱方法让我们回顾下slice的日常用法slice 工作原理在深入研究一些更高级的用法之前#xff0c;让我们看一下slice方法的基础知识。如MDN文档#xff0c;slice 是数组上的一个方法#xff0c;它最多有两个参数:arr.slice([begin[, end]])begin从该索引处开始提取原数组中的元素,如果… 让我们回顾下slice的日常用法slice 工作原理在深入研究一些更高级的用法之前让我们看一下slice方法的基础知识。如MDN文档slice 是数组上的一个方法它最多有两个参数:arr.slice([begin[, end]])
begin从该索引处开始提取原数组中的元素,如果该参数为负数则表示从原数组中的倒数第几个元素开始提取slice(-2)表示提取原数组中的倒数第二个元素到最后一个元素包含最后一个元素。如果省略 begin则 slice 从索引 0 开始。end在该索引处结束提取原数组元素从0开始。slice会提取原数组中索引从 begin 到 end 的所有元素包含begin但不包含end。slice(1,4) 提取原数组中的第二个元素开始直到第四个元素的所有元素 索引为 1, 2, 3的元素。如果该参数为负数 则它表示在原数组中的倒数第几个元素结束抽取。 slice(-2,-1)表示抽取了原数组中的倒数第二个元素到最后一个元素不包含最后一个元素也就是只有倒数第二个元素。如果 end 被省略则slice 会一直提取到原数组末尾。如果 end 大于数组长度slice 也会一直提取到原数组末尾。基本用法我们的前4个例子突出slice的核心功能。用法1简单的复制const arr2 arr.slice()
没有任何参数的slice执行一个简单的浅拷贝。当前主流的用法还是使用展开运算符合来实现但是如果在旧的代码库中或者没有使用babel的构建步骤可能仍然希望使用slice。用法2获取从 N 开始的子数组使用slice方法最简单的方法就是原始数组从N开始抽取的所有元素。一种情况是希望弹出数组的第一个元素并使用它返回剩余的数组但希望在不修改原始数组的情况下执行此操作。function useone (arr) {const usedItem arr[0]return arr.slice(1)
}
用法3获取从末尾 N 开始的子数组slice的另一种使用方法是获取数组的末尾利用的是负索引从末尾开始计数。这种负索引使删除任意数量的元素变得超级简单。例如如果你只想抓取3个const last3 arr.slice(-3)
用法4获取数组的前n个获取数组的前面的数我们需要使用第二个参数end。当有两个参数时slice方法返回一个从begin开始但不包括end的集合。由于JavaScript数组是从0开始的索引从0开始这使得获取前N个元素变得非常简单const first4 arr.slice(0, 4)
用法5获取数组中某段子数组如果我们想要使用slice从任何索引开始获取数组的一段该怎么办为此我们需要从 (begin, length) 转换为(begin, end)。计算逻辑很简单我们可以定义一个简单的函数来做到这一点function pullSegment(arr, begin, length) {return arr.slice(begin, begin length);
}
处理类似数组的对象JavaScript中数组是一个特殊的对象其property名为正整数且其length属性会随着数组成员的增减而发生变化同时又从Array构造函数中继承了一些用于进行数组操作的方法。而对于一个普通的对象来说如果它的所有property名均为正整数同时也有相应的length属性那么虽然该对象并不是由Array构造函数所创建的它依然呈现出数组的行为在这种情况下这些对象被称为 “类数组对象” 。slice方法也可用于类似数组的对象。一些类似数组包如arguments(用于访问传递给函数的所有参数的关键字NodeLists从返回节点列表的任何DOM API方法返回甚至是使用数字索引并添加length属性的原始对象。要在类似数组的对象上使用slice方法需要直接从Array.prototype引用它如下所示Array.prototype.slice.call(arguments)
在这特定的场合中会很有用处。用法6将类似数组的对象转换为数组slice在类似数组的对象上的一个常见用途是将它们转换为实际数组。例如const args Array.prototype.slice.call(arguments);
你为什么要这么做?为了使用数组方法。例如想象一个像这样的函数function addOne() { return arguments.map(i i1);
}
这看起来可行但如果你试着去做你就会得到错误 addOne(1, 2, 3)
TypeError: arguments.map is not a functionat test (repl:2:18)at repl:1:1at ContextifyScript.Script.runInThisContext (vm.js:44:33)at REPLServer.defaultEval (repl.js:239:29)at bound (domain.js:301:14)at REPLServer.runBound [as eval] (domain.js:314:12)at REPLServer.onLine (repl.js:440:10)at emitOne (events.js:120:20)at REPLServer.emit (events.js:210:7)at REPLServer.Interface._onLine (readline.js:279:10)
这是因为arguments 实际上不是数组而是类似数组的对象。可以使用slice实现此功能如下所示function addOne() {return Array.prototype.slice.call(arguments).map(i i1)
}
现在就可以得到了你所希望的数据 addOne(1, 2, 3) [ 2, 3, 4 ]
用法7将任意长度多余的参数强制转换为数组有时希望接受函数的多余参数组成一个数组。较新版本的JavaScript引入了所谓的Rest语法来处理这个问题但是如果为为了兼容旧浏览器你可以使用slice做到这一点function myFunc(a, b) { const extraArgs Array.prototype.slice.call(arguments, 2);
}
这允许使用任意数量的参数调用myFunc 例如myFunc(1, 2, 3, 4, 5, 6, 7, 8)
在函数里面会得到a 1b 2extraArgs [3,4,5,6,7,8]用法8修改数组中的特定索引slice在函数上下文中一个强大而常见的用法是替换数组中特定项的值。从本质上讲这很简单只需要分配新值但是在函数世界中不能修改原始数组。相反可以将slice与扩展运算符一起使用以返回一个相同但对于要更新的索引的新数组function replaceIdx(arr, index, newVal) {return [...arr.slice(0, index),newVal,...arr.slice(index 1)]
}
偏函数应用偏函数应用英文是partial application也可以译作“局部应用”、“部分应用”、“偏应用”函数式编程中的另一种常见模式是所谓的偏函数应用将函数预先应用于函数然后返回一个新函数。这种模式允许你组合函数通过使用具有不同预应用参数的相同核心函数来创建更大的可重用性。虽然像Haskell这样的纯函数语言本身支持偏函数应用程序但是在JavaScript中我们可以使用slice实现一个函数来实现它var partial function() {const fn arguments[0];const args Array.prototype.slice.call(arguments, 1);// Return a function that calls fnreturn function() {var remainingArgs Array.prototype.slice.call(arguments);return fn.apply(this, args.concat(remainingArgs));}
}