从浅入深学习TypeScript,通俗易懂——变量声明
- 一、TypeScript是什么?
- 二、使用步骤
- 1.var 声明
- 作用域规则
- 捕获变量怪异之处 *(常见面试题)
- 变量提升
- let 声明
- 块作用域
- 重定义及屏蔽
- 块级作用域变量的获取
- let vs. const
- 解构数组
- 对象解构
- 属性重命名
- 总结
一、TypeScript是什么?
TypeScript 是 JavaScript 的类型的超集,它可以编译成纯 JavaScript。编译出来的 JavaScript 可以运行在任何浏览器上。TypeScript 编译工具可以运行在任何服务器和任何系统上。TypeScript 是开源的。
TypeScript 增加了代码的可读性和可维护性
类型系统实际上是最好的文档,大部分的函数看看类型的定义就可以知道如何使用了
可以在编译阶段就发现大部分错误,这总比在运行时候出错好
增强了编辑器和 IDE 的功能,包括代码补全、接口提示、跳转到定义、代码重构等
TypeScript 非常包容
TypeScript 是 JavaScript 的超集,.js 文件可以直接重命名为 .ts 即可
即使不显式的定义类型,也能够自动做出类型推论
TypeScript 的类型系统是图灵完备的,可以定义从简单到复杂的几乎一切类型
即使 TypeScript 编译报错,也可以生成 JavaScript 文件
兼容第三方库,即使第三方库不是用 TypeScript 写的,也可以编写单独的类型文件供 TypeScript 读取
二、使用步骤
1.var 声明
作用域规则
var作用域或函数作用域
函数参数也使用函数作用域
坏处:
- 多次声明同一个变量并不会报错
例子:
function f(shouldInitialize: boolean) {
if (shouldInitialize) {
var x = 10;
}
return x;
}
// 变量 x是定义在*if语句里面*,但是我们却可以在语句的外面访问它
// 因为 var声明可以在包含它的函数,模块,命名空间或全局作用域内部任何位置被访问
f(true); // returns '10'
f(false); // returns 'undefined'
捕获变量怪异之处 *(常见面试题)
for (var i = 0; i < 10; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}
// 打印输出
// setTimeout的每一个函数表达式实际上都引用了相同作用域里的同一个i
10
10
10
10
10
10
10
10
10
10
上述情况解决方案: 立即执行函数
for (var i = 0; i < 10; i++) {
// capture the current state of 'i'
// by invoking a function with its current value
(function(i) {
setTimeout(function() { console.log(i); }, 100 * i);
})(i);
}
变量提升
先使用变量稍后再声明变量而不会引发异常。提升后的变量将返回 undefined 值。
/**
* 例子1
*/
console.log(x === undefined); // true
var x = 3;
/**
* 例子2
*/
// will return a value of undefined
var myvar = "my value";
(function() {
console.log(myvar); // undefined
var myvar = "local value";
})();
let 声明
块作用域
词法作用域或块作用域,块作用域变量在包含它们的块或for循环之外是不能访问的。
块级作用域的变量的另一个特点是,它们不能在被声明之前读或写。这些变量始终“存在”于它们的作用域里,但在直到声明它的代码之前的区域都属于 暂时性死区
重定义及屏蔽
块级作用域变量需要在明显不同的块里声明。
块级作用域变量的获取
let vs. const
const 声明是声明变量的另一种方式。
与let声明相似,但是就像它的名字所表达的,它们被赋值后不能再改变。 换句话说,它们拥有与 let相同的作用域规则,但是不能对它们重新赋值。引用的值是不可变的(基础数据类型的值不会改变,引用类型的引用地址不会改变,地址中的值可以改变)。
解构数组
let [first, ...rest] = [1, 2, 3, 4];
console.log(first); // outputs 1
console.log(rest); // outputs [ 2, 3, 4 ]
对象解构
let o = {
a: "foo",
b: 12,
c: "bar"
};
let { a, b } = o;
a // 'foo'
b // 12
属性重命名
let o = {
a: "foo",
b: 12,
c: "bar"
};
let { a: newName1, b: newName2 } = o;
newName1 // 'foo'
newName2 // 12
总结
good night