Несогласованный тип для строк шаблона 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 ответ:
// 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]
- это все значения, которые помещаются между строками. Это позволяет тегам предварительно обработать строку и обработать ее.