为什么shift()在一个数组上工作而在另一个数组上工作,除非一般应用于另一个数组

时间:2017-07-15 23:13:01

标签: javascript arrays templates shift

在下面的代码中,编译器(在'compile'时间)没有抱怨groups.shift(),但抱怨depths.shift()不是函数。我对什么视而不见? (我尝试重命名depths,重新输入等等。)

    const tag1x = (elem, content, groups = ['?','?','?'], depths = ['?','?'], optional = true, level = 0) => {
        let option = optional ? '?' : '';
        let template = `
            ${'\t'.repeat(level)}(${groups.shift()}:<$1[^>]*?DDD(${depths.shift()}:[0-9]+)[^>]*>)$3
            ${'\t'.repeat(level)}(${groups.shift()}:$2)
            ${'\t'.repeat(level)}(${groups.shift()}:</$1[^>]*?DDD(${depths.shift()}:[0-9]+)[^>]*>)$3
            `;
        return form(template, elem, content, option);
    }

但是,如果我一般使用shift,它在所有方面都可以正常工作:

    const tag1x = (elem, content, groups = ['?','?','?'], depths = ['?','?'], optional = true, level = 0) => {
        let option = optional ? '?' : '';
        let template = `
            ${'\t'.repeat(level)}(${groups.shift()}:<$1[^>]*?DDD(${[].shift.call(depths)}:[0-9]+)[^>]*>)$3
            ${'\t'.repeat(level)}(${groups.shift()}:$2)
            ${'\t'.repeat(level)}(${groups.shift()}:</$1[^>]*?DDD(${[].shift.call(depths)}:[0-9]+)[^>]*>)$3
            `;
        return form(template, elem, content, option);
    }

以上功能齐全。

1 个答案:

答案 0 :(得分:0)

我误解了这种情况。错误发生在运行时,因此非常清楚,因为字符串输入而不是数组输入。字符串输入将由[].shift.call(myAccidentallyAString)修复,而当然,直接在字符串上调用shift()不是函数。

它的作用类似于Array.isArray(myStuff) ? myStuff.shift() : [myStuff].shift(),这是有道理的,因为(我猜)myStuff被装箱到一个对象,然后由shift()调用。