1、let、var、const的区别
1.1、总结:
var
是旧的声明方式,作用域较宽松,容易引发变量冲突let
和const
提供了块级作用域,更加安全和明确。let
用于需要修改的变量,const
用于不应修改的常量
1.2、 细分:
var
- 没有块级作用域的概念
- 有全局作用域、函数作用域的概念
- 没有初始化式时,值默认为:undefined
- 存在变量提升
- 全局作用域中,用var声明的变量会挂载到window对象下
- 同一作用域中允许重复声明
let
- 有块级作用域的概念
- 不存在变量提升
- 有暂时性死区——声明变量前,不允许使用该变量
- 不存在全局作用域的概念
- 同一块作用域中不允许重复声明
const
- 与let特性一样,仅有2个差别:
- 区别1:必须立即初始化,不能在后续赋值
- 区别2:常量的值不能改变
2、什么是块级作用域?
早期
JS
中作用域
有:全局/函数作用域,没有块作用域的概念,ES6中新增了块级作用域
块作用域
由{ }包裹, 声明的变量只在该代码块内有效,if/for语句里的{ }也属于块作用域- 没有块级作用域时,在if/for循环中声明的变量会泄露成全局变量,其次就是{ }中的内层变量可能会覆盖外层变量,块级作用域的出现解决了这些问题
3、JS中的数据类型
3.1、数据类型分类
- 基本(原始)数据类型7种:
a.string
b.number
c.boolean
d.undefined
e.null
f.symbol
——ES6新加,表示唯一的、不可变的数据类型,通常用于对象属性的唯一标识符
g.BigInt
——任意大小的整数,它是ECMAScript 2020+新增的 - 引用数据类型1种:
○object
——注意:Array、Function等,它们的类型的底层其实都是Object
3.2、基本数据类型和引用数据类型的区别
- 访问方式
a. 原始值:访问到的是值
b. 引用值:访问到的是引用地址 - 比较方式
a. 原始值:比较的是值
b. 引用值:比较的是地址 - 动态属性
a. 原始值:无法添加动态属性
b. 引用值:可以添加动态属性 - 变量赋值
a. 原始值:赋值的是值
b. 引用值:赋值的是地址
4、包装类型
解释:
- 普通类型之所以也能使用属性/方法,是因为这些类型在调用时,js内部自动生成了
包装对象
- 如:4.1、中的第1条里调用的一样,结束后,再将这个临时的包装对象删除
- 注意:
a. 如果给普通类型添加a.name
: “小明”是无法成功的,因为name被添加到了临时的包装对象上
,然后这个临时对象又被删除了,所以无法成功,
b. 除非是直接挂在原型对象
上的,那么才能使用这种方式添加属性
4.1、什么是包装类型(对象)
- 当基本类型以对象的方式去使用时,Js会转换成对应的包装类型
- 相当于:new了一个对象,值和基本类型设置的内容一样
- 操作完成后,这个临时的包装对象会被销毁,再访问时就是:undefined
4.2、哪些基本类型有对应的包装类型
- 回答:
a.number
数字类型
b.string
字符串类型
c.boolean
布尔值类型 - 示例:
// 解释:此时的a/b/c都是实例出的对象,所以也都可以使用对象身上的`方法`和`属性`
let a = new String("你好")
let b = new Number(99)
let c = new Boolean(false)
- 意义:
○ 因为有了基本包装类型,所以Js中的基本类型值可以被当作对象来访问。
4.3、基本类型与包装对象的关系
- 每个包装类型都映射到同名的基本类型
- 在读取模式下访问基本类型值时,就会创建:对应的基本包装类型的一个对象,方便了数据操作
- 操作基本类型值的语句一经执行完毕,就会立即销毁新创建的包装对象
5、JS中如何进行数据类型转换
- 显式(强制)转换:
a.转换为字符串
:String(value) 或 value.toString()
b.转换为数字
:Number(value) 或 parseInt(value)/parseFloat(value)
c.转换为布尔值
:Boolean(value) - 隐式(自动)转换:
a.字符串拼接
:value + ‘’
b.算术运算
:value - 0, +value
c.逻辑运算
:!!value (双重否定)