Имя var вызывает странный результат в Javascript
Предположим, что у нас есть этот сегмент кода:
var name = ["Apples","Oranges","Strawberries"];
console.log(name.length);
Этот код создает этот странный результат из 27! Кажется, что проблема связана с использованием имени переменной как "имя", которое похоже на зарезервированное ключевое слово.
Но может ли кто-нибудь объяснить, почему это странное поведение?
Ответы
Ответ 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 линии выше;