在上一篇:基础变量中我们在声明变量时使用了关键字let
,这和JS中的var
有点类似。
语法
基本语法:let 变量名:类型。当然类型不是必须的。
let x:number;
let y:string = 'xx';
let z;
z = 'xxx';
var
var和let最大区别就是作用域不同,let有严格的块作用域。
- 1 我们都知道,js中的作用域不是很严格。比如下面代码:
flag = true;
if (flag) {
var msg = 'I am OK';
}
console.log(msg); // I am OK
在js中变量msg仍然可以输出I am OK
,甚至变量flag
不适用关键字也可声明。
- 再举一个关于闭包的例子,如下:
for (var i = 0; i < 10; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}
输出结果则是:10个10。
- 3 重复定义和变量提升
var x = 10;
var x = 20;
在js中连续声明同一个变量是不会报错的,我们只会得到最后声明的。
- 4 变量提升
a++;
var a';
变量提升在js中也很常见,解释器解析时会先遍历变量声明,然后将其提升到函数最上面,所以上面的写法完全没有问题
以上这些问题经常在review时漏洞,引发无穷的麻烦。很多团队中也禁止出现这种代码,就是防止潜在的风险。现在有了let
我们再也不用担心这方面的问题了。
let
和var
相比,let
是块作用域。 块作用域变量在包含它们的块或for循环之外是不能访问的。
for (let i = 0; i < 10; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}
输出结果:从0到9
flag = true;
if (flag) {
let msg = 'I am OK';
}
console.log(msg); // 编译报错
var x = 10;
var x = 20; // 编译报错
a++;
var a'; // 编译报错
var
和let
区别
- 作用不同,let是有严格的块作用域
- 在块中,不能重复声明,要先声明后使用,这和java这种强类型语言一样
const声明
const是对let的一个增强,它能阻止对一个变量再次赋值。类似java中的final.
const msg = "This is a message";
msg = "xx" // 编译报错
const person = {
name: "Aurora",
age: 20
}
person = {}; // 编译报错
person.name = "tom" // OK
person.age = 10 // OK
对于对象,我们可以改变对象内部属性的值,但是不能改变对象引用(不确切地说是对象地址)