在javascript中,var、let和const都可以用来声明变量,那么三者有什么区别呢?要回答这个问题,我们可以从先想想:三种不同的声明会影响变量的哪些方面?这些方面也就是变量的特性,那么变量有哪些特呢?无非就是两个:一个是变量的数据类型,是数字,字符串还是数组或者其他的,另一个就是变量的作用域,是全局的还是局部的,又或者是某个代码块的。因此我们可以从以下两个方面来探究三种声明方式的区别:

1.声明后变量的数据类型有什么不同?

2.声明后变量的作用域有什么不同?

先看第一个方面,数据类型有何不同

  1. //声明数字有何不同
  2. var n1 = 10;
  3. let n2 = 10;
  4. const n3 = 10;
  5. console.log(typeof n1); //number
  6. console.log(typeof n2); //number
  7. console.log(typeof n3); //number
  8.  
  9. //声明字符串有何不同
  10. var s1 = "hello";
  11. let s2 = "hello";
  12. const s3 = "hello";
  13. console.log(typeof s1); //string
  14. console.log(typeof s2); //string
  15. console.log(typeof s3); //string
  16.  
  17. //声明数组有何不同
  18. var arr1 = [1,2,"a"];
  19. let arr2 = [1,2,"a"];
  20. const arr3 = [1,2,"a"];
  21. console.log(typeof arr1); //object
  22. console.log(typeof arr2); //object
  23. console.log(typeof arr3); //object
  24. console.log(arr1 instanceof Array); //true,判断是否是数组
  25. console.log(arr2 instanceof Array); //true
  26. console.log(arr3 instanceof Array); //true
  27.  
  28. //声明对象有何不同
  29. var o1 = {1:"a",2:"b"};
  30. let o2 = {1:"a",2:"b"};
  31. const o3 = {1:"a",2:"b"};
  32. console.log(typeof o1); //object
  33. console.log(typeof o2); //object
  34. console.log(typeof o3); //object
  35.  
  36. ////声明后不设置初始值有何不同
  37. var u1;
  38. let u2;
  39. // const u3; //报错,const声明变量必须设置初始值
  40. console.log(typeof u1); //undefined
  41. console.log(typeof u2); //undefined
  42. // console.log(typeof u3);

可以看到,三种声明方式不管是声明数字、数组、对象都没有差别,但是在声明后不设置初始值时有一点不同,var和let可以声明后不设置初始值,而const不行。

再来看声明后作用域有何不同,先看最常见的var

  1. var a = 1;
  2. f();
  3. console.log(a); //
  4. function f() {
  5. console.log(a); //undefined
  6. var a = 10;
  7. console.log(a); //
  8. }

执行后结果为

  1. undefined
  2. 10
  3. 1

可以看到用var声明的变量在函数外声明是全局变量,在函数内声明是局部变量,只能在函数内使用,第5行console.log(a)在声明的后面,所以会打印undefined,注意这里解释器会检测到函数f内定义

了a,所以会打印undefined,如果把第6,7行注释掉,那么函数内会直接引用外部的全局变量,打印的都是1。

let是ES6中新增的命令,那么let与var有什么区别呢,来看一段代码

  1. <script>
  2. for (var i=0;i<5;i++) {
  3. console.log(i)
  4. }
  5. console.log(i)
  6. </script>
  7.  
  8. //执行结果
    0
    1
    2
    3
    4
    5
  1. {
    var i = 1;
    }
    console.log(i);
  1. 1

可以看到,这里再次证明了var声明的是全局变量,不受块级作用域(花括号)的限制。而let的作用域仅限于块级作用域

  1. {
  2. let i = 1
  3. }
  4. console.log(i); //ReferenceError: i is not defined

看到这里你大概可以想到了,let可以用于for循环,完成一些独特的功能,来看一道面试题

  1. for (var i =0;i < 10; i++) {
  2. setTimeout(function () {
  3. console.log(i);
  4. },0)
  5. }
  6.  
  7. //输出结果
  8. //10个10

如果把var改成let,结果会怎样呢

  1. for (let i =0;i < 10; i++) { //在for循环(块级作用域)内部使用,变量会被固定
  2. setTimeout(function () {
  3. console.log(i); //i是循环体内的变量,不受外界影响
  4. },0)
  5. }
  6.  
  7. //输出结果
  8. //0 1 2 3 4 5 6 7 8 9

ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

let的另一个区别是不能重复声明。

const意为constant variable,也就是固定的变量,不能被重新赋值,且需要在初始化时给其指定值,要不然会报错

  1. const b=0;
  2. b=1; //TypeError: Assignment to constant variable.
  3. console.log(b);
  4.  
  5. let hello = "hello world";
  6. console.log(hello);
    let hello = "world"; // SyntaxError: Identifier 'hello' has already been declared

