let、var、const 的区别 --js面试题

news2024/11/15 18:58:18

作用域

ES5中的作用域有:全局作用域、函数作用域,ES6中新增了块级作用域。块作用域由 { } 包括,if 语句和 for 语句里面的 { } 也属于块作用域。

var

1.没有块级作用域的概念,但具有函数全局作用域、函数作用域的概念

{
	var a = 10
}
console.log("输出", a) //输出10

var a = 10
function test() {
	console.log("输出", 10) //输出 10
    var a = 10
}
console.log(a) //a is not defined

2.存在变量提升
变量提升(hoisting)是JavaScript中的一种行为,它使得变量和函数声明在代码执行前被提升至当前作用域的顶部。然而,变量的初始化并不会被提升

console.log(x); // 输出: undefined
var x = 5;

3.全局作用域用 var 声明的变量会挂载到 window 对象下,let 和const不会,node环境中都不会挂载到global对象
在这里插入图片描述
4.同一作用域中允许重复声明,以最后一次声明为准

var a = 10;
var a = 20;
console.log(a);  //20

checkscope();
function checkscope(){
    var b = 10;
    var b = 20;
    console.log(b);  //20
}

let

1.有块级作用域的概念

{
   let a = 10;
}
console.log(a);  //ReferenceError: a is not defined

2.不存在变量提升且具有暂时性死区

console.log(a); //ReferenceError: Cannot access 'a' before initialization
let a = 10;

暂时性死区(Temporal Dead Zone,简称 TDZ)是ES6(ECMAScript 2015)引入的新概念,主要与let和const声明有关。在TDZ中,变量在声明之前是不可访问的,这有助于避免某些常见的编程陷阱和错误。
TDZ 的工作原理:
在使用let或const声明变量的作用域中,从作用域的开始直到变量声明语句之前,变量处于暂时性死区。在TDZ中试图访问变量会导致ReferenceError,因为此时变量尚未正式声明。

TDZ 的工作原理
在使用let或const声明变量的作用域中,从作用域的开始直到变量声明语句之前,变量处于暂时性死区。在TDZ中试图访问变量会导致ReferenceError,因为此时变量尚未正式声明。
3.同一块作用域中不允许重复声明

{
  let A;
  var A;  //SyntaxError: Identifier 'A' has already been declared
}
{
  var A;
  let A;  //SyntaxError: Identifier 'A' has already been declared
}
{
  let A;
  let A;  //SyntaxError: Identifier 'A' has already been declared
}

const

1.必须立即初始化,不能留到以后赋值

const a; // SyntaxError: Missing initializer in const declaration } 

2.常量的值不能改变

{
  const a = 10; 
  a = 20; // TypeError: Assignment to constant variable
}

但是,对于使用const声明的数组或对象,其内部的属性是可以改变的

const a = [10, 20]
a[1] = 2
console.log(a)

const b = {
    'name': '张三'
}

b.name = '李四'
console.log(b)

/*
输出
[ 10, 2 ]
{ name: '李四' }
*/

3.不存在变量提升且具有暂时性死区

console.log(y); // 输出: ReferenceError: y is not defined
const y = 10;

面试真题

  • let const var 的区别?什么是块级作用域?如何用?

参考答案:

  1. var 定义的变量,没有块级作用域的概念,具有变量提升,可重复声明。
  2. let 定义的变量,只能在块作用域里访问,无变量提升,不可以重复声明,具有暂时性死区。
  3. const 用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改,无变量提升,不可以重复声明,具有暂时性死区。

最初在 JS 中作用域有:全局作用域、函数作用域。没有块作用域的概念。

ES6 中新增了块级作用域。块作用域由 { } 包括,if 语句和 for 语句里面的 { } 也属于块作用域。

在以前没有块作用域的时候,在 if 或者 for 循环中声明的变量会泄露成全局变量,其次就是 { } 中的内层变量可能会覆盖外层变量。块级作用域的出现解决了这些问题。

总结

主要就是4个方面
1.是否有块级作用域
2.是否变量提示生
3.是否有暂时性死区
4.是否可重复声明

后续增加

  1. JavaScript为什么要进行变量提升,它导致了什么问题
  2. let var 在闭包中应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1944298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交易积累-MACD

MACD(Moving Average Convergence Divergence,即移动平均收敛发散指标)是由Gerald Appel于1970年代后期发明的一种趋势跟踪动量指标。MACD显示了两个不同周期(通常是较长和较短周期)的移动平均线之间的差异。这个指标旨…

PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘

1,下载 RTL8125B driver 下载页: https://www.realtek.com/Download/List?cate_id584 2,RTL8125B datasheet下载 下载页: https://file.elecfans.com/web2/M00/44/D8/poYBAGKHVriAHnfWADAT6T6hjVk715.pdf3, 编译driver 解压: $ tar xj…

Android APP CameraX应用(02)预览流程

说明:camera子系统 系列文章针对Android12.0系统,主要针对 camerax API框架进行解读。 1 CameraX简介 1.1 CameraX 预览流程简要解读 CameraX 是 Android 上的一个 Jetpack 支持库,它提供了一套统一的 API 来处理相机功能,无论 …

Redis-10大数据类型理解与测试

