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 声明被提升到顶部。与初始化为 undefinedvar 不同,let 关键字未初始化。所以如果你在声明之前尝试使用 let 变量,你会得到一个 Reference Error

const的特点

1、const 声明是块作用域

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

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

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

3、const 的提升

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

区别

  • var 声明是全局作用域或函数作用域,而 letconst 是块作用域。
  • var 变量可以在其作用域内更新和重新声明;let 变量可以更新但不能重新声明;const 变量既不能更新也不能重新声明。
  • 它们都被提升到了作用域的顶部。但是,var 变量是用 undefined 初始化的,而 letconst 变量不会被初始化。
  • varlet 可以在不初始化的情况下声明,而 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.对于NumberBoolean 实际就是调用 toString()
2.对于undefinednull 是直接转换为 "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