处理 Array.prototype.slice.call(参数)的更简洁方法
Cleaner way of handling Array.prototype.slice.call(arguments)
我正在编写几个采用不同类型参数的函数。因此,只做以下操作要简单得多:
var myFunc = function() {
var args = Array.prototype.slice.call(arguments)
}
。而不是尝试直接在函数声明的参数字段中处理所有不同的可能性,例如:
var myFunc = function(param1, param2, param3) {
if (param3) {
// etc.
}
}
不过,Array.prototype.slice.call(arguments)
增加了很多代码,并降低了可读性。我试图弄清楚是否有一种方法可以编写一个可以完成与Array.prototype.slice.call()
相同的辅助函数,但更干净,更易于阅读。我正在尝试类似的东西:
var parseArgs = function() {
return Array.prototype.slice.call(arguments)
}
var foo = function() {
console.log(parseArgs(arguments))
}
foo('one', 'two', 'three')
// [Arguments, ['one', 'two', 'three']]
但显然这是行不通的。
如果你不想每次都写Array.prototype.slice.call(args)
你可以做:
var slice = Function.call.bind(Array.prototype.slice);
然后你可以在任何地方使用它,比如:
function fn(){
var arr = slice(arguments);
}
在 JS 中将类似数组的对象转换为实际数组的一些简写:
别名Array.prototype.slice
:
(function (slice) {
...your code...
function someFunction() {
var args = slice.call(arguments);
...
}
...
}(Array.prototype.slice));
使用[].slice
:
function someFunction() {
var args = [].slice.call(arguments);
}
创建自己的切片(您尝试过此操作,但参数中出现错误):
function slice(arr) {
return Array.prototype.slice.call(arr);
}
function someFunction() {
var args = slice(arguments);
}
使用新式Array.from
(确保填充以实现向后兼容性):
function someFunction() {
var args = Array.from(arguments);
}
如果您处于可以安全使用 spread 运算符的环境中,则无需调用任何 slice
:
function someFunction() {
var args = [...arguments];
}
你需要传递 foo
的参数对象并仅对其进行切片,如下所示
function parseArgs(args) {
return Array.prototype.slice.call(args);
}
当您在parseArgs
中使用arguments
时,它将仅引用该函数收到的参数,而不是foo
收到的参数。
在 ECMA 脚本 2015 中,可以直接arguments
对象上使用Array.from
,如下所示
function foo() {
console.log(Array.from(arguments));
}
或者,您可以保持parseArgs
原样,并将arguments
分布在 ECMA 脚本 2015 中的parseArgs
上,如下所示
function parseArgs() {
return Array.prototype.slice.call(arguments);
}
function foo() {
console.log(parseArgs(...arguments));
}
这基本上意味着您正在传播foo
收到的arguments
并将它们传递给parseArgs
,以便它也会收到相同的参数。
怎么样:
var parseArgs = function(args) {
return Array.prototype.slice.call(args)
}
var foo = function() {
console.log(parseArgs(arguments))
}
foo('one', 'two', 'three')
这样,您可以解析实际参数array
arguments
,从而导致函数不可优化。使用时必须非常小心 arguments
.
从 MDN 上的参数对象:
重要提示:您不应该对参数进行切片,因为它会阻止 JavaScript 引擎(例如 V8)中的优化。相反,请尝试通过循环访问参数对象来构造一个新数组。
由于 Node.js 使用 V8,您可能希望执行以下操作:
function parseArgs() {
var args = new Array(arguments.length);
for (var i = 0; i < arguments.length; ++i) {
args[i] = arguments[i];
}
return args;
}
function myFunc() {
var args = parseArgs.apply(null, arguments);
console.log(args); // => [1,2,3]
}
myFunc(1, 2, 3);
- 在 JavaScript 数组中的所有元素之间穿插元素的简洁方法
- 使用异步模块的Express + Mongoose请求处理程序的更简洁的方法
- 有没有更简洁的方法可以从带有 lodash 的数组中删除条目
- 用javascript在一个对象的两个键上声明两个数组的简洁方法是什么
- Javascript - 用 Javascript 编写 HTML 代码的更简洁的方法(取代 jQuery)
- 有没有一种更简洁的方法可以使用 Angular 指令实现页面位置感知
- 接受选项对象作为参数的简洁方法,回退到省略属性的默认值
- 转换节点.js流的简洁方法
- 编辑KendoGrid模板的更简洁的方法
- 处理 Array.prototype.slice.call(参数)的更简洁方法
- 在Javascript中,有没有一种简洁的方法可以将方法绑定到对象
- 有没有一种更简洁的方法来设置一个条件语句,以便为变量的任意值集执行
- 将函数绑定到此函数的更简洁的方法
- 是否有一种更简洁的方法来解析我的HTML数据
- 在Javascript/jQuery中比较多个元素值的简洁方法
- 在列表中隐藏距离超过3步的兄弟姐妹的最简洁的方法是什么?
- 用Express嵌套路由器的正确/简洁的方法
- 有没有更简洁的方法在js中编写一组基于时间的条件?
- 是否有一个好的/简洁的方法来重构嵌入的循环,而不是使用Rx操作符
- 从另一个对象和要保存的键数组生成一个对象的最简洁的方法