“\n”在JavaScript中被视为字符串文字

“\n”在JavaScript中被视为字符串文字,javascript,jquery,linefeed,Javascript,Jquery,Linefeed,我有一个select标记和一个值为\n的选项标记。当选择该选项并使用jQuery获取值时,JavaScript似乎将其视为字符串文本,而不是将其解释为换行符 我尝试过转义、取消转义、转义然后取消转义,使用jQuery htmlEncoding技术、jQuery htmlDecoding技术,甚至尝试用空字符串连接。我在拔头发。这应该很简单 至少有5种变通方法以不同的优雅程度突然出现在我的脑海中,但在这一点上,我更感兴趣的是这种行为存在的原因。有什么简单的东西我遗漏了吗?我真正的问题是为什么Jav

我有一个select标记和一个值为\n的选项标记。当选择该选项并使用jQuery获取值时,JavaScript似乎将其视为字符串文本,而不是将其解释为换行符

我尝试过转义、取消转义、转义然后取消转义,使用jQuery htmlEncoding技术、jQuery htmlDecoding技术,甚至尝试用空字符串连接。我在拔头发。这应该很简单

至少有5种变通方法以不同的优雅程度突然出现在我的脑海中,但在这一点上,我更感兴趣的是这种行为存在的原因。有什么简单的东西我遗漏了吗?我真正的问题是为什么JavaScript在一个上下文中以一种方式处理字符串,\n而在另一个上下文中以不同的方式处理字符串,\n而不是如何让它工作

这是密码

Html 我这里有一个代码笔:

将值中的\n替换为新行代码:&13; 在HTML标记属性中,必须使用特殊字符

为什么JavaScript在一个上下文中以一种方式处理\n字符串,而在另一个上下文中则以不同方式处理

因为它不是JavaScript,也不是字符串文字。是纯HTML,反斜杠不是HTML中的转义字符。您可以使用文字换行符或换行符

我试过逃跑

但显然不是正确的。它总是取决于要使用的上下文,有时甚至需要将它们链接起来。一些合适的解决方案:

HTML源中的文字字符:

<option value="
">New Line</option>
<option value=",">Comma</option>
<option value=" ">Tab</option>
HTML源中的字符实体引用,以避免奇怪的格式:

<option value="&#x000A;">New Line</option> <!-- or &#10; -->
<option value=",">Comma</option>
<option value="&#x0009;">Tab</option> <!-- or &#9; -->
HTML源代码中的JSON文本以避免知道字符码:

<option value="&quot;\n&quot;">New Line</option>
<option value="&quot;,&quot;">Comma</option>
<option value="&quot;\t&quot;">Tab</option>
<option value="\n">New Line</option>
<option value=",">Comma</option>
<option value="\t">Tab</option>
HTML源中的JSON字符串内容:

<option value="
">New Line</option>
<option value=",">Comma</option>
<option value=" ">Tab</option>
为什么JavaScript在一个上下文中以一种方式处理\n字符串,但是 在另一个方面不同

首先,您应该了解字符串文字不是内存中的实际字符串,而是用于创建字符串的js语法的一部分。因此,从\字符信号开始的转义序列发送到js引擎,以不同的方式处理下一个字符

HTML没有这种特殊的语法。所以\只是\而\n是\n。当这个字符串通过domapi跨越html-js边界时(domapi不是js语法的一部分),它仍然是两个字母的字符串

顺便说一句,在js中有不同的方式来编码新行,这些新行在内存中产生相同的字符串

常量withEscSequence='\n' //es2015 使用StringTemplate的常量=` ` //直接从字符代码 const fromCharCode=String.fromCharCode10 //使用unicode转义序列 常量UNICODEESCEQUENCE='\u000A' //使用十六进制转义序列 常量hexEscSequence='\x0A'
console.logwithEscSequence===usingStringTemplate,withEscSequence==fromCharCode,withEscSequence==UnicodeScSequence,withEscSequence==HexesESCSequences谢谢,这确实解决了问题,但并没有真正给我解释。我更关心的是为什么JavaScript在一个上下文中以一种方式处理字符串\n,而在另一个上下文中则不同。HTML没有像\n或\t这样的转义序列。所以不是javascript做的:但是一旦我们在javascript中得到了选项的值,它就是一个字符串,对吗?我认为它与var s='\n'相同。但情况似乎并非如此。由两个字符组成的长度为2的字符串\n,转换为字符串文字的应为'\\n'。请尝试console.debugdelimiter.split,delimiter=='\\n'谢谢,这个解释有点像我所怀疑的,但是var s=/n有什么神奇之处呢。在我看来,字符串也包含两个字符。但它会生成一个换行字符。我不想在这里难为情,我只是想了解JS在幕后做什么。var delimiter=$delimiter.val;生成一个与var s='\n'不同的字符串。另外,是否有任何方法可以将当前返回并转换为//n的字符串转换为换行符?谢谢您的详细回答。我想我现在明白了!:
selectEl.value
<option value="&quot;\n&quot;">New Line</option>
<option value="&quot;,&quot;">Comma</option>
<option value="&quot;\t&quot;">Tab</option>
JSON.parse(selectEl.value)
<option value="\n">New Line</option>
<option value=",">Comma</option>
<option value="\t">Tab</option>
JSON.parse('"'+selectEl.value+'"')