学过 ES6,都知道两个声明方式:let
和 const
。
因为时讲到 TypeScript 。这里还是要着重讲一下这两个变量声明。
let
声明
let
声明和我们常用的 var
声明很相似,当然也有一些不同。
let
声明变量只在块级作用域起作用,适合在for循环使用。也不会出现变量提升现象。同一个代码块内,不可重复声明相同的变量。不可重复声明函数内的参数。
举几个例子吧;
先说一下什么是块级作用域:
任何一对花括号( {} )中的语句都属于一个块,在花括号里面用
let
定义的所有变量在花括号外都是不可见的,我们称之为块级作用域。
var arr = [];
for(var i=0;i<10;i++){
arr[i] = function(){
return i;
}
}
console.log(arr[0]); //10;
console.log(arr[8]); //10;
var job = [];
for(let j=0;j<10;j++){
job[j] = function(){
return j;
}
}
console.log(job[0]); //0;
console.log(job[8]); //8;
const
声明
常量声明,就像它的名字所表达的,它们被赋值后不能再改变。
解构
结构数组
最简单的解构莫过于数组的解构赋值了:
let input = [1, 2];
let [first, second] = input;
console.log(first); // 1
console.log(second); // 2
对象解构
你也可以解构对象:
let o = {
a: "foo",
b: 12,
c: "bar"
};
let { a, b } = o;
属性重命名
你也可以给属性以不同的名字:
let { a: newName1, b: newName2 } = o;
这里的语法开始变得混乱。 你可以将 a: newName1
读做 “a
作为 newName1
“。 方向是从左到右,好像你写成了以下样子:
let newName1 = o.a;
let newName2 = o.b;
令人困惑的是,这里的冒号不是指示类型的。 如果你想指定它的类型, 仍然需要在其后写上完整的模式。
let {a, b}:{a: string, b:number} = 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];
这会令bothPlus
的值为[0, 1, 2, 3, 4, 5]
。 展开操作创建了 first
和second
的一份浅拷贝。 它们不会被展开操作所改变。
你还可以展开对象:
let defaults = { food: "spicy", price: "$$", ambiance: "noisy" };
let search = { ...defaults, food: "rich" };