总结

1. var定义的变量是全局变量,可以修改,可以重复定义,不初始化会输出undefined

2. let定义的变量仅作用于块级作用域(不受外界影响),可以修改,但不能重复定义,不初始化会输出undefined

3. const定义的变量是全局变量,不能修改,不能重复定义,不初始化会报错

javascript中var、let和const的区别的更多相关文章

  1. JS中 var,let与const的区别

    1.在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var . let . cons ...

  2. JavaScript中var和this定义变量的区别

    JavaScript中var和this定义变量的区别 在js中声明变量时可以使用var和this,但使用this的有很大一部分参考书是没有的,经过查阅相关资料总结如下: 用var和this声明变量,存 ...

  3. javascript中var let const三种变量声明方式

    javascript中var let const三种变量声明方式 1.var  ①var表示声明了一个变量,并且可以同时初始化该变量. ②使用var语句声明的变量的作用域是当前执行位置的上下文:一个函 ...

  4. JavaScript中值类型和引用类型的区别

    JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...

  5. JavaScript中object和Object有什么区别

    JavaScript中object和Object有什么区别,为什么用typeof检测对象,返回object,而用instanceof 必须要接Object呢 ————————————————————— ...

  6. JavaScript中=、==、===以及!=、!==的区别与联系

    JavaScript中=.==.===以及!=.!==的区别与联系   在JavaScript中,“=”代表赋值操作:“==”先转换类型再比较,“===”先判断类型,如果不是同一类型直接为false. ...

  7. var和let/const的区别

    let和const是 ES6 新增的命令,用于声明变量,这两个命令跟 ES5 的var有许多不同,并且let和const也有一些细微的不同,再认真阅读了阮一峰老师的文档后,发现还是有一些不知道的细节. ...

  8. JavaScript中var、let和const的区别(转载)

    一.前言 在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var . let . c ...

  9. javascript中var、let、const的区别

    这几天修改别人的js,发现声明变量有的用var,有的用let,那它们有什么区别呢? javascript中声明变量的方式有:var.let.const 1.var (1)作用域: 整个函数范围内,或者 ...

随机推荐

  1. 【Gym - 100812G 】Short Path (SPFA)

    BUPT2017 wintertraining(15) #7B 题意 n个点m条无向有权边(2 ≤ n ≤ 10^5, 1 ≤ m ≤ 10^5),每个点标记了0或1,求所有1中,最近的两个1的下标及 ...

  2. Django进阶-auth集成认证模块

    auth认证模块是Django内置集成的一个用户认证模块. auth认证模块方法 方法 释义 auth.authenticate() 认证校验 auth.login(request,user) 封装认 ...

  3. 关于360插件化Replugin Activity动态修改父类的字节码操作

    近期在接入360插件化方案Replugin时,发现出现崩溃情况. 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find c ...

  4. 【BZOJ5336】[TJOI2018]party(动态规划)

    [BZOJ5336][TJOI2018]party(动态规划) 题面 BZOJ 洛谷 题解 这题好神仙啊... 考虑普通的\(LCS\)的\(dp\),\(f[i][j]=\max\{f[i-1][j ...

  5. centos7/centos6修改系统默认语言

    应用环境: 一直在使用centos7.x,系统默认的语言也是英文环境,工作内容偶遇中文,顺便搜罗修改一番,小记如下. 测试环境: 测试步骤: CentOS 7.x 1. 查看当前语言环境 [root@ ...

  6. macOS在virtualenv中使用wxPython报错

    在虚拟的Python环境中运行GUI的软件报错 This program needs access to the screen. Please run with a Framework build o ...

  7. 解决VS2012 服务器资源管理器中的表拖不到Linq to sql中

    找到C:\Program Files (x86)\Common Files\microsoft shared\Visual Database Tools\dsref80.dll 这个dll文件: 在其 ...

  8. 高DPI下界面错乱的解决方法和原理

    来源: http://bbs.csdn.net/topics/370177760 我在win32 + c写的界面中解决办法,就是把字体的字号给固定了,这样做的结果就是,不管dpi是否有改变,界面中控件 ...

  9. 判断JDK安装成功的方法

    JDK安装成功之后,主要是要写入环境变量

  10. PHP和PHP-FPM 配置文件优化

    前言:乘着这次空闲,来记录下关于PHP和PHP-FPM配置文件的优化,也方便以后自己复习. 先说PHP的 1.PHP脚本执行时间 max_execution_time = 30 该选项设定PHP程序的 ...