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

Javascript 为什么shift()只能在一个数组上工作,而不能在另一个数组上工作,除非在另一个数组上一般应用,javascript,arrays,templates,shift,Javascript,Arrays,Templates,Shift,在以下代码中,编译器(在“编译”时)不会抱怨groups.shift(),但会抱怨depts.shift()不是函数。我对什么视而不见?(我试着重命名深度,重新键入等) 以上是完全有效的。我误解了情况。错误是在运行时发生的,因此很明显是由于字符串输入而不是数组输入。字符串输入将由[].shift.call(myAccidentallyAString)修复,而直接对字符串进行shift()调用当然不是函数 它的行为类似于Array.isArray(myStuff)?myStuff.shift():

在以下代码中,编译器(在“编译”时)不会抱怨
groups.shift()
,但会抱怨
depts.shift()
不是函数。我对什么视而不见?(我试着重命名
深度
,重新键入等)


以上是完全有效的。

我误解了情况。错误是在运行时发生的,因此很明显是由于字符串输入而不是数组输入。字符串输入将由
[].shift.call(myAccidentallyAString)
修复,而直接对字符串进行
shift()
调用当然不是函数


它的行为类似于
Array.isArray(myStuff)?myStuff.shift():[myStuff].shift()
,这是有道理的,因为(我猜)
myStuff
正在被一个对象装箱,然后被
shift()
调用,我误读了这个情况。错误是在运行时发生的,因此很明显是由于字符串输入而不是数组输入。字符串输入将由
[].shift.call(myAccidentallyAString)
修复,而直接对字符串进行
shift()
调用当然不是函数

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

    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);
    }
    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);
    }