Итак, я прошел через большинство вопросов здесь. Также немало статей хороших и плохих.
Одна вещь, на которую я обращаю внимание, это то, как обрабатываются неопределенные и необъявленные переменные.
Возьмите код ниже.
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
Любая другая операция, кроме typeof (b), приводит к ошибке во время выполнения. Тем не менее я могу понять логику того, как язык оценивает выражения.
Так что теперь я смотрю на несуществующее свойство а и действительно запутался.
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 в предыдущем примере, но это не так. Вы должны на самом деле инициализировать a чем-то, тогда вы можете заставить его вести себя как b. И остановите его от выдачи ошибок во время выполнения.
Почему это так? Есть ли какая-то специальная обработка неопределенного типа или функция typeof делает что-то рекурсивное для оценки подчиненного свойства, которое выдает ошибку времени выполнения?
Полагаю, практический вопрос здесь заключается в том, что, если я проверяю вложенный объект c в a.c, я могу сразу предположить, что c не определен, если a не определен?
И каков наилучший способ, если бы я хотел проверить какой-то чрезвычайно вложенный объект, чтобы увидеть, был ли он установлен как x в MyObject.Something.Something.Something.x? Мне нужно перемещаться по элементу структуры по элементам, чтобы убедиться, что каждый из них существует, прежде чем перейти к следующему в цепочке?