Дизайн языка JavaScript недостаточно строги, и многие места совершат ошибки, если вы не будете осторожны.
Например, рассмотрим следующие ситуации.
Теперь нам нужно определить, существует ли глобальный объект myobj, и если он не существует, заявить об этом. Алгоритм, описанный на естественном языке, выглядит следующим образом:
if (myobj не существует) {объявить myobj; }Вам может легко написать этот код. Но на самом деле, грамматические вопросы, которые он включает, гораздо сложнее, чем мы думаем. Juriy Zaytsev отметил, что существует более 50 способов определить, существует ли объект JavaScript. Только когда детали реализации языка JavaScript очень ясны, их можно различить.
Первый способ написать
Основываясь на вашей интуиции, вы можете подумать, что можете написать это:
if (! myobj) {myobj = {}; }Однако, если вы запустите этот код, браузер напрямую вынесет ошибку RESTERKERROR, в результате чего операция будет прервана. В чем дело?
Кстати, когда оператор IF определяет, является ли MYOBJ пустой, этой переменной еще не существует, поэтому будет сообщена ошибка. Измените его на следующее, и он будет работать правильно.
if (! myobj) {var myObj = {}; }Почему ошибка не сообщается после добавления VAR? Существует ли MYOBJ в этом случае, когда заявление IF выносит суждения?
Чтобы ответить на этот вопрос, вы должны знать, как работает интерпретатор JavaScript. Язык JavaScript "Parse First, Run Lean позже". Объявление переменной завершено во время анализа, поэтому приведенный выше код фактически эквивалентен:
var myobj; if (! myobj) {var myObj = {}; }Поэтому, когда утверждение IF выносит суждения, MYOBJ существует, поэтому ошибки нет. Это эффект «улучшения кода» команды VAR. Интерпретатор JavaScript только «поднимает» переменные, определенные командой VAR, и не работает для переменных, которые не используют команду VAR и непосредственно назначают. Вот почему это вызовет ошибку, если вы не добавите var.
Второй способ написать
В дополнение к команде VAR может быть еще одна переписать, и вы также можете получить правильный результат:
if (! window.myobj) {myobj = {}; }Окно является объектом верхнего уровня JavaScript, и все глобальные переменные являются его свойствами. Поэтому, судя о том, является ли MyObj пуст, эквивалентен оценке того, имеет ли у окна атрибут MYOBJ, чтобы избежать ошибки ссылки, поскольку MYOBJ не определяется. Однако из стандартизации кода лучше всего добавить VAR ко второй строке:
if (! window.myobj) {var myObj = {}; }Или напишите это так:
if (! window.myobj) {window.myobj = {}; }Третий способ написать
Недостаток вышеуказанного метода написания заключается в том, что в некоторых операционных средах (таких как V8 и Rhino) окно не может быть объектом верхнего уровня. Итак, рассмотрите возможность переписать это как:
if (! this.myobj) {this.myobj = {}; }На глобальном уровне переменной это ключевое слово всегда указывает на переменную верхнего уровня, поэтому оно может быть независимым от различных сред.
Четвертый способ написать
Тем не менее, приведенное выше написание плохо читаемо, и указание на это является переменным и подверженным ошибкам, поэтому оно дальнейшее переписывается:
var global = this; if (! global.myobj) {global.myobj = {}; }Гораздо более четко использовать пользовательскую переменную Global для представления объекта верхнего уровня.
Пятый способ написать
Вы также можете использовать оператор TypeOF, чтобы определить, определяется ли MYOBJ.
if (typeof myobj == "undefined") {var myObj = {}; }Это наиболее широко используемый метод для определения того, существует ли объект JavaScript.
Шестой способ написать
Поскольку значение myOBJ напрямую равна неопределенному в случае определенного, но не назначенного, приведенный выше метод написания может быть упрощен:
if (myobj == не определен) {var myObj = {}; }Здесь есть два места, чтобы отметить. Во -первых, ключевые слова VAR на второй строке не должны отсутствовать, иначе произойдет ошибка ссылки. Во -вторых, неопределенные не могут быть добавлены с помощью одиночных или двойных кавычек, потому что здесь сравнивается тип данных, а не «неопределенная» строка.
Седьмой способ написать
Приведенный выше метод написания по -прежнему действителен в условиях «Точного сравнения» (===):
if (myobj === undefined) {var myObj = {}; }Восьмой способ написать
Согласно языковому дизайну JavaScript, не определенно == NULL, так что вы также можете получить правильный результат, сравнив, равен ли MyOBJ NULL:
if (myobj == null) {var myObj = {}; }Однако, хотя результат операции является правильным, семантически, этот метод суждения неправильный и следует избегать. Поскольку NULL относится к пустому объекту, который был назначен NULL, то есть этот объект фактически ценится, в то время как не определяется, относится к объекту, который не существует или не имеет назначения. Следовательно, вы можете использовать только «Сравнение оператора» (==) здесь, и если вы используете «точный оператор сравнения» (===) здесь, вы получите ошибку.
Девятый способ написать
Вы также можете использовать оператор IN, чтобы определить, является ли MYOBJ атрибутом объекта верхнего уровня:
if (! ('myobj' в Window)) {window.myobj = {}; }Десятый способ написать
Наконец, используйте метод HasownProperty, чтобы определить, является ли MYOBJ свойством объекта верхнего уровня:
if (! this.hashownproperty ('myobj')) {this.myobj = {}; }Суммировать
1. Если вы только определяете, существует ли объект, рекомендуется использовать метод пятого письма.
2. Если в дополнение к тому, существует ли объект, необходимо также определить, имеет ли объект нулевое значение, рекомендуется использовать первый метод написания.
3. Если не указано иное, все переменные должны быть объявлены с помощью команды VAR.
4. Для кроссплатформы рекомендуется избегать использования окна для представления объектов верхнего уровня.
5. На языке JavaScript нулевые и неопределенные склонны к путанице. В тех случаях, когда оба могут быть вовлечены, рекомендуется использовать оператор «точного сравнения» (===).
(над)
Приведенный выше простой пример того, как судить, существует ли объект JavaScript, - это весь контент, которым я поделился с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.