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

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

var myInt = ;
var myList = new List<String>();
var myValue = getValue();

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

auto myInt = ;
let myValue = getValue();
val myString = "kotlinlanguage"

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

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

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

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

Integer myInt = 1;
String strSql = "select * fromtableName";

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

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

List<Map<String,Map<String,List<String>>>> myList = new ArrayList<TreeMap<String,HashMap<String,ArrayList<String>>>>();

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

var myList = new ArrayList<TreeMap<String,HashMap<String,ArrayList<String>>>>();

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

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

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

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

private List<Map<String,Map<String,List<String>>>> getMyList() {
// dosomething
return new ArrayList<TreeMap<String,HashMap<String,ArrayList<String>>>>(); }

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

List<Map<String,Map<String,List<String>>>> myList =  getMyList();

你不得不根据这个函数的返回值写一串长长的类型代码, 而且, 当这个函数的返回值改变时,这个变量前面的类型批注也要跟着变,假如这个函数被调用一百次,那么修改这些调用代码将是一件异常头疼的事情,当然,你可以借助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混淆,因为它们背后完全是两种不同的运行机制。

浅谈 var 关键字的更多相关文章

  1. 浅谈this关键字

    在我学习this关键字的时候,通过查找资料总结出一些this的特殊用法, 供大家参考,代码里面有我总结的分析过程! 箭头函数里的this: var username = "全局"; ...

  2. 浅谈javascript-this关键字

    前言 JavaScript中this变量是一个令人难以摸清的关键字,当初学习javascript的时候被这个this指向问题折腾的我是惨不忍睹,漏洞百出.一度想在后面的代码过程中放弃对this的使用, ...

  3. 浅谈Static关键字

    1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...

  4. 浅谈Dynamic 关键字系列之三(上):ExpandoObject, DynamicObject, DynamicMetaObject

    http://www.cnblogs.com/LoveJenny/archive/2011/07/05/2098578.html ExpandoObject:表示一个对象,该对象包含可在运行时动态添加 ...

  5. 浅谈Dynamic 关键字系列之一:dynamic 就是Object(转)

    C# 4.0提供了一个dynamic 关键字,那么什么是dynamic,究竟dynamic是如何工作的呢? 从最简单的示例开始: static void Main(string[] args) { d ...

  6. 浅谈final关键字的用法

    1.final变量: 常和static一起使用,修饰成员变量或者本地变量.修饰后为常量,不可以再次初始化(再次引用),例如public static final String SUCCESS= &qu ...

  7. 浅谈transient关键字

    1,用途 当一个对象实现了Serilizable接口,这个对象就可以被序列化.而有时候我们可能要求:当对象被序列化时(写入字节序列到目标文件)时,有些属性需要序列化,而其他属性不需要被序列化,打个比方 ...

  8. 浅谈volatile关键字

    volatile是一种轻量级的同步机制.它可以保证内存可见性以及防止指令重排序,但是不保证原子性 volatile和JMM机制是不可分割的,在谈volatile的时候有必要先了解以下JMM JMM(J ...

  9. 浅谈static关键字的四种用法

    1.修饰成员变量 在一个person类中,一个成员变量例如 String name,当new2个person()对象时候,这2个对象在堆的位置是不同的,给name赋值张三.李四,这两个对象的name是 ...

随机推荐

  1. 201521123003《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  2. 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址

    32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...

  3. linux crontab设置定期执行脚本

    Linux下crontab命令的用法 任务调度的crond常驻命令crond 是linux用来定期执行程序的命令.当安装完成操作系统之后,默认便会启动此任务调度命令.crond命令每分锺会定期检查是否 ...

  4. temp-存储过程 以前的

    ---------------------------------------------------------------------------------------------------- ...

  5. Bootstrap Table急速完美搭建后台管理系统

    Bootstrap Table是基于 Bootstrap 的 jQuery 表格插件,通过简单的设置,就可以拥有强大的单选.多选.排序.分页,以及编辑.导出.过滤(扩展)等等的功能:http://bo ...

  6. 来自projecteuler.net网站的练习题2

    0.题目如下: Each new term in the Fibonacci sequence is generated by adding the previous two terms. By st ...

  7. Eclipse dynamic web project 插件

    下载了Eclipse Oxygen   发现没有Dynamic web  Project 首先我们先了解下Dynamic  Web Project  If you want to create a c ...

  8. angular学习笔记01

    angular.js路由功能 用于实现单页应用 //html 代码 <div ng-view></div> //js代码 angular.module('myM1',['ng' ...

  9. 01背包java实现(入门到精通)

    一.什么是01背包 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn.01背包是背包问题中最简单的问题.01背包的约束条件是给定 ...

  10. 用python爬虫爬取去哪儿4500个热门景点,看看国庆不能去哪儿

    前言:本文建议有一定Python基础和前端(html,js)基础的盆友阅读. 金秋九月,丹桂飘香,在这秋高气爽,阳光灿烂的收获季节里,我们送走了一个个暑假余额耗尽哭着走向校园的孩籽们,又即将迎来一年一 ...