Redis10大数据类型 我要打10个1.redis字符串(String)2.redis列表(List)3.redis哈希表(Hash)4.redis集合(Set)5.redis有序集合(ZSet)6.redis地理空间(GEO)7.redis基数统计(HyperLogLog)8.redis位图(bitmap)9.redis位域(bitfield)10.redis流(Stream) 官网地址Redis 键(key)常用案…

OpenCV图像滤波(1)双边滤波函数bilateralFilter的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 功能描述 bilateralFilter是图像处理和计算机视觉领域中的一种高级图像滤波技术,特别设计用于在去除噪声的同时保留图像的边缘和细节。相比于传…

NSSCTF-2021年SWPU联合新生赛

[SWPUCTF 2021 新生赛]finalrce 这道题目考察tee命令和转义符\ 这题主要是,遇到一种新的符号,"\"—转义符。我理解的作用就是在一些控制字符被过滤的时候,可以用转义符,让控制符失去原本的含义,变为字面量…

学习记录——day16 操作受限的线性表 链式栈

操作受限的线性表 1、在之前的内容,无论是顺序表还是链表,都是详细处理的线性表,既可以在端点处进行操作也 可以在中间位置操作 2、现实生活中,有很多并不需要在中间进行操作的序列,只在端点处进行操…

30岁自学编程从何处入手?

自学编程是一个很好的选择,尤其是在你有志于转行或提升技能的情况下。我收集制作一份plc学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学习方向,包括了编程教学,数据处理,通信处理&#xff0c…

JVM中的栈、堆与方法区:深入理解JVM内存管理

JVM中的栈、堆与方法区:深入理解JVM内存管理 1、栈(Stack)2、堆(Heap)3、方法区(Method Area) 💖The Begin💖点点关注,收藏不迷路💖 在Java程序的…

SpringBoot+ Sharding Sphere 轻松实现数据库字段加解密

一、介绍 在实际的软件系统开发过程中,由于业务的需求,在代码层面实现数据的脱敏还是远远不够的,往往还需要在数据库层面针对某些关键性的敏感信息,例如:身份证号、银行卡号、手机号、工资等信息进行加密存储&#xf…

Pytorch 6

罗切斯特回归模型 加了激活函数 加了激活函数之后类 class LogisticRegressionModel(torch.nn.Module):def __init__(self):super(LogisticRegressionModel, self).__init__()self.linear torch.nn.Linear(1,1)def forward(self, x):# y_pred F.sigmoid(self.linear(x))y_p…

colab进行keras入门随机数和标签的一点思考,例如shape和Dense等

keras官方中文文档 pip install kerasfrom keras import layers from keras import modelsmodel.add(layers.Dense(32,activationrelu,input_shape(100,)))# 添加多个Dense层 model.add(layers.Dense(10,activationsoftmax)) model.compile(optimizerrmsprop,losscategorical_…

libtins初探-抓包嗅探

libtin 一、概述1. 可移植性2. 特性 二、基础知识1. PDU2. 地址类3. 地址范围类4. 网络接口5. 写pcap文件 三、嗅探1.嗅探基础2. 嗅探器配置3. 循环嗅探4. 使用迭代器嗅探6. 包对象7. 读取pcap文件8. 包的解析 四、发送包1. 发送网络层pdu2. 发送链路层pdu3. 发送和接收响应校验…

【第一天】计算机网络 TCP/IP模型和OSI模型,从输入URL到页面显示发生了什么

TCP/IP模型和OSI模型 这两个模型属于计算机网络的体系结构。 OSI模型是七层模型,从上到下包括: 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层 TCP/IP模型是四层模型&…

BGP选路之Next Hop

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时,BGP协议会对这些BGP路由的属性进行比较,以确定出去往该目标网络的最优BGP路由,然后将该最优BGP路由与去往同一目标网络的其他协议路由进行比较,从而决定是否将该最优BGP路由放进P路由表中…

PCB工艺边设计准则

在PCB设计时,通常会在电路板的边缘预留一定的空间,这部分空间被称为工艺边。它有助于在生产过程中确保电路板的尺寸和形状的准确性。以使得组装时更加顺畅、便捷。而工艺边的加工,使得线路板上的元件可以精准地与设备对接,从而提高…

C++学习笔记-operator关键字:重载与自定义操作符

在C编程中,operator关键字扮演着极其重要且独特的角色。它允许开发者为内置类型或自定义类型重载或定义新的操作符行为。这一特性极大地增强了C的表达能力,使得代码更加直观、易于理解和维护。本文将深入探讨C中operator关键字的使用,包括操作…

【ffmpeg命令入门】ffplay常用命令

文章目录 前言ffplay的简介FFplay 的基本用法常用参数及其作用示例 效果演示图播放普通视频播放网络媒体流RTSP 总结 前言 FFplay 是 FFmpeg 套件中的一个强大的媒体播放器,它基于命令行接口,允许用户以灵活且高效的方式播放音频和视频文件。作为一个简…

vscode 寻找全部分支的提交

vscode 寻找全部分支的提交 Git Graph

UE5 C++跑酷练习(Part2)

一.首先GameMode里有Actor数组,组装直线路,和左右路 #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "RunGANGameMode.generated.h"UCLASS(minimalapi) class ARunGANGameMode : public AG…