Загрузка...

вторник, 16 февраля 2010 г.

Еще одна викторина, но уже с ответами от меня

Люблю ломать мозг, и на этот раз не буду отправлять по ссылкам, или отвечать комментарием на чужой пост. Напишу свои размышления, и спрошу ваших комментариев :)

Тест предложен блоггером Nicholas C. Zakas (оригинал). Отвечать буду аргументированно, с подглядыванием в консоль (все-таки до гуру расти и расти :) ).

Example #1

var num1 = 5,
    num2 = 10,
    result = num1+++num2;


Questions:
What is the value of result?
What is the value of num1?
What is the value of num2?

Судя по множеству плюсов надо решить, используется ли здесь инфиксный (++num2) либо постфиксный (num1++) инкремент. А зависит это от порядка выполнения операций в выражении (точнее, от их приоритета). От этого сильно зависит значение всех трех переменных. Во многих языках инкремент (как и декремент) имеет высший приоритет, нежели сложение (вычитание). Проверка этого обстоятельства в js подтверждает мои предположения.

Ответ: num1==6, num2==10, result==15

Example #2

var x = 5,
o = {
  x: 10,
  doIt: function doIt(){
    var x = 20;
    setTimeout(function(){
      alert(this.x);
    }, 10);
  }
};
o.doIt();


Questions:
What value is displayed in the alert?

Здесь, как по мне, все просто (постоянно с таким сталкиваюсь). Функция, вызываемая по таймауту, выполняется в контексте объекта window. Поэтому this.x равнозначно window.x == x == 5.

Ответ: 5

Example #3

var num1 = "10",
  num2 = "9";


Questions:

What is the value of num1 < num2?
What is the value of +num1 < num2?
What is the value of num1 + num2?
What is the value of +num1 + num2?

С подобной проблемой я тоже сталкивался, когда оказалось, что "10" < "9" // true!. А дело тут в сравнении строк, а не сравнении чисел. Если оба операнда — строки, то сравнение основывается на стандартном лексикографическом порядке юникодных значений. Если же один из операндов число, то второй операнд (строка) приводится к числу. Поэтому +"10" < "9" // false!. (Оператор "плюс" приводит строку "10" к соответствующему числу.)

Оператор "+" с операндом строка выполняет конкатенацию как с числом, так и с другой строкой. Поэтому num1 + num2 == "10" + "9" == +num1 + num2 == 10 + "9" == "109"

Example #4

var message = "Hello world!";

Questions:

What is the value of message.substring(1, 4)?
What is the value of message.substr(1,4)?

Стоит различать функции substring, принимающей в качестве параметров индексы начала и конца, и substr, принимающей в качестве параметров индекс начала и длину выделяемой строки. Также интересно, что message.substr(-1) == "!"

Ответ: "ell", "ello".

Example #5

var o = {
     x: 8,

     valueOf: function(){
       return this.x + 2;
     },
     toString: function(){
       return this.x.toString();
     }
  },
  result = o < "9";

alert(o);


Questions:

What is the value result?
What is the value displayed in the alert?

Вся соль в особенностях вызова функций valueOf и toString. Где требуется числовое значение, вызывается первая функция, где строковое - вторая. При сравнении (больше/меньше) вызывается сначала valueOf, а затем toString, если первая не определена. Функция alert требует строку в качестве входного параметра.

Ответ: result == false, "8".

В заключение хочу сказать, что тест оказался простым, но поучительным. А вам как?

blog comments powered by Disqus


 
^

Powered by BloggerCreative Commons License