Подтвердить что ты не робот

Имя var вызывает странный результат в Javascript

Предположим, что у нас есть этот сегмент кода:

var name = ["Apples","Oranges","Strawberries"];
console.log(name.length);

Этот код создает этот странный результат из 27! Кажется, что проблема связана с использованием имени переменной как "имя", которое похоже на зарезервированное ключевое слово.

Но может ли кто-нибудь объяснить, почему это странное поведение?

4b9b3361

Ответ 1

Он ссылается на window.name, который является именем окна.

Вы можете использовать имя окна для целевых гиперссылок, но это обычно не полезно.

Дополнительная информация о window.name: https://developer.mozilla.org/en-US/docs/Web/API/Window.name

Просто тестирование в хроме: Вы не можете остановить var name от window.name, который является строкой. Независимо от того, для чего вы установите значение, оно будет передано в виде строки, чтобы оно было действительным именем окна. Таким образом, name.length - количество символов в строке. Лучше избегать переменных или быть очень осторожными в них!

Как я вижу из некоторых других комментариев, это странная концепция, если вы новичок в этом. Забота в том, что означает window.name. window.name - это имя окна. Любое его использование - это имя окна.

Защита того, что поведение Chrome логично:

Если этот var document = 'foo' сделал то, что, как он выглядел, он бы сделал, вы бы перезаписали window.document - объект документа - со строкой. Это была бы проблема. name является свойством window точно так же, как document и имеет такое использование, которое не должно быть (и не может быть в Chrome) заменено.

Ответ 2

В глобальной области действия, когда вы выполняете var name = ["Apples","Oranges","Strawberries"];, это то же самое, что и window.name = ["Apples","Oranges","Strawberries"];.

window.name должна быть строкой, поэтому для нее присваивается ["Apples","Oranges","Strawberries"].toString(), которая "Apples,Oranges,Strawberries".

Ответ 3

Какова область видимости переменных в JavaScript? - хорошее начало. В основном, когда вы объявляете name вне функции, вы фактически скрываете значение window.name, что является очень и очень плохой идеей (будьте очень осторожны с любыми глобальными переменными, которые вы заявляете, - они на самом деле являются значениями объект window, включая скрытие существующих значений.

Как утверждают другие, факт, что Google Chrome заставляет тип string, вероятно, является хитрой Chrome (хотя и несколько понятным), но основная причина в том, что вы просто делаете что-то "опасное", что не понимаете, "Делаю:)

Ответ 4

Как указывалось другими, в том случае, когда вы используете переменную с именем name в глобальной области действия, она рассматривается как window.name.

Из экспериментов в Google Chrome window.name получает значение в виде строки, например: "Apples,Oranges,Strawberries". Это связано с тем, что Google Chrome форсирует window.name как строку. Это объясняет, почему name.length сообщит 27, поскольку это длина заданной строки.

Такое поведение отсутствует в IE, Opera или Firefox, которые анализируют массив ["Apples","Oranges","Strawberries"] и сообщают 3 на `name.length, как и ожидалось, поэтому я думаю, что это причуда Google Chrome.

Ответ 5

объект window имеет свойство "name";

если вы определяете "имя" в функции закрытия, вы можете получить 3

вы определили имя var в глобальном объекте, поэтому вы просто инициализировали строку obj;

(function(){
  var name = ["Apples","Oranges","Strawberries"];
  consol.log(name.length);
})()

var name = ["Apples","Oranges","Strawberries"];

глобальное window.name является строкой в ​​строковом объекте (зарезервировано), поэтому name.toString() вызывается, когда вы excuete линии выше;