Вопрос по object, window-object, javascript – Использование переменной «имя» не работает с объектом JS

21

Поведение можно увидеть в этом небольшом фрагменте (выполните его как глобальный скрипт):

<code>var name = {};
name.FirstName = 'Tom';
alert(name.FirstName);
</code>

Предупреждение даетundefined в Chrome, но работает в IE и Firefox. Я также получаю странное значение, когда я делаю

<code>alert(name);
</code>
AFAIK, чаще используютvar name = {} синтаксис тоже. Hamish
Это была просто опечатка ... Я вошел в "Объект" не объект. все равно выдает ошибку в chrome. попробуйте новый код в Chrome. Pialy Tapaswi
language атрибут устарел, используйте толькоtype приписывать. Это также лучше использоватьconsole.log вместоalert и используйте Chrome Dev. Инструменты (или FireBug), чтобы прочитать их. И, наконец, вам нужно иметь тип документа в строке 1 вашего кода, тип документа:<!doctype html> Wouter J
window.name - это специальная глобальная переменная в браузерах. Увидетьdeveloper.mozilla.org/en-US/docs/Web/API/Window.name предполагается, что тип является строкой. Если вы используете typeof для проверки nString, это объект. Вы можете запустить его в консоли nodejs, и тогда результаты будут правильными. Так что это не проблема JavaScript. Chris Li
name - это специальная глобальная переменная в браузерах, вы не можете слишком сильно ее изменять ... dandavis

Ваш Ответ

3   ответа
6

name переменная на самом делеwindow.nameпотому что переменные верхнего уровня объявлены сvar прикреплены к глобальному объекту.

Спецификация HTML5требует, чтобыwindow.name is a DOMString, Это означает, что значениеwindow.name Можнотолько последовательность символов, а не объект.

В Chrome попытка использоватьwindow.name сохранение чего-либо, кроме примитивной строки, приведет значение к примитивной строке. Например:

window.name = {};
window.name === "[object Object]"; // true

Вы можете избежать этой проблемы, используяname переменная, которая не входит в область верхнего уровня:

(function() {
    var name = {};
    // this `name` is not `window.name`
    // because we're not in the top-level scope

    console.log(name);
})();
24

window.name имеет специальное назначение и должен быть строкой. Похоже, что Chrome явно преобразует его в строку, поэтомуvar name = {}; на самом деле в конечном итоге дает глобальную переменнуюname (Т.е.window.name) значение"[object Object]", Так как это примитив, свойства (name.FirstName) выиграл "т" клюшку ".

Чтобы обойти эту проблему, не используйтеname в качестве глобальной переменной.

@FelixKling Я почти лечуname как зарезервированное слово, так как некоторые хосты дают функцииname свойство также (я был укушен этим ранее), закрытие не уменьшит его и т. д.
Хороший улов ... Я вообще не обращал внимания на имя переменной.
Да, было несколько вопросов с этой проблемой, насколько я помню ...
0

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

Кроме того, вы можете использоватьwindow.name как вам нравится, если у вас есть этот код первым. Я не рекомендую это вообще, но, как подтверждение концепции:

(function () {
    var _name;
    window.__defineGetter__('name', function () {
        return _name;
    });
    window.__defineSetter__('name', function (v) {
        _name = v;
    });
})();

Кроме того, вы должны использовать{} на местеnew Object, Помимо того, что это более кратко, это также более эффективно и более явно.

Или простоdelete name;

Похожие вопросы