slice 方法有这几种情况:不传参、传一个参数、传两个参数。并且传参支持负数,具体每个情况的效果在这里就不说了。

核心方法:通过 for 循环遍历 调用此方法的数组 ,把要取出的内容放入新数组,然后将新数组返回。

一切的条件处理判断,都为了 for 循环能够正确的执行

这是好久以前写的了,虽然就8行代码,但是三元运算符套用的太多了,还没加括号,现在回过头来看看真是满眼的星星。

Array.prototype._slice = function _slice() {
var n1 = Number(arguments[0]), n2 = arguments[1], n3 = [];
n2 = n2 === undefined ? this.length : Number(n2) ? Number(n2) : 0;
n2 = n2 < 0 ? Math.abs(n2) > this.length && n2 > -1 ? 0 : this.length + Math.ceil(n2) : n2 > this.length ? this.length : Math.floor(n2);
n1 = n1 ? n1 < 0 ? Math.abs(n1) > this.length || n1 > -1 ? 0 : this.length + Math.ceil(n1) : n1 > this.length ? this.length : Math.floor(n1) : 0;
for (var i = n1; i < n2; i++) {
n3[n3.length] = this[i];
}
return n3;
};

所以上面的代码看看就行了,我们先来分析一下 for 循环,因为一切条件判断都是围绕这个循环来处理的,这样也便于理解接下来所解析的各种条件判断是为了什么。

 i = n1 定义起始位置(包含 n1 的位置那项)

 i < n2 定义结束位置(不包含 n2 的位置那项)

这个循环设置了从哪里开始取到哪里结束,所以我们只需要处理好 n1 和 n2 的值,就能满足所有的传参情况

  for 循环分析完毕,其实也没啥好分析,现在来一行一行的拆分分析代码。

因为个人表达能力有限,有些话越是想表达清楚就越是表达不清楚,觉得下方框内的文字太啰嗦的话,可以不看或者选择性忽略,或者只看标记红色的部分

第一行:

  var n1 = Number(arguments[0]), n2 = arguments[1], n3 = [];

    用两个变量 n1 和 n2 接收 arguments 中的两个参数,用来具体判断传参情况。

    n3 的用途暂时先不说。

因为 arguments 是类数组也是个对象,所以如果当 arguments[0] 或者 arguments[1] 不存在,也不会报错而是会默认为 undefined

第二行:

  n2 = n2 === undefined ? this.length : Number(n2) ? Number(n2) : 0;

  如果觉得上面的三元运算符难以理解,可以看下面用 if 写的

    if (n2 === undefined) {
        n2 = this.length;
    } else if (Number(n2)) {
        n2 = Number(n2);
    } else {
        n2 = 0;
    }
第二行代码_IF

相关文章: