关于slice.call(arguments, 1) 的思考

关于slice.call(arguments, 1) 的思考

有些技术用久了,使用方法都是懂的,听到技术名称就一脸懵逼了。

今天看了看柯里化(英语:Currying)到底是啥意思找了些资料,说是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。看说明也没什么的,无形当中使用的非常频繁的。看下实现代码是这样的~

function currying(fn) {

    var slice = Array.prototype.slice,

    __args = slice.call(arguments, 1);

    return function () {

        var __inargs = slice.call(arguments);

        return fn.apply(null, __args.concat(__inargs));

    };

}

详细的看一下这里

引起我注意的是 __args = slice.call(arguments, 1); 这个语句。

callslice到时见过,不知为什么没用 arguments.slice(1);而是用slice.call()的方法。

所以测试了一下arguments.slice(1);

Uncaught TypeError: arguments.slice is not a function
    at currying

说是没有slice这个方法

console.log(arguments instanceof Array);
// 返回false

原来一直以为arguments是数组呢,没想到它不是数组。

于是我又想了想数组里的的方法既然可以这么使用,那用其他类型的会怎么样呢?

var a = {0:11,1:22,2:33,3:44},
b = 'test',
slice = Array.prototype.slice;

console.log(a.slice(1));
// 返回错误:Uncaught TypeError: a.slice is not a function
console.log(slice.call(a,1));
// 返回: []
console.log(b.slice(1));
// 返回: "est"
console.log(slice.call(b,1));
// 返回: ["e", "s", "t"]

看来json形式的获取不到,我记得字符串本身是继承了数组。
不管是接了什么数据看来返回的都是数组形式的。

本来是想要看看柯里化是什么东东,绕了一大圈还是学到了一个知识点了~