Так что я прошел через большинство вопросов здесь. Также немало статей хороших и плохих.Другой Javascript Неопределенный нулевой вопрос
Одна вещь, которую я ищу для получения дополнительной информации о том, как обрабатываются неопределенные и un объявленные переменные.
Выполните приведенный ниже код.
var a;
if(a == null) // True - Due to Type Coercion
if(a == 'null') // False
if(a === null) // False
if(a === 'null') // False
if(a == undefined) // True
if(a === undefined) // True
if(a == 'undefined') // False
if(a === 'undefined') // False
if(a) // False - A is undefined
alert(typeof(a)) // undefined
Все вышеперечисленное я понимаю. Но все странно, когда вы смотрите на необъявленную переменную. Заметьте, что я специально опускаю «var b;».
alert(typeof(b)) // undefined
if(typeof(b) == 'undefined') // True
if(typeof(b) === 'undefined') // True - This tells me the function typeof is returning a string value
if(typeof(b) == 'null') // False
if(typeof(b) === 'null') // False
if(typeof(b) == null) // False
if(typeof(b) === null) // False
if(b) // Runtime Error - B is undefined
Любая другая операция, а затем типof (b) приводит к ошибке выполнения. Тем не менее, я могу понять логику того, как laguage оценивает выражения.
Итак, теперь я смотрю на несуществующее свойство a и действительно запутался.
if(a.c) // Runtime Error - c is null or not an object
alert(typeof(a.c)) // Runtime Error - undefined is null or not an object
Я бы подумал, что c в этом случае будет рассматриваться как b в предыдущем примере, но его нет. Вы должны фактически инициализировать что-то, и тогда вы можете заставить его вести себя так, как это делает b. И не позволяйте ему перебрасывать ошибки времени выполнения.
Почему это так? Есть ли какая-то специальная обработка неопределенного типа или функция typeof что-то рекурсивно выполняет для оценки свойства sub, которое бросает ошибку времени выполнения?
Я предполагаю, что практический вопрос здесь, если я проверяю вложенный объект с в a.c можно сразу считать С не определен, если не определено?
И что лучше всего, если я захочу проверить какой-то чрезвычайно вложенный объект, чтобы увидеть, было ли оно установлено как x в MyObject.Something.Something.Something.x? Я должен перемещаться по элементу структуры по элементу, убедившись, что каждый из них существует, прежде чем перейти к следующему в цепочке?
** Примечание * *: в вашем примере выше, * a * будет * undefined *, а не * null *. – jldupont