Несколько вещей:
1) Обычно, window[n]
для п целое число было бы Окно п-го подрамника на странице. Это то, что Гиви видит в комментариях на странице без фреймов: длина 0 и индексированные свойства и то, что вы видите в Safari.
2) На закладке «Новая вкладка» Chrome есть куча тегов. 17 из них, здесь. Быстро глядя на него, window[0]
через window[16]
- это фактически объект Window для этих подкадров на этой странице. Я понятия не имею, почему вы видите DOMException.
3) Методы массива, включая Array.prototype.push
, являются в основном родовыми. То есть их определение таково, что они работают на любом объекте, а не только на массиве. Если вы посмотрите на spec на http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.prototype.push, вы увидите, что все push
делает это .length
, если этот объект, затем установите n
на эту длину, затем для каждого из переданных аргументов установите thisObj[n] = argument
(вид, см. Пункт 4 ниже) и приращение n
на 1. И затем в самом конце установите this.length = n
. Это все операции, которые обычно имеют смысл для любого объекта.
4) Если вы внимательно посмотрите на то, как push
фактически определяется, что это на самом деле делает для того чтобы установить свойство n
является Put(O, ToString(n), E, true)
. Если вы посмотрите на http://people.mozilla.org/~jorendorff/es6-draft.html#sec-put-o-p-v-throw, вы увидите, что последний аргумент заключается в том, следует ли генерировать исключение, если вызов [[Set]]
терпит неудачу. Теперь, если вы действительно попытаетесь установить индексированные свойства в окне в Firefox, наборы фактически не работают. В строгом режиме вы получаете исключения; в нестрогом режиме наборы молчат без-ops. На самом деле это поведение, требуемое спецификацией WebIDL, в http://heycam.github.io/webidl/#defineownproperty (в частности, шаг 1 подэтап 4, если индекс не имеет дочернего окна на нем, а шаг 1 - подэтап 5, если индекс имеет дочернее окно на нем, поскольку в Окне нет ни одного индексированный установщик свойств и создатель индексированного свойства). Другие браузеры еще не реализовали эту часть спецификации, предположительно. Я должен отметить, что Firefox тоже не реализует его. В данном случае он использовал, как вы заметили, на Put(O, "length", n, true)
, но текущие ночные часы не потому, что length
был закреплен как сменное свойство, поэтому его можно фактически установить. Но как только https://bugzilla.mozilla.org/show_bug.cgi?id=828137 будет установлен, он снова будет бросать.
Прежде всего вы должны знать, что для спецификации требуется, чтобы глобальный объект имел несколько свойств (http://es5.github.io/#x15.1), среда может добавлять любое количество дополнительных свойств , Кроме того, глобальный объект является объектом * хоста *, т. Е. Его поведение лишь частично продиктовано спецификацией. Все это означает, что вы должны ожидать, что глобальный объект имеет разные свойства в разных средах. –
Да, я догадался, что это как-то связано со стандартами или в этом случае нестандартным поведением. Две вещи, которые казались странными, заключались в том, что «1) числовые свойства содержали ссылки на одно и то же в кажущихся случайными местами» и «2». Некоторые браузеры позволяют Window/Global вести себя как Array, а некоторые (например, Firefox). Кажется, это какая-то большая разница. –
В последнем Chrome, Opera, IE11, прежде чем нажать, я получил результат длины 0 после 1. Как вы получили эти результаты? – Givi