在这种情况下,您在比较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 ???
答案 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)
与空格不同。一旦了解了字母的含义:“不间断空格”,这一点就变得显而易见。就是说,它是一个特殊的空格字符(的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"> </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 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
,
我们不能 garantee 3.但我们可以肯定地说得出结论B = C
不一定正确。
答案 3 :(得分:-1)
“我的朋友”(“”)向我们显示的声明没有跟随HTML(标记和元素)。 &nbsp支持HTML(标记和元素)。
“”间隙已固定。 nbsp的间隙不是固定的。
答案 4 :(得分:-1)
是空白。
''是一个无用的空格。
仅包含“”的元素可能不起作用,
将在其中起作用。
如果我们使用空数据呈现任何表,则在没有内容或空白时,将不会应用任何样式或边框等。
如果我们要添加
,一切都会显示出来!