浅谈 var 关键字
提起 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 关键字的更多相关文章
- 浅谈this关键字
在我学习this关键字的时候,通过查找资料总结出一些this的特殊用法, 供大家参考,代码里面有我总结的分析过程! 箭头函数里的this: var username = "全局"; ...
- 浅谈javascript-this关键字
前言 JavaScript中this变量是一个令人难以摸清的关键字,当初学习javascript的时候被这个this指向问题折腾的我是惨不忍睹,漏洞百出.一度想在后面的代码过程中放弃对this的使用, ...
- 浅谈Static关键字
1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...
- 浅谈Dynamic 关键字系列之三(上):ExpandoObject, DynamicObject, DynamicMetaObject
http://www.cnblogs.com/LoveJenny/archive/2011/07/05/2098578.html ExpandoObject:表示一个对象,该对象包含可在运行时动态添加 ...
- 浅谈Dynamic 关键字系列之一:dynamic 就是Object(转)
C# 4.0提供了一个dynamic 关键字,那么什么是dynamic,究竟dynamic是如何工作的呢? 从最简单的示例开始: static void Main(string[] args) { d ...
- 浅谈final关键字的用法
1.final变量: 常和static一起使用,修饰成员变量或者本地变量.修饰后为常量,不可以再次初始化(再次引用),例如public static final String SUCCESS= &qu ...
- 浅谈transient关键字
1,用途 当一个对象实现了Serilizable接口,这个对象就可以被序列化.而有时候我们可能要求:当对象被序列化时(写入字节序列到目标文件)时,有些属性需要序列化,而其他属性不需要被序列化,打个比方 ...
- 浅谈volatile关键字
volatile是一种轻量级的同步机制.它可以保证内存可见性以及防止指令重排序,但是不保证原子性 volatile和JMM机制是不可分割的,在谈volatile的时候有必要先了解以下JMM JMM(J ...
- 浅谈static关键字的四种用法
1.修饰成员变量 在一个person类中,一个成员变量例如 String name,当new2个person()对象时候,这2个对象在堆的位置是不同的,给name赋值张三.李四,这两个对象的name是 ...
随机推荐
- 201521123118《java程序与设计》第4周作业总结
1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点 1.2 使用常规方法总结其他上课内容. 为了不必要写重复的代码,可以运用继承,用关键字extends来定义一个类,被继承的类叫做父类,继 ...
- 201521123016 《Java程序设计》第2周学习总结
1. 本周学习总结 JAVA中string对象创建后不可修改. 使用StringBuilder编写代码,减少内存空间的占用. 字符串使用"+"拼接,拼接后其他类型会被转化为字符串. ...
- 201521123005 《Java程序设计》第1周学习总结
1. 本章学习总结 了解JDK/JRE/JVM,学会了如何安装JDK 学会使用控制台和eclipse上运行java代码 了解PTA提交的常见套路 http://www.cnblogs.com/zhrb ...
- Python[小甲鱼008了不起的分支和循环2]
案例:对所给的分数进行评级,以下有三种方案: score = int(input('请输入一份分数')) #第一种方案 if 100 >= score >= 90: print('A') ...
- VBScript中InStr函数的用法
InStr([start, ]str1, str2[, compare]) [用途]:返回str2在str1中的位置.匹配成功时,返回值最小值为1,未匹配到时返回0. [参数说明]: start:在s ...
- sed命令基础2
我在sed命令基础里面说了一下sed的基础用法,sed还有一些高级用法,由于我也是在学习中,写的博客可能会有想不到的地方,有问题希望大家指出. sed的高级用法主要在于两个空间的使用,模式空间和保持空 ...
- 如何用SQL实现组内前几名的输出
关于问题 如何查询组内最大的,最小的,大家或许都知道,无非是min.max的函数使用.可是如何在MySQL中查找组内最好的前两个,或者前三个? 什么是相关子查询 在提出对于这个问题的对应方法之前,首先 ...
- Oracle中Union与Union All的区别(适用多个数据库)
Oracle中Union与Union All的区别(适用多个数据库) 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或 ...
- 随便讲讲我对于svn和git的想法
1.SVN是集中式版本管理工具,而Git是分布式版本管理工具,这是核心区别. 二者都有集中的库,只是git偏向于分布式,用户可以再自己电脑上克隆一份自己的库,即使在断网的情况下也能够查看版本,创建分支 ...
- 微信开发(2)–获取access_token
一.access_token access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保 ...