从C#到TypeScript - 变量

从C#到TypeScript - 变量

TypeScript的变量声明和ES6差不多,相比之前主要是多了letconst

为什么不用var

不管是TypeScript还是ES6都会兼容以前的javascript,所以在TypeScript里var也还是保留了。 虽然C#里也有var,但和JavaScript的可不一样,var在javascript里会有一些奇怪的表现,比如会置前,而且作用域是整个函数,可以不写var来声明变量,然后变量变成全局。 这些都可能会带了一些不容易注意到的问题。 比如经典的:

for (var i = 0; i < 10; i++) {
    setTimeout(function() { console.info(i); }, 100);
}

结果并不是期望的0, 1, 2, 3...,跑出来的结果全是10,这是因为var出来的i的作用域是整个函数。 这就导致循环完成后i变成10,setTimeout内的函数才被执行,所以结果都是10了。 虽然可以用立即完成函数把重新构建一个作用域,但毕竟用起来麻烦,而且不符合人的思维,所以就有了let

使用let声明变量

let主要是对var的一个代替,用let更符合人思考的过程,这才和C#var的功能是差不多。 let的用法和var是一样的:

let str = 'string';

let的作用域是块级作用域,比如上面的循环,用let声明i的话就可心得到期望的值

for (let i = 0; i < 10; i++) {
    setTimeout(function() { console.info(i); }, 100);
}

这里得到的结果就是0, 1, 2....9。 所以建议还是抛弃var,选择let

const

C#也有const,意义上差不多,都是常量,不想变量被改变。

const str = 'string';
str = 'new string'; // 编译不了

一般情况下,主张确定不变的变量用const声明来增加代码健壮性和可读性。

解构

所谓解构,就是把对象或数组里的成员分解出来。 比如数组:

let [first, second] = [1, '2', false];
console.info(`first: ${first}`);

这里就把数组的第一个成员和第二个成员分别用firstsecond解构出来,就省去了分别声明两个变量,并用下标取数组里的值来赋值了。 这也可以方便的提供一些功能,比如交换数组里的两个值,按以前的做法需要借助下中间变量,现在就不需要了:

let [first, second] = [second, first];

可以利用...扩展符号来解开数组,再并入其他数组。

let arr = [1, 2, 3];
let newArr = [...arr, 4, 5];
console.info(newArr); // 1, 2, 3, 4, 5

对象同样可以被解构:

class Test{
    str = "string";
    int = 1;
    bool = false;

    func(){
        console.info('func');
    }
}
let {str, bool, func} = new Test(); //名字必须和类里的保持一致
let {str: newStr} = new Test(); //通过这种方式可以把str改为newStr
console.info(`${str}, ${bool}`);
func();

...符号同样可以用于对象,不过只能解开可枚举的变量,所以函数不会解出来。 延用上面的class:

let {str, ...other} = new Test();
console.info(other.int); // 输出1
console.info(other.func()); // 编译错误,...符号不能解出函数

还可以加上默认值,当解出来的值是undefined时会用上默认值

class Test{
    empty;
    str = '';
}
let {empty='empty', str='str'} = new Test();
console.info(`${empty}, ${str}`); // 输出 empty, ,因为str有值,所以用原始的''

以上就是常用的变量声明及赋值的使用方法,不过基本都是ES6的标准语法,TypeScript本身并没有在上面多做什么。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ml

c语言格式大整理

1、C语言中,非零值为真,真用1表示;零值为假,假用0表示。 2、转义字符参考: \a 蜂鸣,响铃  \b 回退:向后退一格 ...

5557
来自专栏行者常至

003.golang 类型与变量

零值并不等于空值,而是当变量被声明为某种类型后的默认值, 通常情况下值类型的默认值为0,bool为false,string为空字符串

882
来自专栏行者常至

001.python科学计算库numpy(上)

版权声明:本文为博主原创文章,允许转载,请标明出处。 https://blog.csdn.net/qwdafedv/article/deta...

1002
来自专栏Script Boy (CN-SIMO)

Qt Quick编程(1)——QML的核心部分ECMAScript

说道QML,不得不先说一下ECMAScript: ECMAScript语言的标准是由Netscape、Sun、微软、Borland等公司基于JavaScript...

4700
来自专栏Python研发

JavaScript

JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应的代码,浏览器可以解释...

1522
来自专栏Python研发

go基础编程 day-2

  零值并不等于空值,而是当变量声明为某种来兴后的默认零值,通常情况下默认值为0,bool为false,string为空字符串。

1132
来自专栏恰童鞋骚年

剑指Offer面试题:3.替换空格

  在网络编程中,如果URL参数中含有特殊字符,如空格、'#'等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的...

832
来自专栏黑泽君的专栏

java基础学习_基础语法(上)03_day04总结

============================================================================= ==...

1051
来自专栏学海无涯

14.闭包

1031
来自专栏HTML5学堂

获取对象具体类型的功能函数

HTML5学堂:JavaScript当中,时常会使用到typeof来进行数据类型的检测,但是我们觉得typeof不能够满足我们的需求,对于数组、函数、时间对象等...

3287

扫码关注云+社区

领取腾讯云代金券