TypeScript基础-变量声明var let const

709 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

变量声明

let和const和es6中的一样,就不过多陈述其概念,这边以这两着和var之间的区别进行陈述。

  • var

1.函数作用域,在函数中声明的变量,整个函数内都是有效,但函数外不能使用。
2.有个变量提升的特性,就是可以先使用后声明。
3.并且var定义的变量可以重复定义。 4.如果是在浏览器上运行,并且是在全局作用域下定义的var变量会放到window对象上。

  • let

1.块作用域,一般指{}之间的语句,如函数、try/catch、if{}等语句中声明的变量,其外部不能使用,如if语句中声明的let变量if外不能使用,但是用var声明就可以使用。相对函数作用域值针对函数内而言更广泛。
2.严格上是有变量提升的,但是和var不同,它多出了一个暂时性死区的概念,就是说在作用域中会提前创建let定义的变量,但因此时还未进行词法绑定,所以是不能被访问的,不然就报错,到能访问的还是,这之间的过程就叫做暂时性死区,对使用着来说是和没有提升一样,但是在语法解释上是有提升的,只是不让用。
3.在一个作用域下不可以重复定义。 4.不会放到window对象上。

  • const 和let基本一样,只是有部分区别

1.const声明的变量必须立即初始化。
2.不能给const声明的变量重写赋值,那为什么const定义的数组可以再给里面添加数据呢?其实不能改变的是变量在内存中的那个地址, 普通的类型number、string等的值就在这个地址上,改值就是改地址,像对象数组,这些的值就没再地址上,地址上保存的只是一个指针,就可以改它的对象内部数据结构。

// var变量提升,可以在声明前使用
console.log(a); // 成功,可以使用
var a: string = '小明';

//let不能在声明之前使用
let c:string = 'dd';
{ 
    console.log(c); // 报错, 在作用域中c变量未声明前使用c,它用的是下方c。
    let c: string = '22'; 
}

// 全局作用域下定义的var变量会放到window对象
var d: string = '小明';
console.log(window.d) //小明

// 函数作用域
function getPersonName() {
  var f:string = "小明";
  let g:string = "小红";
  return function() {
     // 函数作用域中let和var定义的变量在整个作用域中都可以使用
     console.log(`我和${f}${g}`)
  }
}
console.log(f); // 错误,当前作用域没有定义
console.log(g); // 错误,当前作用域没有定义
getPersonName()(); // 我和小明、小红

// 块作用域
if(true) {
  var h:string = "小明";
  let i:string = "小红";
}
console.log(f); // 小明
console.log(g); // 错误,当前作用域没有定义

// 重复定义
var j:string = "小明";
var j:string = "小红"; // 不报错

let l:string = "小明";
let l:string = "小红"; // 报错已经定义了

//const 定义的变量不能修改
const m: string = "小明";
m = "小红"; // 报错
const n: string[] = [];
n.push("小明"); // 不报错
n = ["小明"]; // 报错 修改了内存中的指针地址

注意:开发过程中能用const就用const,不能用就用let,尽量不用var。