01. Данные

Контрольные вопросы

  1. Испытательный стенд Как вы думаете, почему первое выражение вычисляется, а второе приводит к сообщению о синтаксической ошибке?

    1. 45.7777777.toPrecision(4) // Равно "45.78"
    2. 45.toPrecision(4) // Синтаксическая ошибка
    Ответ

    Точку после цепочки цифр интерпретатор расценивает как десятичную точку числа, а не как оператор доступа к методу. Получается:

    
    числоtoPrecision(4)
        ---
         синтаксическая ошибка (нет оператора доступа к методу)
    

    Варианты

    
    45..toPrecision(4)    
    45.0.toPrecision(4)
    

    будут работать нормально. К числу 45. в первом случае и к числу 45.0 во втором, применяется метод toPrecision.

  2. Испытательный стенд Какие значения получат переменные 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"
    
  3. Испытательный стенд Какое значение получит переменная x в каждом случае? Объясните ответы.

    1. 
      var y = 25.45.toString();
      var x = typeof y; 
      
    2. 
      var y = "25"-"5";
      var x = typeof y; 
      
    3. 
      var y = NaN;
      var x = typeof y; 
      
    4. 
      var y = 1/0;
      var x = typeof y; 
      
    5. 
      var y = 1E1;      
      var x = y-10;    
      
    6. 
      var y = 25;
      var x = typeof(y+"1")+"er"; 
      
    7. 
      var x = Number.MAX_VALUE/Infinity;  
      
    8. 
      var y = 225;
      var x = y.toString(16); 
      
    9. 
      var x = typeof []; 
      
    10. 
      var y = [1,2]; 
      var x = y[0].toString()+y[1];
      
    Ответ
    1. 
      var y = 25.45.toString();
      var x = typeof y; // Равно строке "string"
      
    2. 
      var y = "25"-"5";
      var x = typeof y; // Равно строке "number"
      
    3. 
      var y = NaN;
      var x = typeof y; // Равно строке "number",
                       // ибо NaN имеет числовой тип 
      
    4. 
      var y = 1/0;
      var x = typeof y; // Равно строке "number",
                        // ибо Infinity имеет числовой тип 
      
    5. 
      var y = 1E1;      // Равно 1*10^1 == 10
      var x = y-10;     // Равно 0 (10-10)
      
    6. 
      var y = 25;
      var x = typeof(y+"1")+"er"; // Равно строке "stringer",
                                  // ибо y+"1" строка, значит, 
                                  // typeof(y+"1") == "string"
      
    7. 
      var x = Number.MAX_VALUE/Infinity; // Равно числу 0 
                                         // (число/бесконечность)
      
    8. 
      var y = 225;
      var x = y.toString(16); // Равно строке "e1"
      
    9. 
      var x = typeof []; // Равно строке "оbject"
                         // [] -- это литерал пустого массива
      
    10. 
      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"
      
  4. Испытательный стенд Написан код:

    
    function f1(x) { return x+3;} 
    function f2(y) { return y*3;} 
    function f3(x, y, z) { return x(z)+y(z);} 
    

    Какое значение получит переменная x в каждом случае? Объясните ответы.

    1. 
      var x = f3(f1,f2,2);
      
    2. 
      var x = f3(function(t){return t-1;},f2,2);
      
    3. 
      var x = f3(function(t){return t-1;},function(t){return t*t;},5);
      
    Ответ
    1. 
      var x = f3(f1,f2,2);
      

      Параметрами функции f3 являются функции f1, f2 и литерал 2. Функция f3 возвращает f1(2)+f2(2), то есть число 11.

    2. 
      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.

    3. 
      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