浅谈 var 关键字

提起 var关键子,程序员的第一反应就是JavaScript, 事实上这个关键子在其他语言中也有被采用。

比如说C#, 比如说kotlin, 用法和JavaScript中使用差不多,作为要声明变量的前缀

var myInt = 1;

var myList = new List<String>();

var myValue = getValue();

在其他语言中也有与var作用类似的关键字,比说C++中的auto,比如TypeScript中的let,比如kotlin中的val

auto myInt = 1;

let myValue = getValue();

val myString = "kotlinlanguage"

var以及与其同意的关键字被使用的如此广泛,看起来用这些关键字的代码都长一个样, 然而, JavaScript中的var关键字与其它语言中的var关键字有本质的不同。

在JavaScript中,var关键字最重要的作用是控制变量的作用域, 其中细节我们不在这里讲解,除此之外,它最大的作用可能就是使代码美观而已。

而在其它语言中, 这个关键之是大大的有门道, 在这些语言中,这个关键字背后有一项称之为“类型推导”的技术支持着这个关键字的运行。

在Java语言中,我们常常这样写代码。

Integer myInt = 1;

String strSql = "select * fromtableName";

在声明一个变量时, 都会在变量名前加上这个变量的类型信息, 编译器是通过这个类型批注来判断变量类型的,如果代码中有对变量进行不符合类型规范的操作,编译器就会报错, 这便是静态类型语言代码不易出错的基础。

这样写表面上看起来挺和谐, 但如果是这样的代码呢

不要怀疑,比这更加操蛋的代码都有。 声明这个变量会耗费我们不少时间,我们要仔细检查语句两边的类型是否一致。var关键字, 确切的说是类型推导技术, 可以简化这条语句。

代码变得简洁,而且编译器通过类型推导技术可以确定myList的类型就是

ArrayList<TreeMap<String,HashMap<String,ArrayList<String>>>>

而不用通过变量前面那一长串长长的类型批注信息来确定。

再来一个更加明显的, 代码如下

在不带类型推导机制的语言里, 调用这个函数需要这样写

你不得不根据这个函数的返回值写一串长长的类型代码, 而且, 当这个函数的返回值改变时,这个变量前面的类型批注也要跟着变,假如这个函数被调用一百次,那么修改这些调用代码将是一件异常头疼的事情,当然,你可以借助IDE的能力来批量转换,但这属于外力, 有种横冲直撞使用蛮力的味道。

如果使用类型推导技术,这个问题能被很好的解决,甚至于这根本不是个问题。

var myList = getMyList();

var myList1 = getMyList();

var myList1 = getMyList();

不但代码简短,而且没有类型依赖。 可惜这么好的特性,宇宙第一的Java居然不支持,令人遗憾。 所幸, Java以外的其它主流静态类型编程语言都已经支持。如上面所说, C++的auto, C#的var,kotlin的var和val,都有类型推导的功能。

而JavaScript中的var关键字却和类型推导没有半毛钱关系,甚至JavaScript代码根本没有类型一说, JavaScript的类型都是在运行期确定的,那个时候的JavaScript已经不再是我们所看到的JavaScript代码。

所以说, 当我们在其它语言中见到var关键字的时候,千万不要把他们和JavaScript中的var混淆,因为它们背后完全是两种不同的运行机制。

原文发布于微信公众号 - 带你撸出一手好代码(gh_afab56b37671)

原文发表时间:2017-10-20

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏带你撸出一手好代码

JavaScript对象的呼叫转移

声明:此文以通俗易懂的模式讲解JavaScript语言中call、apply运行原理。 非业内人士或未成年人请点左上角按扭及时离开以避免走火入魔。 事实上类似于...

33260
来自专栏程序员笔记

读书「重构」

15720
来自专栏HappenLee的技术杂谈

C++雾中风景9:emplace_back与可变长模板

emplace_back方法最大的改进就在与可以利用类本身的构造函数直接在内存之中构建对象,而不需要调用类的拷贝构造函数与移动构造函数。

9520
来自专栏take time, save time

你所能用到的数据结构之番外篇---逆袭的面向对象(一)

     对于番外篇,我深刻能明白在大多数人眼里就和电视剧的广告一样,说实话,我也不喜欢这种感觉,因为这样会让人觉得是在欺骗消费者啊~~~阿西巴~~~但是我实在...

35380
来自专栏架构之路

索引优先队列-IndexedPrirotyQueue的原理及实现(源码)

1.索引优先队列的意义 索引优先队列是一个比较抽象的概念,它是一个优先队列,又带有索引,这个索引是用来干什么的呢? 在正常的队列中,我们只能访问队列头元素,整个...

49180
来自专栏C语言及其他语言

【编程经验】printf专题:你可能不知道的printf用法【文末有福利】

你可能不知道的printf用法 ? 不少小伙伴反映C语言只会用printf函数,但一些参数、返回值什么的还不了解,所以今天总结一二,给大家总结和梳理一下...

29980
来自专栏微信公众号:Java团长

Java开发中如何正确踩坑

之前在这个手册刚发布的时候看过一遍,当时感觉真是每个开发者都应该必读的一本手册,期间还写过一篇关于日志规约的文章:《下一个项目为什么要用 SLF4J》,最近由于...

11640
来自专栏拂晓风起

java HashMap 极限容量 大小限制 占用内存大小

21840
来自专栏大闲人柴毛毛

剑指 offer代码解析——面试题32统计1到n中1出现的次数

本题的分析过程均在代码注释中: /** * 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 * @author 大闲人柴毛毛 * ...

37860
来自专栏猿人谷

[你必须知道的.NET] 第四回:后来居上:class和struct

本文将介绍以下内容: • 面向对象基本概念 • 类和结构体简介 • 引用类型和值类型区别 1. 引言 提起class和struct,我们首先的感觉是语法几乎相...

195100

扫码关注云+社区

领取腾讯云代金券