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)
posted @ 2023-07-14 16:07  艾路  阅读(12)  评论(0编辑  收藏  举报