JavaScript 知识点整理

标识符

变量、函数、属性或函数参数的名称。

标识符规则

  1. 首字符必须是 字母、下划线$
  2. 其他字符可以是 字母、下划线、$数字
  • 区分大小写
  • 关键字保留字不能作为标识符
  • 标识符采用驼峰写法,第一个字母小写,剩下的每个单词的首字母大写

严格模式 use strict

一种不同的 JS 解析和执行模型。

  • 不规范的写法会被处理
  • 不安全的会抛出错误

整个 js 文件启用严格模式,在开头加上

1
'use strict'

单独指定一个函数严格模式

1
2
3
4
function doSomething () {
'use strict'
//
}

变量

变量是松散类型,可以保存任何类型的数据

声明变量

  1. var
  2. let
  3. const

不初始化默认保存 undefined

var

  • 变量提升(把变量声明放到作用域的顶部,初始化操作留在原处执行)
  • 可以重复声明(变量提升会合为一个声明)
  • 函数作用域(成为包含它的函数的局部变量)
  • 全局变量会成为 window 对象的属性(可能会覆盖全局属性)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 变量提升
function foo () {
console.log(age)
var age = 26
}
foo() // undefined
// 等同于
function foo () {
var age
console.log(age)
age = 26
}


// 可以重复声明
function foo () {
var age = 16
var age = 26
var age = 36
console.log(age)
}

foo() // 36


// 函数作用域
function test () {
var message = 'hi'
}
test()
console.log(message) // ReferenceError: message is not defined


// 全局变量会成为 window 对象的属性
var message = 'hi'
console.log(window.message) // hi

let

  • 块作用域(函数内部或 {} 之间的区域)
  • 同一个作用域禁止重复声明(作用域中已经存在某个标识符,再使用 let 声明会报错)
  • 临时死区(在声明变量之前使用)
  • 全局作用域中声明的变量不会成为 window 对象的属性
  • for 循环中的行为不一样(每次迭代时都会创建新的绑定)

块作用域:只在当前代码块内有效,执行到代码块外会立即销毁。

临时死区(Temporal Dead Zone):与 var 不同,let 和 const 不会发生变量提升,如果在声明前访问这些变量,即使是 type of 也会触发引用错误。JS 引擎发现变量声明时,要么提升至作用域顶部(var),要么将声明放到 TDZ 中(let、const)。访问 TDZ 中的变量会触发运行时错误。只有执行过变量声明语句后,变量才会从 TDZ 中移出,方可正常访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 块作用域
if (true) {
var name = 'jack'
console.log(name) // jack
}
console.log(name) // jack

if (true) {
let age = 26
console.log(age) // 26
}
console.log(age) // ReferenceError: age is not defined

// 不能重复声明
var age
let age // SyntaxError: Identifier 'age' has already been declared

// 暂时性死区
console.log(age)
let age = 26

// for 循环
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}

console.log(i)

循环里的每次迭代同时共享变量 i ,循环内部创建的函数全都保留了对相同变量的引用。

for 循环中勇 let 声明迭代变量时,JS 引擎在后台会为每一个迭代循环声明一个新的迭代变量。每个 setTimeout 引用的都是不同的变量实例。
每次迭代循环都会创建一个新变量,并以之前迭代中同名变量的值将其初始化。

const

const 基本与 let 相同。区别如下

  • 声明时必须初始化(赋值)
  • 不能修改变量引用(可以修改对象内部属性)
  • 在 for-in 或 for-of 循环中使用时与 let 一致

最佳实践

  1. 不使用 var
  2. const 优先 let 次之(知道未来会修改变量时,再使用let。)

数据类型

ssb nnu o

  1. String
  2. Symbol
  3. Boolean
  4. Null
  5. Number
  6. Undefined
  7. Object

type of

typoe of 会返回下列字符串

  1. string
  2. symbol
  3. boolean
  4. number
  5. function
  6. undefined
  7. object 对象 或 null

Undefined

var 或 let 声明了但没有初始化就相当于给变量赋值 undefined
不要显式初始化 undefined
typeof 未声明和未初始化的变量都返回 undefined
建议声明变量的同时进行初始化,这样当 type of 返回 undefined 时,就只当是变量尚未声明。

undefined 的意义就是区分空对象指针 null 和未初始化变量的区别。

Null

空对象指针
声明要保存对象的变量时,建议使用 null 初始化,这样检测是不是 null 就可以知道是否后来被重新赋值了

undefined 由 null 派生而来 null == undefined // true

Boolean

true false

Boolean() 可以转换任意数据类型,返回一个 boolean 值 if()
转换为 false 的值
false、’’、0、NaN、null、undefined

Number

类型转换

  1. Number()
  2. parseInt()
  3. parseFloat() 只解析十进制值

Number() 是转型函数,可用于任何数据类型
后两个函数主要用于将字符串转换为数值。

Number()

  • 布尔值 => 1, 0
  • 数值直接返回
  • null => 0
  • undefined => NaN
  • ‘’ => 0
  • 有效数字字符串返回数字,其他为 NaN

parseInt(, 10)

  • ‘’ => NaN

String

字符串是不可变的,一旦创建值就不能修改。
要修改某个变量中的字符串值,必须先销毁原始字符串,然后将包含新值的另一个字符串保存到该变量。

转换为字符串

age.toString()

基本引用类型

构造函数就是用来创造新对象的函数
new 其实就是创建一个对象
new Date()

Date

UTC 时间 保存 1970-01-01 至今所经过的毫秒数

RegExp

原始值包装类型

  • Boolean
  • Number
  • String

包装对象

  1. JavaScript 中一切皆对象
  2. 方便原始类型的值调用某些方法或属性

只有引用类型(对象)才有属性和方法,原始类型是没有属性和方法的。

  1. 在JavaScript中,“一切皆对象”,包括三种原始类型的值(数值、字符串、布尔值),在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”。

  2. 包装对象是特殊的引用类型。每当读取数字、字符串和布尔值的属性或方法时,创建的临时对象称做包装对象.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 通过 new 调用 返回的是个对象 type object
    const n = new Number(123)
    const b = new Boolean(true)
    const s = new String('123')

    // 直接调用 将任意类型的值,转为原始类型的值。
    const n = Number(123)
    const b = Boolean(true)
    const s = String('123')

包装对象销毁

1
2
3
const str = 'hello';
str.name = 'jack'; // 创建临时包装对象,这行代码执行完包装对象就会销毁
console.log(str.name) // undefined

参考链接