为什么是 比较时与“”不同

时间:2019-12-26 09:41:18

标签: javascript regex whitespace

在这种情况下,您在比较false时为什么能得到text === ' '吗?

var div = document.getElementById('d');

div.innerHTML = ' ';

// ' '
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;
}
<div id="d"></div>

这似乎不是逻辑:\s是A,' '是B,text是C。

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

5 个答案:

答案 0 :(得分:6)

空格" "non-breaking space是两个不同的字符。不间断空格的代码单元为160,而该空格的代码单元为32。

基于这种观察,当在两个非数字类型之间使用严格相等时,规范使用以下逻辑:

7.2.13 SameValueNonNumeric ( x, y )

  

内部比较抽象操作SameValueNonNumeric(x,y),   其中x和y都不是数字类型值,则生成true或false。   这样的比较如下:

     
      
  • 声明:Type(x)不是Number或BigInt。断言:Type(x)相同   作为Type(y)。

  •   
  • 如果Type(x)未定义,则返回true。如果Type(x)为Null,   返回true。

  •   
  • 如果Type(x)为字符串,则

         
        
    • 如果x和y恰好是   相同的代码单元序列(相同的长度和相同的代码单元位于   相应的索引),返回true;否则,返回false。   ...
    •   
  •   

上面的最后一条陈述是不正确的,因为两者都有不同的代码点值(如上所示),因此,当您尝试比较两者时,我们得到false。这并不奇怪,因为我们正在比较两个不同的字符串(如其代码单位值所示)。

但是,在正则表达式中使用\s时,是指特殊的空白字符:

  

匹配一个空白字符,包括空格,制表符,换页或换行   饲料。相当于   -[\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

     

-MDN

上面的字符集同时包含空格和不间断空格(Unicode编码为U+00A0),因此使用正则表达式的两个测试都将返回true。

答案 1 :(得分:2)

&nbsp;与空格不同。一旦了解了字母的含义:“不间断空格”,这一点就变得显而易见。就是说,它是一个特殊的空格字符(的HTML编码),在其上告诉打字机不要(除其他外)使行换行。

它与(中断)空间完全不同,只是视觉上看起来相同。不间断字符还可以具有其他宽度,而不仅仅是单个空格。

但是,它被认为是空白字符,这部分是例如正则表达式具有特殊的空白字符类(\s)以及为什么要使用它们的原因(因为它们不仅是“空格或制表符”)。

答案 2 :(得分:1)

在这种情况下,如果您有两个视觉上相似的字符,检查为什么不平等的最简单方法是检查什么字符:

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);
<div id="b">&nbsp;</div> <!-- nbsp entity -->
<div id="c"> </div> <!-- a single space -->

因此,它们有两个不同字符代码,这意味着它们是不同的字符。因此B != C是有道理的-它们并不相同。

空格是一种空白字符,而nbsp;实体表示 n - b 具有 sp ace -本质上不会分裂的原子空白。这是一个示例:

.example {
  width: 2em;
  border: 1px solid black;
}
<h3>Space</h3>
<div class="example">hello world</div>

<h3>Non-breakable space</h3>
<div class="example">hello&nbsp;world</div>

正则表达式符号\s匹配 any 空格

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. 猫不是狗

我们不能 garantee 3.但我们可以肯定地说得出结论B = C不一定正确。

答案 3 :(得分:-1)

“我的朋友”(“”)向我们显示的声明没有跟随HTML(标记和元素)。 &nbsp支持HTML(标记和元素)。

“”间隙已固定。 nbsp的间隙不是固定的。

答案 4 :(得分:-1)

&nbsp;是空白。

''是一个无用的空格。

仅包含“”的元素可能不起作用,&nbsp;将在其中起作用。 如果我们使用空数据呈现任何表,则在没有内容或空白时,将不会应用任何样式或边框等。 如果我们要添加&nbsp;,一切都会显示出来!