Как уже говорилось в предыдущих разделах, существует несколько операторов, ведущих себя особым образом, когда в качестве операндов выступают строки.
Оператор + выполняет конкатенацию двух строковых операндов. Другими сло_ вами, создает новую строку, состоящую из первой строки, за которой следует вторая строка. Так, следующее выражение равно строке "hello there":
"hello" + " " + "there"
Следующие инструкции дают в результате строку "22":
a = "2"; b = "2";
c = a + b;
Операторы <, <=, > и >= сравнивают две строки и определяют, в каком порядке они следуют друг за другом. Сравнение основано на алфавитном порядке. Как было отмечено в разделе 5.1.1, этот алфавитный порядок базируется на исполь_ зуемой в JavaScript кодировке Unicode. В этой кодировке все прописные буквы латинского алфавита идут раньше, чем все строчные буквы (прописные «мень_ ше» строчных), что может приводить к неожиданным результатам.
Операторы равенства == и неравенства != применяются не только к строкам, но, как мы видели, ко всем типам данных, и при работе со строками ничем особен_ ным не выделяются.
Оператор + особенный, поскольку дает приоритет строковым операндам перед числовыми. Как уже отмечалось, если один из операндов оператора + представ_ ляет собой строку (или объект), то другой операнд преобразуется в строку (или оба операнда преобразуются в строки) и операнды конкатенируются, а не скла_ дываются. С другой стороны, операторы сравнения выполняют строковое срав_ нение, только если оба операнда представляют собой строки. Если только один операнд – строка, то интерпретатор JavaScript пытается преобразовать ее в чис_ ло. Далее следует иллюстрация этих правил:
1 + 2
// Сложение. Результат равен 3.
"1" + "2"
// Конкатенация. Результат равен "12".
"1" + 2
// Конкатенация; 2 преобразуется в "2". Результат равен "12".
11 <
//
Численное
сравнение. Результат равен false.
"11"
< "3" //
Строковое
сравнение. Результат равен true.
5.7. Логические операторы
"11" < 3 // Численное сравнение; "11" преобразуется в 11. Результат равен false. "one" < 3 // Численное сравнение; "one" преобразуется в NaN. Результат равен false.
И наконец, важно заметить, что когда оператор + применяется к строкам и чис_ лам, он может быть неассоциативным. Другими словами, результат может зави_ сеть от порядка, в котором выполняются операции. Это можно видеть на следую_ щих примерах:
s
=
1 + 2 +
" слепых
мышей";
//
Равно
"3 слепых мышей"
t
=
"слепых
мышей: "
+ 1 + 2;
//
Равно
" слепых мышей: 12"
Причина этой удивительной разницы в поведении заключается в том, что опера_ тор + работает слева направо, если только скобки не меняют этот порядок. Следо_ вательно, последние два примера эквивалентны следующему:
s = (1 + 2) + "слепых мышей"; // Результат первой операции _ число; второй _ строка t = ("слепых мышей: " + 1) + 2; // Результаты обеих операций _ строки