一、Number类型
二、字符串类型
三、数组
let list: number[] = [1, 2, 3]
let list2: Array<number> = [4, 5, 6]
元组:
let x: [string, number]
x = ['hello', 30]
元组在ts3.0之后就不准越界访问了,比较合理。比如本来只有2个元素,你却访问第三个元素。
// 数组
let arrayOfNumbers: number[] = [1, 2, 3]
let t1: Array = [1, 2]
function test(a, b, c) {
// 这里的arguments就是一个类(不是真的,是类似)数组
// 具备数组的某些特性,但是很多数组api,他又没有
// 没有forEach方法,也不能将数组赋给arguments
console.log(arguments)
}
test(5,6,7)
// 假如第一项是数字,第二项是字符串,这个要用元组, 合并了不同类型的数组
let user: [string, number] = [‘s’, 20]
四、变量声明
4.1 var
function f() {
var a = 10
return function g() {
var b = a + 1
return b
}
}
var g = f()
console.log(g()) // 11 闭包
function f(shouldInitialize) {
if (shouldInitialize) {
var x = 10
}
return x
}
console.log(f(true)) // 10
console.log(f(false)) // undefined
等价于
function f(shouldInitialize) {
var x
if (shouldInitialize) {
x = 10
}
return x
}
function sumMatrix(matrix) {
var sum = 0
for (var i = 0; i < matrix.length; i++) {
var currentRow = matrix[i]
for (var i = 0; i < currentRow.length; i++) {
// 重新定义了i,会覆盖上层的i,内层循环到3以后i不再满足外层循环条件
// 需要重新用个变量j,不要再用i了
sum += currentRow[i]
}
}
return sum
}
var matrix = [
[1,2,3],
[4,5,6]
]
console.log(sumMatrix(matrix)) // 6
function f() {
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i)
}, 1000)
}
}
f()
会输出10个10,也就是i循环 完之后是10,最后的i全是10,并不是想象中的从0、1…开始,每次循环都要创建一个定时器,因为JS是单线程,等到队列中的定时器执行的时候,i已经是10了,有个解决方案就是即时执行,就是利用了闭包的缓存,避开了单线程带来的直观现象
修改如下,即时执行
function f() {
for (var i = 0; i < 10; i++) {
(function(j) {
setTimeout(function() {
console.log(j)
}, 1000)
})(i)
}
}
f()
4.2 let
扫描二维码关注公众号,回复:
14334540 查看本文章
把var换成let就行了,let和var大不相同,直接解决了问题,每次循环,let都重新创建了变量环境,都是新的作用域。效果等同于即时执行。
let input: [number, number] = [1, 2]
function f([first, second]: [number, number]) {
console.log(first, second)
}
f(input)
上图中,等价于:
let {
a: newA, b: newB} = o
等价于
let newA = o.a
let newB = o.b
仅仅只是相当于重新定义了两个变量,改变newA并不会修改o.a的值