zoukankan      html  css  js  c++  java
  • 浅谈 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";

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

     

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

    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混淆,因为它们背后完全是两种不同的运行机制。 

  • 相关阅读:
    Binder机制,从Java到C (5. IBinder对象传递形式)
    Binder机制,从Java到C (4. Parcel)
    Binder机制,从Java到C (3. ServiceManager in Java)
    Binder机制,从Java到C (2. IPC in System Service :AMS)
    Binder机制,从Java到C (10. Binder驱动)
    Binder机制,从Java到C (8. ServiceManager in Native)
    Binder机制,从Java到C (7. Native Service)
    Binder机制,从Java到C (6. Binder in Native : libbinder)
    Binder机制,从Java到C (1. IPC in Application Remote Service)
    SVM详解
  • 原文地址:https://www.cnblogs.com/aspwebchh/p/7722144.html
Copyright © 2011-2022 走看看