Люблю ломать мозг, и на этот раз не буду отправлять по ссылкам, или отвечать комментарием на чужой пост. Напишу свои размышления, и спрошу ваших комментариев :)
Тест предложен блоггером 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==15Example #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 ofnum1 < num2?
What is the value of+num1 < num2?
What is the value ofnum1 + 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 ofmessage.substring(1, 4)?
What is the value ofmessage.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 valueresult?
What is the value displayed in the alert?
Вся соль в особенностях вызова функций
valueOf и toString. Где требуется числовое значение, вызывается первая функция, где строковое - вторая. При сравнении (больше/меньше) вызывается сначала valueOf, а затем toString, если первая не определена. Функция alert требует строку в качестве входного параметра.Ответ:
result == false, "8".В заключение хочу сказать, что тест оказался простым, но поучительным. А вам как?

