Javascript转义(\x)和#x2B;变量

Javascript转义(\x)和#x2B;变量,javascript,Javascript,一直在玩Javascript并发现转义(\x),这似乎很有趣 为了澄清,我发现我可以使用escape+x将两位数转换成字母 如“\x51”输出为Q 我一直在搜索这个特定的主题,但不确定从哪里开始,因为我甚至不知道他们怎么称呼它,就像我知道PHP和Javascript中反斜杠的用途,但我不知道它与x 现在我的问题是,是否可以在X之后添加一个动态数值 我试图创建这样的函数,但似乎不可能,因为它需要在x之后有两个字符(数字或字母) function __num_string( num ) {

一直在玩Javascript并发现转义(\x),这似乎很有趣

为了澄清,我发现我可以使用escape+x将两位数转换成字母

“\x51”
输出为
Q

我一直在搜索这个特定的主题,但不确定从哪里开始,因为我甚至不知道他们怎么称呼它,就像我知道PHP和Javascript中反斜杠的用途,但我不知道它与
x

现在我的问题是,是否可以在X之后添加一个动态数值

我试图创建这样的函数,但似乎不可能,因为它需要在
x
之后有两个字符(数字或字母)

function __num_string( num ) {
    return "\x"+num;
}
期望值
\u num\u字符串(51)
将返回
Q

现实
未捕获的语法错误:意外标记非法

如果可能或不可能的话,我希望得到任何澄清


谢谢

字符串转义是一种语法功能,是字符串文本的一部分。
在运行时这样做没有意义


您正在查找
字符串。fromCharCode
,它的功能与听起来完全一样。

字符串转义是一种语法功能,是字符串文本的一部分。
在运行时这样做没有意义


您正在查找
字符串。fromCharCode
,它的作用与听起来的完全一样。

是的,这是可能的,但有一个:

。。。其中
num
是要获取的字符的Unicode值

尽管如此,从技术上讲,使用
eval
,仍然可以按照您最初的预期方式实现您的功能:

function __num_string( num ) {
   if (/^[a-f0-9]{1,2}$/i.test(num)) { 
     return eval('"\\x' + num + '"');
   }
}
注意区别:
num
应该是表示十六进制值的字符串


现在谈谈你的错误:这个

'\x'

。。。是技术上无效的字符串。解析字符串文字时,解析器希望序列
\x
后面跟着
[0-9a-f]
字符范围。然而,在您的案例中没有类似的东西,因此
意外标记非法

是的,这是可能的,但有一个:

。。。其中
num
是要获取的字符的Unicode值

尽管如此,从技术上讲,使用
eval
,仍然可以按照您最初的预期方式实现您的功能:

function __num_string( num ) {
   if (/^[a-f0-9]{1,2}$/i.test(num)) { 
     return eval('"\\x' + num + '"');
   }
}
注意区别:
num
应该是表示十六进制值的字符串


现在谈谈你的错误:这个

'\x'
。。。是技术上无效的字符串。解析字符串文字时,解析器希望序列
\x
后面跟着
[0-9a-f]
字符范围。然而,在您的案例中没有类似的东西,因此
意外标记非法

tldr
  • 通过51₁₆ 到
    String.fromCharCode
    not 51₁₀
  • 五十一₁₆ 等于81₁₀
  • 以下任一项均可用于转换
    • (81)。toString(16)
    • 81..toString(16)
    • 81.0.toString(16)
    • numberVar.toString(16)
在阅读了这个问题的答案和评论后,一项调查随之展开

记住我从这个问题中得出的假设

为什么主要的解决方案,即
String.fromCharCode
, 尝试时似乎无法回答提问者的问题

假设问题在于传递给
String.fromCharCode
的参数类型

下面在节点repl中演示了
'\x51'==='Q'
返回
true
字符串的原因。fromCharCode(51)==3也返回
true

> 0x51 // es6 hexadecimal literal
81

> 0x51.toString(16) // Same as (81).toString(16)
'51'

