Javascript Escape(\ x)+变量,

时间:2016-02-03 21:26:02

标签: javascript

一直玩Javascript并发现似乎很有趣的转义(\ x)。

为了澄清我发现我可以使用escape + x,

将两位数转换成一个字母

类似于"\x51"输出Q

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

组合时

现在我的问题是,是否可以在X后添加动态数字值?

就像我尝试创建这样的函数一样但它似乎不可能,因为它看起来需要在x之后有两个字符(数字或字母)。

function __num_string( num ) {
    return "\x"+num;
}

期望 __num_string( 51 )会返回Q

现实 Uncaught SyntaxError: Unexpected token ILLEGAL

如果可能与否,我将不胜感激,

由于

3 个答案:

答案 0 :(得分:2)

是的,这是可能的,但有一个better way to do it

return String.fromCharCode(num);

...其中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]字符范围。然而在你的情况下,那里没有任何相似之处,因此Unexpected token ILLEGAL

答案 1 :(得分:1)

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

您正在寻找String.fromCharCode,这听起来确实如此。

答案 2 :(得分:0)

tldr

      
  • 将51₁₆传递给foreach(QString file, listFile) { int row=-1; for (int var = 0; var < ui->tableView->model()->rowCount(); ++var) { if(ui->tableView->model()->index(row,0).data().toString()==file){ row=var; } } 而不是51₁₀
  •   
  • 51₁₆等于81₁₀
  •   
  • 以下任何一种都可以用于转换
  •   
          
    • String.fromCharCode
    •     
    • (81).toString(16)
    •     
    • 81..toString(16)
    •     
    • 81.0.toString(16)
    •   

在阅读了该问题的答案和评论后,随后进行了调查。

牢记我从问题中得出的假设

为什么要使用主要解决方案numberVar.toString(16), 尝试时似乎无法回答提问者的问题。

假设是问题出在传递给String.fromCharCode的参数类型之内。

以下内容在节点repl中演示了String.fromCharCode返回'\x51' === 'Q'true也返回String.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'

似乎所讨论的方法采用十六进制字符串。

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

下面是执行转换的函数。

0x51
0x51.toString(16)
String.fromCharCode(0x51)
(81).toString(16)
String.fromCharCode(81)
0x33
0x33.toString(16)
String.fromCharCode(0x33)
String.fromCharCode(51)

它可以与数字一起使用

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'))
'?'