首页 > 其他分享 >js中的小小细节

js中的小小细节

时间:2024-11-06 16:17:29浏览次数:6  
标签:小小 const 变量 作用域 数据类型 js 细节 let 声明

let与var的区别可以清晰地归纳为以下几点:

  1. 作用域不同

    • var 是函数作用域,即在函数内部声明的 var 变量,整个函数内部都是有效的。它也可以被声明在全局作用域中,此时整个脚本都可以访问到这个变量。
    • let 是块作用域,它被声明在代码块(如 if 语句、for 循环等)内,并且只在该代码块内有效。一旦出了这个块,变量就无法被访问。
  2. 变量提升

    • 使用 var 声明的变量会发生变量提升,即变量会被自动“提升”到它们所在作用域的顶部,但赋值部分不会提升。这意味着变量可以在声明之前被引用,此时它的值是 undefined
    • let 声明的变量不存在变量提升。如果在声明之前尝试访问 let 变量,JavaScript 会抛出一个错误,处于暂存死区(Temporal Dead Zone, TDZ)的状态。
  3. 重复声明

    • 在同一个作用域内,可以使用 var 重复声明同一个变量,此时后续的声明会覆盖前面的声明,而不会引发错误。
    • 在同一个作用域内,不能使用 let 重复声明同一个变量,否则会抛出 SyntaxError 错误。如果在全局和局部都声明了同一个变量那么全局变量会被覆盖。
  4. 全局对象属性

    • 在全局作用域中使用 var 声明的变量会成为全局对象(在浏览器中是 window)的属性。
    • let 在全局作用域中声明的变量不会成为全局对象的属性。

综上所述,let 和 var 的主要区别在于它们的作用域规则、变量提升行为、重复声明以及是否成为全局对象属性。了解这些差异有助于编写更清晰、更易维护的 JavaScript 代码,并减少因作用域和声明方式不当而引发的错误

简单const常量与复杂const常量:

在JavaScript中,const 用于声明常量,即一旦声明,其值就不可更改的变量。但是,“不可更改”这一说法需要根据const所声明的数据类型来具体理解。我们可以将const声明的变量分为“简单const”和“复杂const”,这里主要指的是它们所引用的数据类型是简单类型还是复杂类型。

简单const

const用于声明基本数据类型(如数字、字符串、布尔值等)时,这个变量就存储了实际的数据值,并且这个值是不可变的。例如:


JavaScript

const PI = 3.14159; PI = 3.14; // 报错:TypeError: Assignment to constant variable.

在这个例子中,PI 是一个常量,其值被设置为 3.14159,并且不能被重新赋值。

复杂const

const用于声明复杂数据类型(如对象、数组等)时,情况就有所不同。const保证的是变量指向的内存地址不变,而不是这个内存地址中存储的数据不可变。换句话说,你不能让复杂const指向一个新的对象或数组,但你可以修改这个对象或数组内部的属性或元素。例如:

javaScript

const person = { name: 'Alice', age: 30 }; // 下面的操作是合法的,因为我们没有改变person变量指向的内存地址 person.name = 'Bob'; // 修改对象内部的属性是允许的 person.age = 35; // 同样允许 // 下面的操作是非法的,因为我们试图让person指向一个新的对象 person = { name: 'Charlie', age: 40 }; // 报错:TypeError: Assignment to constant variable.

对于数组也是同样的道理:

JavaScript

const numbers = [1, 2, 3]; // 下面的操作是合法的,因为我们没有改变numbers变量指向的内存地址 numbers.push(4); // 向数组中添加元素是允许的 numbers[0] = 0; // 修改数组中的元素也是允许的 // 下面的操作是非法的 numbers = [4, 5, 6]; // 报错:TypeError: Assignment to constant variable.

总结来说,简单const和复杂const的主要区别在于它们所引用的数据类型的可变性。简单const引用的基本数据类型是不可变的,而复杂const引用的复杂数据类型(如对象、数组)的内部结构是可以修改的,但不能改变其指向的内存地址。

标签:小小,const,变量,作用域,数据类型,js,细节,let,声明
From: https://blog.csdn.net/ghw666666/article/details/143565006

相关文章

  • ssm051网上医院预约挂号系统+jsp(论文+源码)_kaic
      本科毕业设计论文题目:网上医院预约挂号系统设计与实现系   别:XX系(全称)专    业:软件工程班   级:软件工程15201学生姓名:学生学号:指导教师:导师1       导师22021年5月摘  要如今的信息时代,对信息的共享性,信息......
  • js闭包
    闭包(closure)是JavaScript中的一个重要概念,它指的是一个函数可以记住它被创建时的词法作用域(即它所处的变量作用域),即使这个函数在这个作用域之外执行时,依然能够访问该作用域内的变量。闭包让你可以创建并保存私有变量和方法,同时避免全局变量的污染。闭包的核心原理在JavaScrip......
  • Nuxt.js 应用中的 prerender:routes 事件钩子详解
    title:Nuxt.js应用中的prerender:routes事件钩子详解date:2024/11/6updated:2024/11/6author:cmdragonexcerpt:prerender:routes是Nuxt.js中的一个钩子,允许开发者在预渲染过程中扩展要预渲染的路由列表。这对于静态站点生成(SSG)尤为重要,开发者可以根据需求添加额......
  • Mac系统安装node.js及环境配置
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18530322➤如果链接不是为敢技术的博客园地址,则可能......
  • Js Bom&定时器、事件循环
    BOM:浏览器对象模型BOM为我们提供了一组对象,通过这组对象可以完成对浏览器的各种操作BOM对象:Window——代表浏览器窗口(全局对象)Navigator——浏览器的对象(可以用来识别浏览器)Location——浏览器的地址栏信息History——浏览器的历史记录(控制浏览器前进后退)......
  • js内存泄漏几种方式及如何避免、内存溢出
    https://blog.csdn.net/Judy_qiudie/article/details/82845692 一、什么是内存泄漏(memoryleak)?参考阮一峰老师博客:http://www.ruanyifeng.com/blog/2017/04/memory-leak.html不再用到的内存,没有及时释放,就叫做内存泄漏(memoryleak)。程序的运行需要内存。只要程序提出要求,操......
  • 双token无感刷新nodejs+vue3(保姆级教程)
    什么是双Token无感刷新?双Token无感刷新机制使用两个不同的token来管理用户的身份验证和会话。通常情况下,这两个token是:访问Token(AccessToken):用于访问受保护的资源,通常具有较短的有效期(如15分钟到1小时)。当用户进行API请求时,附带此token以证明其身份。刷......
  • Node.js-增强 API 安全性和性能优化
    ​......
  • node.js毕设中国传统文化服饰交流平台(程序+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于中国传统文化服饰交流平台的研究,现有研究主要集中在传统文化服饰的历史、艺术价值等方面,如在传统服饰的审美意蕴研究中,多是从单一的美学角度探讨其......
  • node.js毕设文物藏品管理系统(程序+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于文物藏品管理系统的研究,现有研究主要集中在藏品的数字化管理、RFID技术在藏品管理中的应用等方面。例如,一些研究关注了如何利用RFID技术实现藏品的......