首页 > 其他分享 >var let const 之间的比较

var let const 之间的比较

时间:2024-08-16 15:57:05浏览次数:9  
标签:const 变量 作用域 let var console 声明

var

特点
  • 函数作用域var 声明的变量在函数内有效,如果在函数外声明,则为全局作用域。
  • 变量提升var 声明的变量会被提升到函数的顶部,初始化为 undefined。即使在声明之前引用,JavaScript 也不会抛出错误。
  • 可重复声明:在同一作用域内,可以多次声明同一个变量,不会引发错误。
用法
// 在函数内
function example() {
  var x = 1;
  if (true) {
    var x = 2; // 同一作用域内的重复声明
    console.log(x); // 2
  }
  console.log(x); // 2
}

// 在全局范围
var y = 10;
console.log(y); // 10
容易出错点
  • 作用域问题:由于 var 的作用域是函数级别的,容易引起作用域混淆,特别是在循环和条件语句中。
  • 提升问题:变量提升可能导致意料之外的结果,例如在使用变量之前访问它,结果是 undefined
  • 重复声明:允许重复声明变量可能导致难以追踪的错误。

let

特点
  • 块级作用域let 声明的变量只在块级作用域内有效(如 if 语句或循环)
  • 变量提升let 声明的变量会被提升,但不会初始化。在声明之前访问会导致 ReferenceError
  • 不可重复声明:在同一作用域内不能重复声明同一变量,会引发 SyntaxError
用法
function example() {
  let x = 1;
  if (true) {
    let x = 2; // 块级作用域内的声明
    console.log(x); // 2
  }
  console.log(x); // 1
}

// 在循环中
for (let i = 0; i < 3; i++) {
  console.log(i); // 0, 1, 2
}
console.log(i); // ReferenceError: i is not defined
容易出错点
  • 暂时性死区let 变量在声明之前访问会导致 ReferenceError,可能导致不易追踪的错误。
  • 块级作用域:初学者可能会混淆 let 的块级作用域与 var 的函数作用域,特别是在循环和条件语句中。

const

特点
  • 块级作用域const 的作用域与 let 相同,也是块级作用域
  • 常量const 声明的变量必须在声明时初始化,并且之后不能被重新赋值(对于基本数据类型)。对于对象和数组,const 保证引用不变,但对象的内容可以改变。
  • 变量提升const 声明的变量会被提升,但不会初始化。在声明之前访问会导致 ReferenceError
用法
const x = 10;
console.log(x); // 10
// x = 20; // TypeError: Assignment to constant variable

const obj = { key: 'value' };
obj.key = 'newValue'; // 这是允许的
console.log(obj.key); // 'newValue'

// 对象或数组的内容可以被修改
const arr = [1, 2, 3];
arr.push(4); // 这是允许的
console.log(arr); // [1, 2, 3, 4]
容易出错点
  • 重新赋值const 变量必须在声明时初始化,并且不能重新赋值。尝试重新赋值会导致 TypeError
  • 内容修改:虽然 const 保证了变量绑定的引用不变,但对于对象和数组,内容是可以修改的。需要注意区分引用不变与内容可变。
  • 块级作用域:与 let 一样,const 的块级作用域可能导致作用域混淆,特别是在循环和条件语句中。

总结

  • var:适用于旧代码,函数作用域,存在提升和重复声明问题。
  • let:推荐用于需要块级作用域的情况,避免提升和重复声明问题。
  • const:推荐用于需要不可重新赋值的常量,块级作用域,但要注意对象和数组的内容可以修改。

标签:const,变量,作用域,let,var,console,声明
From: https://blog.csdn.net/Oxford1151/article/details/141170009

相关文章

  • Let’s Encrypt生成免费SSL证书
    一、  Let’sEncrypt简介Let'sEncrypt是由网际网路安全研究小组(ISRG)运营的非营利性证书颁发机构,免费提供传输层安全性协定(TLS)加密的X.509证书。它是世界上最大的证书颁发机构,[3]超过3亿个网站使用其服务,[4]其目标是确保所有网站的安全并使用HTTPS。提供该服务的网际网......
  • 如何使用Java CompletableFuture
    Java的CompletableFuture是处理异步编程的利器。它不仅简化了异步任务的执行,还提供了丰富的API来支持任务的组合、异常处理、以及多任务并行。1.CompletableFuture的基础概念CompletableFuture是Java8中引入的,属于java.util.concurrent包。它实现了Future接口,允......
  • Android经典实战之约束布局ConstraintLayout的实用技巧和经验
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点ConstraintLayout是Android中一种强大的布局管理器,能够帮助你创建复杂而灵活的布局。它通过约束系统将一个View的位置和大小与其他View或父布局联系起来,使得......
  • Let Me Teach You a Lesson (Easy Version)
    显然当\(n\)为偶数的时候比较好考虑,将互相交换的两组放在一起,无论什么情况,这两个组的最大值更小最小值更大是更优的,而且由于\((a+b)+(c+d)=(a+c)+(b+d)\),所以最大值更小当前仅当最小值更大,不会出现最大值更小最小值也更小的情况,所以直接枚举四种情况就好了然后来考虑当\(n\)为奇......
  • The English names of various berries All In One
    TheEnglishnamesofvariousberriesAllInOneallkindsofberriesnamesberry浆果常见berry种类strawberry草莓......
  • C/C++ 动态分配:malloc()和free()所涉及的空指针和强制类型转换、与new和delete的对比
    1、动态分配的内涵所谓动态内存分配,是指在程序运行时根据需要分配和释放内存,而不是在编译时确定内存需求。动态分配包括两方面的内涵:在堆上分配内存。对于linux的虚拟内存,可以分成以下5段:文本段、数据段(分初始化和未初始化数据段)、堆和栈。不使用动态分配定义一个变量,这个变......
  • 问题--Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the
     上班后发现服务不在线,docker也无法启动,检查daemon.json配置文件出问题了 。 检查:#查看docker内全部进程dockerps提示错误:CannotconnecttotheDockerdaemonatunix:///var/run/docker.sock.TSthedockerdaemonrunning? #查看docker状态systemctls......
  • ES6 (二)——ES6 let 与 const
    目录let命令不存在变量提升const命令注意要点ES2015(ES6)新增加了两个重要的JavaScript关键字: let 和 const。let声明的变量只在let命令所在的代码块内有效。const声明一个只读的常量,一旦声明,常量的值就不能改变。let命令基本用法:{leta=0;a......
  • var reg = new RegExp(“(^|&)“ + name + “=([^&]*)(&|$)“, “i“)匹配
    vargetQuery=function(name){ varreg=newRegExp("(^|&)"+name+"=([^&]*)(&|$)","i"); varr=window.location.search.substr(1).match(reg); if(r!=null) return(r[2]); returnnull; };}去网上查了一些资料......
  • 【C++】类与对象(中)_7.const成员函数
    7.const成员7.1const修饰类的成员函数将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。我们来看看下面的代码#define_CRT_SECURE_NO_WARNINGS1#include<iostream>......