Несогласованный тип для строк шаблона JavaScript ES6


При тестировании новых строк шаблонов JavaScript ES6 (в Firefox, если это имеет значение) я заметил некоторые несоответствия в их типах.

Я определил пользовательскую функцию следующим образом:

function f(a) {
    console.log(typeof(a));
    console.log(a);
}

Сначала я проверил функцию "нормально", используя круглые скобки вокруг строки шаблона.

f(`Hello, World!`)

Как и ожидалось, это дало Тип string и Hello, World! был выведен на консоль.

Затем я вызвал функцию сокращенно, без скобок и несоответствий произошло.

f`Hello, World!`

Тип стал object, и Array [ "Hello, World!" ] был выведен на консоль.

Почему строка шаблона была завернута в массив при использовании второго метода? Это просто ошибка в Firefox (ES6 является новым стандартом, в конце концов) или такое поведение ожидается по какой-то причине?

1 7

1 ответ:

// A function call, passed the result of a template literal.
f(`str`)

И

// A tagged template call, passed metadata about a template.
f`str`

Не одно и то же. Первый вызов f с одной строкой в качестве аргумента. Второй вызывает f с несколькими параметрами, в зависимости от шаблона. например

f`one${2}three${4}five`

Пройдет f

f(strings, ...values)

С

strings
// ['one', 'three', 'five']

, представляющий собой список всех строковых разделов шаблона, и

values
// [2, 4]

- это все значения, которые помещаются между строками. Это позволяет тегам предварительно обработать строку и обработать ее.

В документация по MDN может помочь больше .