Не могли бы вы объяснить, почему я false при сравнении text === ' ' в этом случае?

 var div = document.getElementById('d'); div.innerHTML = '{amp}amp;nbsp;'; // ' ' var text = div.innerText; console.log(/s/.test(' ')); // true console.log(/s/.test(text)); // true console.log(text === ' '); // false 
 #d { border: 1px solid; position: absolute; } 
 {amp}lt;div id="d"{amp}gt;{amp}lt;/div{amp}gt; 

Кажется, это не логика: s это A, ' ' это B, text это C.

 A = B A = C B != C ??? 

Пробел " " и неразрывный пробел — это два разных символа. Неразрывный пробел имеет кодовую единицу 160, тогда как пробел имеет кодовую единицу 32.

Исходя из этого наблюдения, спецификация использует следующую логику, когда строгое равенство используется между двумя нечисловыми типами:

7.2.13 SameValueNonNumeric (x, y)

Абстрактная операция внутреннего сравнения SameValueNonNumeric (x, y), где ни x, ни y не являются значениями числового типа, создает true или false. Такое сравнение выполняется следующим образом:

  • Утверждение: Тип (x) не является Number или BigInt. Утверждение: тип (x) совпадает с типом (y).

  • Если Тип (x) не определен, вернуть true. Если Type (x) равен Null, вернуть true.

  • Если Тип (x) является Строкой, тогда

    • Если x и y — это одна и та же последовательность единиц кода (одинаковая длина и одинаковые единицы кода при соответствующих индексах), верните true; в противном случае верните false.

Последнее утверждение выше неверно, так как оба имеют разные значения кодовой точки (как видно выше), и поэтому мы получим false когда вы попробуете сравнить их. Это не должно вызывать удивления, поскольку мы сравниваем две разные строки (как указано в значениях их единиц кода).

Однако когда вы используете s в регулярном выражении, вы имеете в виду специальные пробельные символы:

Соответствует символу пробела, включая пробел, табуляцию, перевод формы или перевод строки. Эквивалент — [fnrtvu00a0u1680u2000-u200au2028u2029u202fu205fu3000ufeff]

MDN

Вышеуказанный набор символов включает в себя как пробел, так и неразрывный пробел (который имеет кодировку Unicode U 00A0 ), поэтому оба ваших теста с использованием регулярных выражений будут возвращать true.

{amp}amp;nbsp; это не то же самое, что пространство. Это становится очевидным, когда вы узнаете, что означают буквы: «неразрывный пробел». То есть это (HTML-кодировка) специальный символ пробела, на котором наборному устройству предписывается не прерывать (помимо прочего) (строку).

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

Однако он считается символом пробела, и это отчасти является причиной того, почему, например, регулярные выражения имеют специальные классы символов ( s ) и почему вы должны их использовать (потому что они не просто ярлык для «пробел или табуляция»).

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

 var divB = document.getElementById('b'); var divC = document.getElementById('c'); var textB = divB.textContent; var textC = divC.textContent; var charB = textB.charCodeAt(0); var charC = textC.charCodeAt(0); console.log(charB); console.log(charC); 
 {amp}lt;div id="b"{amp}gt;{amp}amp;nbsp;{amp}lt;/div{amp}gt; {amp}lt;!-- nbsp entity --{amp}gt; {amp}lt;div id="c"{amp}gt; {amp}lt;/div{amp}gt; {amp}lt;!-- a single space --{amp}gt; 

Таким образом, у них есть два разных кода символов, что означает, что они разные символы. Таким образом, B != C имеет смысл — они не одинаковы.

Пробел — это тип символа пробела, а nbsp; Сущность представляет собой пробуждение пространства — по сути, атомное пространство, которое не будет разбито. Вот пример:

 .example { width: 2em; border: 1px solid black; } 
 {amp}lt;h3{amp}gt;Space{amp}lt;/h3{amp}gt; {amp}lt;div class="example"{amp}gt;hello world{amp}lt;/div{amp}gt; {amp}lt;h3{amp}gt;Non-breakable space{amp}lt;/h3{amp}gt; {amp}lt;div class="example"{amp}gt;hello{amp}amp;nbsp;world{amp}lt;/div{amp}gt; 

Символ регулярного выражения s соответствует любому пробелу

 var newLine = 'n'; var lineFeed = 'r'; var tabCharacter = 't'; var space = ' '; var nonBreakableSpace = String.fromCharCode(160); var whitespaceRegex = /s/; console.log(whitespaceRegex.test(newLine)); console.log(whitespaceRegex.test(lineFeed)); console.log(whitespaceRegex.test(tabCharacter)); console.log(whitespaceRegex.test(space)); console.log(whitespaceRegex.test(nonBreakableSpace)); 

Таким образом, если регулярное выражение соответствует двум вещам, они не гарантированно эквивалентны — в конце концов, новая строка также не является ни пробелом, ни табуляцией.

По сути, вы можете думать о s как о категории вещей, таким образом,

 A = B A = C B != C 

имеет смысл. Давайте просто заменим A на Animal , B на Dog и C на Cat и если мы будем следовать приведенным выше соотношениям:

  1. Собака это животное
  2. Кот это животное
  3. Кот не собака

Мы не можем гарантировать 3., но мы можем определенно сказать, что заключение B = C не обязательно является правильным.

это пробел. » — неинтересный пробел.

Элементы, содержащие только «», могут не работать, где будут работать. Если мы рендерим какую-либо таблицу с пустыми данными, она не будет применять какие-либо стили или границы и т. Д., Когда нет содержимого или пробелов. Если мы добавим все будет отображаться!

Мой друг («») показывает нам утверждения, которые не следуют как HTML (тег и элемент). Поддержка в HTML (теги и элемент).

«» зазор зафиксирован в. зазор не зафиксирован.

Хамза али

новый участник этого сайта. Будьте внимательны, спрашивая разъяснения, комментируя и отвечая. Проверьте наш

Правила поведения

,