js黑客思想(1)
十六进制
十六进制,它只在字符串内部起作用,如果您尝试将其用作标识符,他们将失败。一个有趣的方面是,十六进制转义必须使用小写的 x,如果使用大写的 X,它将不会被视为十六进制转义,js 引擎将简单地将字符串处理为字面上的大写 X,后面跟着你指定的字符。
'\x61'//a
"\x61"//a
`\x61`//a
functiona(){}
\x61()//fails
unicode 转义也适用于字符串,并且也允许在标识符中使用。
console.log('\u0061')
function a() {
console.log('a func')
}
a() // a func
你可以将他们与 eval 或类似 setTimeout 的其他形式的 eval 一起使用。在使用这些函数时,你必须对它们进行双重转义,甚至如果它们嵌套在一起,可能需要更多的转义!如果你使用 eval,十六进制将首先被解码,然后执行,以下代码是完全有效的:
eval('\x61=123') // a=123
// 对于unicode转义,你也可以进行相同的操作。
eval('\\u0061=123')
你可以转义任何不是转义序列的字符,并将它们视为实际的字符。
'\H\E\L\L\O' //HELLO
有趣的是,你可以在行尾使用反斜杠来将其延续到下一行:
'Icontinue\
ontothenextline'
let foo = {
'bar\
': 'baz'
}
双引号和单引号的字符串不支持多行,除非你使用反斜杠进行换行续写,但模板字符串支持多行和换行续写的行为。
let x =
'a\
b\
c'
x === 'abc' //true
let x = `a
b
c`
x === 'abc' //false
模版字符串证明了换行续写行为的存在,因为换行符没有被添加到字符串中。第二个代码片段展示了模版字符串支持换行,并将其包含在字符串中。模版字符串具有一个特性,允许你在占位符中执行任意的 js 表达式,使用'${}'来定义。
;`${
7 * 7
}` //49
`${`${`${7 * 7}`}`}` //49
Call 和 Apply
Call 是每个函数的一个属性,它允许你调用函数并在第一个函数中更改函数的 this 值,并将任何后续参数传递给该函数。
function x() {
console.log(this.bar)
}
let foo = { bar: 'baz' }
x.call(foo)
function x() {
console.log(this.bar) // undefined
console.log(arguments[0]) // 1
console.log(arguments[1]) // 2
console.log(this) //Window
}
x.call(null, 1, 2)