Интересный вопрос.К сожалению, объяснение скрыто в деталях алгоритма синтаксического анализа HTML , на который ссылается определение outerHTML в спецификации DOM Parsing.
Вам понадобитсяочень внимательно следить за состоянием синтаксического анализатора, чтобы понять почему, но по сути это работает так.При использовании externalHTML синтаксический анализатор инициализируется так, как будто он только что проанализировал начальный тег родительского узла данного узла.Для document.body это элемент html
.
В алгоритме синтаксического анализа HTML, когда анализируется начальный тег html
, следующее, что ожидает анализатор, - элемент head
.Но поскольку в HTML начальный и конечный теги элемента head являются необязательными, если он не видит следующий начальный тег, он выводит один.Таким образом, в случае document.body.outerHTML следующая вещь, которую анализатор видит, это начальный тег body
, поэтому сначала создается пустой элемент head.
Наконец, после разбора фрагмента всев DOM добавлен лот, включая выводимый элемент head.