01. Данные
Контрольные вопросы
-
Как вы думаете, почему первое выражение вычисляется, а второе приводит к сообщению о синтаксической ошибке?
45.7777777.toPrecision(4) // Равно "45.78"
45.toPrecision(4) // Синтаксическая ошибка
ОтветТочку после цепочки цифр интерпретатор расценивает как десятичную точку числа, а не как оператор доступа к методу. Получается:
числоtoPrecision(4) --- синтаксическая ошибка (нет оператора доступа к методу)
Варианты
45..toPrecision(4) 45.0.toPrecision(4)
будут работать нормально. К числу 45. в первом случае и к числу 45.0 во втором, применяется метод toPrecision.
-
Какие значения получат переменные y, z и t? Объясните ответы.
var x = 3; var y = x+1; var z = x+"1"; var t = "4"-x;
ОтветJavaScript не типизирует переменные на этапе объявления, как это делают другие языки. В переменной JavaScript могут находиться данные любого типа (элементарные и объекты).
В силу этого JavaScript автоматически преобразует тип данных по контексту на этапе выполнения. Кроме того, нужно помнить что оператор + тоже контекстно-зависимый. Для чисел это сложение, для строк — конкатенация.
Поэтому имеем:
var x = 3; var y = x+1; // 4 число + число var z = x+"1"; // "31" Когда один из операндов операции + есть строка, // второй автоматически преобразуется в строку var t = "4"-x; // 1 Операция - относится только к числам, // поэтому строки автоматически преобразуются в числа
Типичный способ преобразовать строку str в число:
var str = "12"; var n = str-0; // Равно числу 12
А вот способ преобразовать число в строку:
var n = 12; var str = n+""; // Равно строке "12"
-
Какое значение получит переменная x в каждом случае? Объясните ответы.
-
var y = 25.45.toString(); var x = typeof y;
-
var y = "25"-"5"; var x = typeof y;
-
var y = NaN; var x = typeof y;
-
var y = 1/0; var x = typeof y;
-
var y = 1E1; var x = y-10;
-
var y = 25; var x = typeof(y+"1")+"er";
-
var x = Number.MAX_VALUE/Infinity;
-
var y = 225; var x = y.toString(16);
-
var x = typeof [];
-
var y = [1,2]; var x = y[0].toString()+y[1];
Ответ-
var y = 25.45.toString(); var x = typeof y; // Равно строке "string"
-
var y = "25"-"5"; var x = typeof y; // Равно строке "number"
-
var y = NaN; var x = typeof y; // Равно строке "number", // ибо NaN имеет числовой тип
-
var y = 1/0; var x = typeof y; // Равно строке "number", // ибо Infinity имеет числовой тип
-
var y = 1E1; // Равно 1*10^1 == 10 var x = y-10; // Равно 0 (10-10)
-
var y = 25; var x = typeof(y+"1")+"er"; // Равно строке "stringer", // ибо y+"1" строка, значит, // typeof(y+"1") == "string"
-
var x = Number.MAX_VALUE/Infinity; // Равно числу 0 // (число/бесконечность)
-
var y = 225; var x = y.toString(16); // Равно строке "e1"
-
var x = typeof []; // Равно строке "оbject" // [] -- это литерал пустого массива
-
var y = [1,2]; // Это литерал массива из двух элементов var x = y[0].toString()+y[1]; // y[0].toString() -- это строка "1" // y[0].toString()+y[1] -- строка + число, число автоматически // преобразуется в строку, получается "1"+2 -> "1"+"2" -> "12"
-
-
function f1(x) { return x+3;} function f2(y) { return y*3;} function f3(x, y, z) { return x(z)+y(z);}
Какое значение получит переменная x в каждом случае? Объясните ответы.
-
var x = f3(f1,f2,2);
-
var x = f3(function(t){return t-1;},f2,2);
-
var x = f3(function(t){return t-1;},function(t){return t*t;},5);
Ответ-
var x = f3(f1,f2,2);
Параметрами функции f3 являются функции f1, f2 и литерал 2. Функция f3 возвращает f1(2)+f2(2), то есть число 11.
-
var x = f3(function(t){return t-1;},f2,2);
Параметрами функции f3 являются литерал функции function(t){return t-1;}, функция f2 и литерал 2.
Функция f3 возвращает: (function(t){return t-1;})(2) + f2(2), то есть число 7.
Вычисляем функциональный литерал. Подставляем в качестве аргумента 2, получаем 2-1, то есть единицу. Эта единица складывается с f2(2), получается 7.
-
var x = f3(function(t){return t-1;},function(t){return t*t;},5);
Параметрами функции f3 являются два функциональных литерала и числовой литерал 2.
Функция f3 возвращает: (function(t){return t-1;})(5) + (function(t){return t*t;})(5). Получаем: 4 + 25, то есть число 29.
О функциях мы еще поговорим подробнее. Отмечу пока только один момент: что есть имя функции?
Имя функции — это переменная, значением которой является функциональный литерал этой функции.
Пусть функция описана так:
function add1(x) { return x+1; }
Эта запись равнозначна записи:
var add1 = function (x) { return x+1; }
То есть имя функции — это замаскированное имя переменной, которой присвоен функциональный литерал.
Сравните:
Числовой литерал Функциональный литерал 25
function (x) { return x+1; }
Переменная, которой присвоено значение числового литерала Переменная, которой присвоено значение функционального литерала var t = 25;
var t = function (x) { return x+1; };
Последний вариант это то же самое, что:
function t(x) { return x+1; }
То есть
function t(x) { return x+1; } var t = function (x) { return x+1; };
есть разные формы записи одного и того же.
Функциональный литерал можно вычислить. Записывается это так:
(function (x) { return x+1; })(2) // Равно 3
Cинтаксис такой:
(функциональный литерал)(аргументы)
Проверьте это на испытательном стенде:
alert((function (x) { return x+1; })(3)); // Равно 4
-