> String.fromCharCode(0x51) // Same as String.fromCharCode(81)
'Q'

> (81).toString(16) // Same as 0x51.toString(16)
51

> String.fromCharCode(81) // Same as String.fromCharCode(0x51)
'Q'

> 0x33 // es6 hexadecimal literal
51

> 0x33.toString(16) // literal to base 16 string
'33'

> String.fromCharCode(0x33)
'3'

> String.fromCharCode(51)
'3'
如果你想亲自尝试的话,只需要这些陈述

0x51
0x51.toString(16)
String.fromCharCode(0x51)
(81).toString(16)
String.fromCharCode(81)
0x33
0x33.toString(16)
String.fromCharCode(0x33)
String.fromCharCode(51)
似乎所讨论的方法采用十六进制字符串

如果它是一个数字,则隐式调用以16为基数传递的toString()

下面是一个进行转换的函数

function toHex(n) {
  if (typeof n === 'string') return `${parseInt(n, 16)}`;
  return `0x${n}`;
}
它可以与数字一起使用

> String.fromCharCode(toHex(33))
'3'


> String.fromCharCode(toHex(51))
'Q'
它可以与字符串一起使用

> String.fromCharCode(toHex('33'))
'3'


> String.fromCharCode(toHex('51'))
'Q'
它可以与十六进制数字一起使用,但只能用作字符串

> String.fromCharCode(toHex('3f'))
'?'
因为十六进制数字文本没有它就可以了

> String.fromCharCode(0x3f)
'?'
tldr
  • 通过51₁₆ 到
    String.fromCharCode
    not 51₁₀
  • 五十一₁₆ 等于81₁₀
  • 以下任一项均可用于转换
    • (81)。toString(16)
    • 81..toString(16)
    • 81.0.toString(16)
    • numberVar.toString(16)
在阅读了这个问题的答案和评论后,一项调查随之展开

记住我从这个问题中得出的假设

为什么主要的解决方案,即
String.fromCharCode
, 尝试时似乎无法回答提问者的问题

假设问题在于传递给
String.fromCharCode
的参数类型

下面在节点repl中演示了
'\x51'==='Q'
返回
true
字符串的原因。fromCharCode(51)==3也返回
true

> 0x51 // es6 hexadecimal literal
81

> 0x51.toString(16) // Same as (81).toString(16)
'51'

> String.fromCharCode(0x51) // Same as String.fromCharCode(81)
'Q'

> (81).toString(16) // Same as 0x51.toString(16)
51

> String.fromCharCode(81) // Same as String.fromCharCode(0x51)
'Q'

> 0x33 // es6 hexadecimal literal
51

> 0x33.toString(16) // literal to base 16 string
'33'

> String.fromCharCode(0x33)
'3'

> String.fromCharCode(51)
'3'
如果你想亲自尝试的话,只需要这些陈述

0x51
0x51.toString(16)
String.fromCharCode(0x51)
(81).toString(16)
String.fromCharCode(81)
0x33
0x33.toString(16)
String.fromCharCode(0x33)
String.fromCharCode(51)
似乎所讨论的方法采用十六进制字符串

如果它是一个数字,则隐式调用以16为基数传递的toString()

下面是一个进行转换的函数

function toHex(n) {
  if (typeof n === 'string') return `${parseInt(n, 16)}`;
  return `0x${n}`;
}
它可以与数字一起使用

> String.fromCharCode(toHex(33))
'3'


> String.fromCharCode(toHex(51))
'Q'
它可以与字符串一起使用

> String.fromCharCode(toHex('33'))
'3'


> String.fromCharCode(toHex('51'))
'Q'
它可以与十六进制数字一起使用,但只能用作字符串

> String.fromCharCode(toHex('3f'))
'?'
因为十六进制数字文本没有它就可以了

> String.fromCharCode(0x3f)
'?'

感谢您的解释,非常感谢,@riana77ow只是一个跟进,它看起来不像
String.fromCharCode()
按我想要的方式转换,
String.fromCharCode(51)
返回
3
,而
”\