Если сложить два числовых значения? Правильно, еще одно числовое значение. А если сложить число и строку? Тут интерпретатор JavaScript сталкивается с проблемой несовместимости типов данных. И пытается сделать эти типы совместимыми, преобразуя один из них к другому. В нашем случае, число будет преобразовано в строку, и потом две полученные строки — слиты в одну:
var a, b, с; а = 11; b = "12"; с = а + b;
Значение переменной а будет преобразовано в строковый тип — "И". Таким образом, переменная с будет содержать значение "1112" — результат слияния этих двух строк.
Теперь рассмотрим следующий пример:
var a, b, с;
а = 11; b = "12"; с = а — b;
В этом случае интерпретатор преобразует значение переменной ь в числовое значение— 12. И результатом вычисления выражения, помещенным в переменную с, станет — 1.
Как видите, интерпретатор JavaScript делает все, чтобы выполнить вашу программу. Иногда это хорошо, но часто оказывает программистам медвежью услугу: программа работает не так, как планировалось, или, в конце концов, останавливается по ошибке совсем в другом месте, на абсолютно верном операторе. Поэтому лучше всего не допускайте подобных казусов, оперируйте только переменными совместимых типов и выполняйте преобразование типов сами. Как это делается, мы рассмотрим позднее, когда будем изучать объекты языка JavaScript.
Оператор typeof
Оператор typeof принимает в качестве операнда переменную или выражение и возвращает строку, описывающую тип данных операнда. Если операнд имеет численный тип (целый или с плавающей точкой), возвращается строка "number", если строковый тип, то "string", а для логического типа — "boolean". Если же переменная вообще не содержит данных (была объявлена оператором var, но значение так и не было присвоено) или выражение возвращает неопределенный результат (из-за неудачного преобразования типов), возвращается "undefined".
Оператор typeof имеет следующий формат.
typeof({Выражение})
Рассмотрим несколько примеров использования этого оператора.
if typeof(a +1) == "number" f = typeof(somevar);
В последнем случае мы присваиваем результат оператора typeof переменной f. Помните, что он имеет строковый тип.