【问题标题】:Why am I getting this output from this simple splice command?为什么我会从这个简单的拼接命令中得到这个输出?
【发布时间】:2013-04-29 05:51:59
【问题描述】:

我在理解为什么会得到此输出方面存在一个小问题。

var arr = ["a", "b", "c", "d", "e", "f"];
arr.splice(2,0,"1");
console.log(arr);  

var arr2 = ["a", "b", "c", "d", "e", "f"];
arr2 = arr2.splice(2,0,"2");
console.log(arr2);

输出是:

[ 'a', 'b', '1', 'c', 'd', 'e', 'f' ]
[]  

为什么第二行输出不是:

[ 'a', 'b', '2', 'c', 'd', 'e', 'f' ]  

是分配问题还是什么?

【问题讨论】:

    标签: javascript variable-assignment splice


    【解决方案1】:

    阅读splice 方法。它返回

    包含已删除元素的数组。如果只移除一个元素,则返回一个包含一个元素的数组。

    所以这样做

    arr2 = arr2.splice(2,0,"2");
    

    你用 splice 返回的空数组 [] 覆盖初始数组 arr

    【讨论】:

    • 完全没有看到这个答案。否则不会发布副本。 :)
    • 那么,是不是不能把 .split() 和 .splice() 链接起来?如果我们有var str = "12345"; 为了输出:["1", "2", "a", "3", "4", "5"]我们必须做:var arr = str.split(""); arr.splice(2,0,"a"); return arr;?为什么我们不能使用arr = str.split("").splice(2,0,"a");
    • @Moolla 不,你不能这样链接它们,因为splice 不会返回第一个数组。
    【解决方案2】:

    1 - 拼接方法改变数组的内容

    2 - splice 方法返回被移除的元素 - ** 不是原始数组 **

    【讨论】:

      【解决方案3】:

      所以问题是只有一些方法返回变异后的原始对象作为返回值。即使方法设计不同,您也可以使用方法装饰器来保持对原始对象的访问可用。

      const chainer = (target) =>
        new Proxy(target, {
          get: (_, prop, receiver) =>
              typeof target[prop] === 'function'
              ? new Proxy(target[prop], {
                  apply: (f, _, args) => {
                    f.apply(target, args);
                    return {
                      this: receiver,
                      target,
                    }
                  },
                })
              : target[prop],
        });
      
      const arr2 = chainer(["a", "b", "c", "d", "e", "f"])
          .splice(2,0,"1").this
          .splice(2,0,"2").target;
      console.log(arr2);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-24
        相关资源
        最近更新 更多