Пояснения относительно задачи про Symbol.Короткий ответ:
console.log - это внешнее API, которое не обязано подчинятся спецификации ECMA.
Описание того, как и что именно, может делать метод log обьекта console содрежится в спецификации HTML5.
Где прямо написано - решение о том, как поведет себя метод
log - лежит на плечах программиста который реализует этот метод. Реализует так - как ему хочется.
Длинный ответ:
Чтобы легко ориентироваться в том, как работает JS - нужно помнить три простых принципа:
1) JS это язык, в котором нет своего ввода/вывода. Любое получение данных или отображение данных, зависит не от языка JS. и может быть каким угодно, в зависимости от того, как работает внешнее API
2) механизм прототипного наследования, которым пронизана вся спецификация (для нашего случая сейчас не принципиален)
3) каждый statement разбирается на выражения, которые выполняются согласно алгоритму заявленному спецификацией.
то есть когда Вы смотрите на строку кода, то в ней
НЕТ НИЧЕГО чтобы не прошло через какой то алгоритм.
даже когда вы пишите просто число
1 - то это не данные, это statement который приводит к тому, что возвращается ссылка на что-то что описывает данные.
var theSym = Symbol("abc");
console.log( theSym );
в строке с
console.log у нас несколько частей, которые пройдут работу согласно алгоритмам спецификации:
1)
console.log - получение ссылки на метод
2)
( ) - callable expression, то есть вызов чего то с чем то
3) идентификатор
theSym - получение ссылки на структуру данных связанной с идентификатором
theSymЕсли кратко - вызов внешнего API
log, внешнего обьекта
console, передав ему ссылку на то, что связано с идентификатором
theSym.
Результат? - в душе не тилельнкаю, потому, что это внешнее API которое может делать чем ему вздумается.
Вторая частьconsole.log( `${theSym}` );
отличается от первой тем, что идентификатор
theSym проходит через еще один этап вычисления выражения (алгоритма спецификации ECMA). Который требует вызов метода
toString применимого к идентификатору, из-за использования темплейт литерал.
Согласно которому, в случае типа
Symbol, должно быть throw.
Вместо ИГОГО:Сталкиваясь с любым поведением, которое вас ставит в тупик, первое что сделайте - разделите где сам язык JS, который регламентируется ECMA Spec, а где вызов внешнего API.
Поведение которого, не обязательно регламентируется той самой ECMA Spec. И может быть как подчинено сторонней спецификации так и быть галлюцинацией программиста, который реализовывал API.
То есть разница в выводе заявленной задачи, оьясняется тем, что метод log обьекта console, а точнее те кто его реализовывал в Google Chrome, сделали так как им удобно. Вопреки тому, что диктует спецификация