\u 加四位十六进制数 或 \x 加2位十六进制数属于转义字符,在 js 字符串长度中只算 1 个,转义字符不能直接用于 HTML 文件(不会转换后输出,而是直接输出转义格式的字符串),但可以用 document.write()打印出来,因为在 js 语法范围内,虽然表达方式不一样,但是转义字符和直接的字符字面量都是指同一个东西:
console.log("\u0061"==='a');//true
('123|u55b5abc').length //12
('123|u55b5abc').split('')//["1", "2", "3", "|", "u", "5", "5", "b", "5", "a", "b", "c"]
('123\u55b5abc').length //7
('123\u55b5abc').split('')// ["1", "2", "3", "喵", "a", "b", "c"]
4、 xss 与 字符编码当向页面显示用户输入的内容是,通常我们要过滤或转义 script 标签以避免 XSS 攻击,
但是,需要注意的是, \u+16进制 、\x+16进制 、字符实体如果出现在模板中的 HTML 标签属性中就需要特别注意了,他们会正确解码后才赋给标签的属性,例如:
document.body.innerHTML ='<img src="https://www.linuxidc.com/wrongUrl.gif" onerror="this.src='http://www.xss.com'" >';
对标签属性之进行转义时,需要对注意,是比较下面2个做法:
document.body.innerHTML ='<a>click me</a>';
document.body.innerHTML ='<a>click me</a>';
5、八进制转义字符
js 字符串中,\ 开始后接正数,可能被解析为8进制转义字符。
一个八进制转义字符形成的条件是:斜线后面接的整数最长3位,至少1位,单个数字的字面值不大于8。
如果过不满足任意一项,都将结束一个字符的解释,开始新字符的解释。八进制转义字符的10进制数字字面值最大值为377,即 '\377' 被解析为一个字符,'\378' 被解析为2个字符: '\37' 和 '8' :
'\377'.length //1
console.log('\377')// ÿ
'\378'.length //2
'\128'.length //2
console.log('\127')//W
'W'.charCodeAt(0)//87
(87).toString(8)//'127'