第四章 变量声明
变量声明
一、let 和 const
-
let 和 const 是 JavaScript 里相对较新的变量声明方式。 let 在很多方面与 var 是相似的,但是可以帮助大家避免在 JavaScript 里常见一些问题(如作用域提升)。 const 是对 let 的一个增强,它能阻止对一个变量再次赋值。
-
因为 TypeScript 是 JavaScript 的超集,所以它本身就支持 let 和 const。 推荐使用它们来代替 var。
-
使用最小特权原则,所有变量除了你计划去修改的都应该使用 const。
二、代码示例
//块级作用域变量的获取
function theCityThatAlwaysSleeps() {
let getCity;
if (true) {
let city = "Seattle";
getCity = function() {
return city;
};
}
return getCity();
}
//重定义及屏蔽,这个版本的循环能得到正确的结果,因为内层循环的i可以屏蔽掉外层循环的i
function sumMatrix(matrix: number[][]) {
let sum = 0;
for (let i = 0; i < matrix.length; i++) {
var currentRow = matrix[i];
for (let i = 0; i < currentRow.length; i++) {
sum += currentRow[i];
}
}
return sum;
}
//const 声明
const numLivesForCat = 9;
const kitty = {
name: "Aurora",
numLives: numLivesForCat
};
// Error
kitty = {
name: "Danielle",
numLives: numLivesForCat
};
// all "okay"
kitty.name = "Rory";
kitty.name = "Kitty";
kitty.name = "Cat";
kitty.numLives--;
三、解构
- 解构数组
//最简单的解构
let input = [1, 2];
let [first, second] = input;
console.log(first); // outputs 1
console.log(second); // outputs 2
// 交换变量
[first, second] = [second, first];
//作用于函数参数
function f([first, second]: [number, number]) {
console.log(first);
console.log(second);
}
f(input);
//数组里使用...语法创建剩余变量
let [first, ...rest] = [1, 2, 3, 4];
console.log(first); // outputs 1
console.log(rest); // outputs [ 2, 3, 4 ]
//忽略你不关心的尾随元素
let [first] = [1, 2, 3, 4];
console.log(first); // outputs 1
let [, second, , fourth] = [1, 2, 3, 4];
- 对象解构
//对象解构
let o = {
a: "foo",
b: 12,
c: "bar"
};
let { a, b } = o;
//就像数组解构,你可以用没有声明的赋值
({ a, b } = { a: "baz", b: 101 });
//你可以在对象里使用...语法创建剩余变量
let { a, ...passthrough } = o;
let total = passthrough.b + passthrough.c.length;
- 属性重命名
//你也可以给属性以不同的名字
let { a: newName1, b: newName2 } = o;
- 默认值
//默认值可以让你在属性为 undefined 时使用缺省值
function keepWholeObject(wholeObject: { a: string; b?: number }) {
let { a, b = 1001 } = wholeObject;
}
- 函数声明
//解构也能用于函数声明
type C = { a: string; b?: number };
function f({ a, b }: C): void {
// ...
}
- 展开
//将一个数组展开为另一个数组
let first = [1, 2];
let second = [3, 4];
let bothPlus = [0, ...first, ...second, 5];
//将一个对象展开为另一个对象
let defaults = { food: "spicy", price: "$$", ambiance: "noisy" };
let search = { ...defaults, food: "rich" };
//注意:如果前后对象有相同的属性,则后面的覆盖前面的