2015-12-23 3 views
-4

Я пытаюсь получить мою голову вокруг сравнения строк в JavaScript,Строка сравнения - Javascript

function f(str){ 
    return str[0] < str[str.length -1] 
} 
f("a+"); // false 

В ASCII: 'a' == 97, '+' == 43

Я правильно думать мой тест: f(str) основан на значениях ASCII выше ?

+4

вы близки: значение unicode имеет значение при сравнении двух 'String' – dandavis

+2

'console.log ('a'> '+'); // true' – Sirko

+0

@ ZakariaAcharki - Более глубокое понимание. – cookie

ответ

1

Вы почти правы. Он основан на юникод-кодовых модулях (а не на кодовых точках, это 16-разрядная кодированная версия), а не ascii на значения.

От ECMAScript 2015 specification:

If both px and py are Strings, then 
    If py is a prefix of px, return false. (A String value p is a prefix of String value q if q can be the result of concatenating p and some other String r. Note that any String is a prefix of itself, because r may be the empty String.) 
    If px is a prefix of py, return true. 
    Let k be the smallest nonnegative integer such that the code unit at index k within px is different from the code unit at index k within py. (There must be such a k, for neither String is a prefix of the other.) 
    Let m be the integer that is the code unit value at index k within px. 
    Let n be the integer that is the code unit value at index k within py. 
    If m < n, return true. Otherwise, return false. 

Примечание2

Сравнение строк использует простой лексикографический порядок последовательностей кода единичных значений. Нет попытки использовать более сложные, семантически ориентированные определения символа или строки . Порядок равенства и упорядочения, определенный в спецификации Юникода. Поэтому значения String, которые являются канонически равными в соответствии со стандартом Unicode , могут быть неравными. По сути, этот алгоритм предполагает, что обе строки уже в нормализованной форме. Кроме того, обратите внимание на то, что для строк, содержащих дополнительные символы, лексикографический порядок упорядочения значений кодовых единиц UTF-16 отличается от последовательности на последовательностей значений кодовой точки.

В основном это означает, что сравнение строк на основе lexicographical order из «кодовых единиц», который является числовым значением Юникода.

2

Для этого вам не нужна функция или сложный тест, потянув за нее строку. Просто сделайте 'a' < '+' и узнайте, что происходит. Или, проще говоря, проверьте charcode char с помощью 'a'.charCodeAt(0).

0

Эксплуатация двигателей JavaScript разрешается использовать либо UCS-2, либо UTF-16 (что практически для большинства целей).

Итак, технически ваша функция основана на значениях UTF-16, и вы сравнивали 0x0061 и 0x002B.

Смежные вопросы