typeof 结果
{} object
[] object
null object
undefined undefined
NaN number
0 number
true boolean
‘’ string

let与var与const

var的特点

1、var的作用域

var 声明的作用域是全局的或函数/局部的。

当 var 变量在函数外部声明时,作用域是全局的。这意味着在函数体外用 var 声明的任何变量都可以在整个窗口中使用。

var 在函数中声明时,它的作用域是在函数体内。这意味着它只能在该函数中被访问。

2、var 变量可以重新声明和更新

3、var的提升

提升(hoisting)是一种 JavaScript 机制,其中变量和函数声明在代码执行之前被移动到其作用域的顶部。

let的特点

1、let是块级作用域

块是由 {} 界定的代码块。一个块存在于花括号中。花括号内的任何内容都是一个块。

因此,在带有 let 的块中声明的变量只能在该块中使用。

2、let可以更新但不能重新声明

就像 var 一样,使用 let 声明的变量可以在其作用域内更新。与 var 不同,let 变量不能在其作用域内重新声明。

3、let的提升

就像 var 一样,let 声明被提升到顶部。与初始化为 undefined 的 var 不同,let 关键字未初始化。所以如果你在声明之前尝试使用 let 变量,你会得到一个 Reference Error。

const的特点

1、const 声明是块作用域

与 let 声明一样,const 声明只能在它们声明的块内访问。

2、const 不能更新或重新声明

这意味着用 const 声明的变量的值在其作用域内保持不变。它不能被更新或重新声明。

3、const 的提升

就像 let 一样,const 声明被提升到顶部但没有被初始化。

区别

  • var 声明是全局作用域或函数作用域,而 let 和 const 是块作用域。
  • var 变量可以在其作用域内更新和重新声明;let 变量可以更新但不能重新声明;const 变量既不能更新也不能重新声明。
  • 它们都被提升到了作用域的顶部。但是,var 变量是用 undefined 初始化的,而 let 和 const 变量不会被初始化。
  • var 和 let 可以在不初始化的情况下声明,而 const 必须在声明时初始化。

类型转换

理解弱类型语言的特征,掌握显式类型转换的方法

在 JavaScript 中数据被分成了不同的类型,如数值、字符串、布尔值、undefined,在实际编程的过程中,不同数据类型之间存在着转换的关系。

隐式转换

某些运算符被执行时,系统内部自动将数据类型进行转换,这种转换称为隐式转换。

  • +号两边只要有一个是字符串,都会把另外一个转成字符串
  • 除了+以外的算术运算符,比如 - * / 等都会把数据转成数字类型。
  • +号作为正号解析可以转换成数字型
  • 任何数据和字符串相加结果都是字符串
  • 有字符串的加法“”+1,结果是“1”
  • 减法-(像大多数数学运算一样)只能用于数字,它会使空字符串””转换为0
  • null经过数字转换之后会变为0
  • undefined经过数字转换之后会变为NaN
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 隐式转换</title>
</head>
<body>
<script>
let num = 13 // 数值
let num2 = '2' // 字符串

// 结果为 132
// 原因是将数值 num 转换成了字符串,相当于 '13'
// 然后 + 将两个字符串拼接到了一起
console.log(num + num2)

// 结果为 11
// 原因是将字符串 num2 转换成了数值,相当于 2
// 然后数值 13 减去 数值 2
console.log(num - num2)

let a = prompt('请输入一个数字')
let b = prompt('请再输入一个数字')

alert(a + b);
</script>
</body>
</html>

注:数据类型的隐式转换是 JavaScript 的特征,后续学习中还会遇到,目前先需要理解什么是隐式转换。

补充介绍模板字符串的拼接的使用

显式转换

编写程序时过度依靠系统内部的隐式转换是不严谨的,因为隐式转换规律并不清晰,大多是靠经验总结的规律。为了避免因隐式转换带来的问题,通常根逻辑需要对数据进行显示转换。

转为Number

1、通过 Number 显示转换成数值类型,当转换失败时结果为 NaN(Not a Number)即不是一个数字。

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 隐式转换</title>
</head>
<body>
<script>
let t = '12'
let f = 8

// 显式将字符串 12 转换成数值 12
t = Number(t)

// 检测转换后的类型
// console.log(typeof t);
console.log(t + f) // 结果为 20

// 并不是所有的值都可以被转成数值类型
let str = 'hello'
// 将 hello 转成数值是不现实的,当无法转换成
// 数值时,得到的结果为 NaN (Not a Number)
console.log(Number(str))
</script>
</body>
</html>

如果字符串内容里有非数字,转换失败时结果为 NaN(Not a Number)即不是一个数字

NaN也是number类型的数据,代表非数字

特殊转换:

Number转换 结果
Number({}) NaN
Number([]) 0
Number(‘’) 0
Number(null) 0
Number(undefined) undefined
Number(NaN) NAN
Number(false) 0
Number(true) 1

2、parseInt(数据) 只保留整数,数字只能在字符串开头,否则NaN。

3、parseFloat(数据) 可以保留小数,数字只能在字符串开头,否则NaN。

转换为字符型

1
2
3
String(数据)
1.对于Number 和 Boolean 实际就是调用 toString()
2.对于undefined 和 null 是直接转换为 "undefined" 和 "null"
1
2
3
变量.toString(进制)
1.该方法不会影响原变量
2.Null, Undefined 没有 toString()方法,使用会报错
1
2
3
4
任意数据类型 + ""
1.隐式转换
2.任何数据类型与字符串相加都是先调用 String() 转为字符串再拼接
3.最常用⭐

转换为Boolean值

‘’、0、undefined、null、false、NaN转换为布尔值后都是false,其余则为true

Null和Undefined

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<body>
<script>
// 1. true false 是布尔型字面量
// console.log(3 > 4)
// let isCool = false
// console.log(isCool)
// 2. 未定义类型 弱数据类型 声明一个变量未赋值就是 undefined
// let num
// console.log(num)
// 3. null 空的
// let obj = null
// console.log(obj)
// 计算有区别
console.log(undefined + 1) // NaN
console.log(null + 1) // 1
</script>
</body>

null 和 undefined 区别:
undefined 表示没有赋值
null 表示赋值了,但是内容为空

null 开发中的使用场景:
官方解释:把 null 作为尚未创建的对象
大白话: 将来有个变量里面存放的是一个对象,但是对象还没创建好,可以先给个null