• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
社会优先于个人
博客园    首页    新随笔    联系   管理    订阅  订阅
3.3 变量

变量

  • ES的变量是松散类型的,可以保存任何类型的数据
  • 每个变量只不过是一个保存任意值的命名占位符
  • 三个关键字,可以声明变量。let,const, var
  • let, const 只能在es6 和之后版本使用

var关键字

  • 不初始化的话,变量会保存一个undefined值
  • var声明作用域:在一个函数内部定义一个变量,它的作用域就是这个函数。如果没有加var,就是全局变量,但是不推荐在函数局部作用域通过省略var来定义全局变量。
  • 如果要定义多个变量,可以在一条语句中加逗号。
  • var声明提升:把所有变量声明拉到函数作用域顶部。
  • 可以重复声明一个变量。
  • 全局作用域声明的变量是window对象的属性

let声明

  • 作用域是块作用域
  • 同一个作用域中,不可以重复声明一个变量。
  • let 和var 混用,还是不可以重复声明一个变量。
  • 不能变量提升。造成变量声明之前的代码执行叫做暂时性死区,如果引用了变量,就会报错。
  • 全局作用域声明的变量不是window对象的属性

for循环

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

  • 输出的是5,5,5,5,5。因为在退出循环时,迭代变量保存的是导致循环退出的值。
for(let i=0;i<5;++i){
	setTimeout(()=>{
	console.log(i)
	},0)

  • 输出的是0,1,2,3,4。因为每次迭代声明一个独立变量,每个setTimeout引用的都是不同的变量。

const

  • 声明时必须初始化
  • 修改常量会报错
  • 其他和let相同,比如不能重复声明,块作用域
  • 不能在for循环中,作为迭代变量,因为迭代变量会变化。如下会报错
for(const i=0;i<5;++i){
	setTimeout(()=>{
	console.log(i)
	},0)

  • const可以声明一个不会被修改的循环变量。每次迭代会创建一个新变量。
for(const key in {a:1,b:2}){
}
for(const value of [1,2,3]){
}
//for in 主要用于遍历对象。for of主要用于遍历数组。

声明风格

  • 尽量使用let和const,不要使用var
  • 优先使用const,let次之:能够迅速发现因意外赋值导致的非预期行为
posted on 2022-04-28 13:31  社会优先于个人  阅读(35)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3