首页 > 其他分享 >ES6 NO.1( var、let 和 const 命令 )| 前端小白的的第一篇博客~

ES6 NO.1( var、let 和 const 命令 )| 前端小白的的第一篇博客~

时间:2023-04-15 19:34:02浏览次数:57  
标签:ES6 const 变量 let var obj 声明

var

var 声明的变量 存在 变量提升 即 在声明该变量之前就可以使用,值为 undefined ,其作用域为全局;

let 和 const

let 用法类似于 var ,但是所声明的变量,只在 let 命令所在的代码块内有效;

const 只能用来声明常量,一旦赋值,不能修改,故使用 const 不能只声明不赋值;

区别

var 和 let 的区别

使用 var 声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象;
使用 let 声明的变量,其作用域为该语句所在的代码块内,不存在变量提升,且相同作用域内不可以重复声明同一个变量;

let 和 const 的区别

let 声明的变量可以重新赋值,而 const 声明的是一个常量,一旦赋值就不可再变,所以声明时就要赋值;

var 存在变量提升,let 和 const 不存在;
var 可以重复声明,let 和 const 不可以;
var 声明的变量可以在函数内部全局使用;
let 和 const 有块作用域,只在语句所在的代码块起作用;
const 声明的是常量,不可以重新赋值;

暂时性死区

ES6 明确规定,如果区块中存在 let 和 const 命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

总之,在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

问题:

  1. const 声明一个对象,还可以新增对象的属性或修改对象中属性的值吗?

    答:可以,引用类型的数据实际存储的是一个引用地址,这个地址指向一个对象。不可变的只是这个地址,即不能把已声明的常量指向另一个地址,而对象本身是可变的,新增/修改属性都不会引起地址值的变化,故不会报错;

    本质:const 实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const 只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。

    拓展:已定义的对象不希望被修改,该如何做?
      1. // 使用 Object.freeze 方法冻结对象,冻结后的对象不可添加新属性(常规模式下无效,严格模式下报错)
      2. const obj = {
             name: 'xiaolonga',
             age: 18,
         }
         Object.freeze(obj);
         console.log(obj, 'obj');
         obj.age = 19; // 报错
         console.log(obj, '修改属性');
         obj.career = 'web前端工程师'; // 报错
         console.log(obj, '添加属性');
    

标签:ES6,const,变量,let,var,obj,声明
From: https://www.cnblogs.com/xiaolonga/p/17321681.html

相关文章

  • C++ 测试框架 GoogleTest 初学者入门篇 丙
    theme:channing-cyan*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/RIztusI3uKRnoHVf0sloeg开发者虽然主要负责工程里的开发任务,但是每个开发完毕的功能都是需要开发者自测通过的,所以经常会听到开发者提起单元测试的......
  • Servlet
    1.request和response的结构请求结构一个HTTP请求由以下部分组成:请求行(requestline):包含请求方法,URI和HTTP协议版本信息。请求头部(header):包含一些附加的元数据,如客户端浏览器的类型,所期望的响应内容等。消息正文(messagebody):在某些情况下,可以通过消息体传递请求参数和数据,......
  • Servlet
    Servlet关于系统架构:系统架构包括什么形式?C/S架构B/S架构1.C/S架构Client/Server(客户端/服务器)C/S架构的软件或者说系统有哪些例子QQC/S架构的特点:需要安装特定的客户端软件。C/S架构的系统优点和缺点分别是什么?优点:速度快(软件中的数据大部分都是集......
  • 常量指针 指针常量 const修饰的指针常量
    常量指针指针指向的值不可以修改,指针的指向可以修改指针常量指针指针的指向不可以修改,指针指向的值可以修改const修饰的指针常量指针指向的值和指针的指向均不可以修改指针常量和const修饰的指针常量必须初始化,而常量指针不必初始化1constint*p1;2int*constp2;//错......
  • 时序建模算法库PaddleTS技术与实践1
            ......
  • locust安装后报错:ImportError: DLL load failed while importing _greenlet: 找不到指
    需要安装msvc-runtimepipinstallmsvc-runtime这个问题很神奇,因为别人没有,按照官网上的介绍python3使用pip3installlocust就可以使用了,但是我的运行脚本就报错。为什么会出现这个问题可以参考matplotlibvscode在导入matplotlib.pyplot的时候。matplotlib报错:ImportEr......
  • 第137篇:重学ES6模块化
    好家伙, 我原本以为学完模块化之后,就能非常顺利的完成我的项目分包,然而并没有,这是非常重要的知识,而我没有学好所以我决定重学一遍 本篇为《阮一峰ECMAScript6(ES6)标准入门教程第三版》第23章"Module的语法"学习笔记  1.概述历史上,JavaScript一直没有模块(modu......
  • const
    1.使用const应该注意:const修饰的变量不能改变const必须初始化用一个对象初始化另外一个对象,则它们是不是const都无关紧要。1inti=42;2constintci=i;3intj=ci; ......
  • Servlet生命周期2
      销毁方法1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用2.调用次数:1次使用Terminal开启和关闭,就会出现destory被调用的信息 ......
  • Servlet生命周期1
    不要忘记导入这个tomcat的依赖<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><ve......