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

作用域

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

var

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

{var a = 10
}
console.log("输出", a) //输出10var a = 10
function test() {console.log("输出", 10) //输出 10var 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);  //20checkscope();
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.mzph.cn/pingmian/49383.shtml

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

相关文章

【凸优化】二次约束二次规划(QCQP)问题转化为二阶锥规划(SOCP)

二次约束二次规划(QCQP)问题的SOCP形式转化 1. 问题描述 1.1. QCQP的一般形式: min ⁡ 1 2 x ⊤ Q 0 x c ⊤ x s . t . x ⊤ Q i x a i ⊤ x ≤ b i , i 1 , … , m \begin{aligned} \min \quad &\frac{1}{2}\mathbf{x}^{\top}\math…

移除链表元素 - 力扣(LeetCode)

203. 移除链表元素 - 力扣(LeetCode) /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* cur hea…

ubuntu c++ nginx ffmpeg 推流海康摄像头视频

环境:Ubuntu18.04 使用到的库:nginx,ffmpeg 外设:海康任一款摄像头,分辨率:1280*720 Ubuntu c 海康sdk获取原始码流,使用ffmpeg编码推流到nginx服务器,使用vlc即可拉到rtmp图像&a…

别再只知道埋头苦学python了!!学了python后月入1w不在话下,不准你还不知道!!!

在Python接单的过程中,掌握一些技巧、注意相关事项以及选择合适的接单平台是非常重要的 一、Python接单要注意哪些 报酬问题:在接单前,务必明确客户所说的报酬是税前还是税后,以避免后期产生纠纷。时间管理:不要与客户…

Nginx 如何处理 WebSocket 连接?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 文章目录 Nginx 如何处理 WebSocket 连接?一、WebSocket 连接简介二、Nginx 处理 WebSocket 连接的基本原理三、配置 Nginx 支持 WebSocket 连接四、Nginx 中的…

【启明智显分享】甲醛检测仪HMI方案:ESP32-S3方案4.3寸触摸串口屏,RS485、WIFI/蓝牙可选

今年,“串串房”一词频繁引发广大网友关注。“串串房”,也被称为“陷阱房”“贩子房”——炒房客以低价收购旧房子或者毛坯房,用极度节省成本的方式对房子进行装修,之后作为精修房高价租售,因甲醛等有害物质含量极高&a…

LeetCode-day23-3098. 求出所有子序列的能量和

LeetCode-day23-3098. 求出所有子序列的能量和 题目描述示例示例1:示例2:示例3: 思路代码 题目描述 给你一个长度为 n 的整数数组 nums 和一个 正 整数 k 。 一个 子序列的 能量 定义为子序列中 任意 两个元素的差值绝对值的 最小值 。 请…

“从爱好者到职业画师:一位AI绘画践行者的赚钱实战秘籍“

🎨 【引子:AI绘画:艺术与科技的交汇】 在数字化浪潮席卷全球的今天,人工智能技术以其颠覆性的力量,正悄然改写着艺术创作的传统版图。当AI与绘画碰撞交融,诞生出一种全新的艺术形式——AI绘画。它不仅是科…

别只盯着苹果了,华为Mate70也有AI技术,听说效果让人直接惊呼

随着人工智能技术的不断进步,智能手机行业也迎来了前所未有的变革。苹果、三星等国际知名手机厂商纷纷在新品发布会上重点展示其手机的AI技术,而华为作为中国科技的领军企业,其在AI领域的成就同样不容小觑。 华为Mate系列作为其旗舰系列&…

科研绘图系列:R语言组合热图和散点图

介绍 热图展示参与者的属性,散点图表示样本的时间跨度。 加载R包 library(tidyverse) library(ComplexHeatmap) library(circlize) library(cowplot)导入数据 数据可从以下链接下载(画图所需要的所有数据): 百度云盘链接: https://pan.baidu.com/s/1iEE9seTLdrrC3WDHJy…

计算机网络基础:3.DNS服务器、域名分类

一、DNS服务器 DNS服务器在网络中的作用类似于餐厅中的“顾客座位对照表”,它帮助前台(路由器)将顾客(用户)的请求转发到正确的餐桌(目标设备)。 (1)概念与原理 DNS的基本概念 DNS&…

ansible的role用法

目录 目录结构介绍案例 目录结构介绍 可以通可以通过使用 ansible-galaxy 命令再当前目录自动生成 role 的基本目录结构。 myrole为文件名(角色名) ansible-galaxy init myrole如果没有安装Ansible Galaxy,你可以使用以下命令安装&#xff…

Gson的基本使用:解析Json格式数据 序列化与反序列化

目录 一,Gson和Json 1,Gson 2,Json 3,Gson处理对象的几个重要点 4,序列化和反序列化 二,Gson的使用 1,Gson的创建 2,简单对象序列化 3,对象序列化,格…

C++学习笔记-友元函数的定义与使用

一、引言 在C中,友元函数(Friend Function)是一个独特而强大的特性,它打破了类的封装性,允许一个或多个非成员函数访问类的私有(private)和保护(protected)成员。尽管这…

Springboot+Maven多模块项目开发

SpringbootMaven多模块项目开发 前言示例项目建设Parent项目Common模块ModuleOne模块特别说明 参考: 前言 1.多模块项目的好处: 代码复用 一个后端项目的entity、dao、service代码需要用到前端服务,还需要用到后台管理,通过多模…

Wordpress安装到win10(2024年7月)

目录 1.wordpress介绍 2下载应用 2.1.wordpress 2.2XAMPP 2.3 PHPmyadmin 3.配置应用 3.1XAMPP进程 3.2 文件配置 3.3 phpmyadmin配置 4.配置网页 4.1 数据库创建 4.2 安装wordpress 5.进入面板 6.总结 1.wordpress介绍 WordPress是一个开源内容管理系统&#xff0…

Java台球厅助教教练预约上门到店系统源码

🎱一杆在手,天下我有!台球助教教练预约系统,让球技飙升不是梦🚀 🎯【开篇:台球爱好者的福音来啦!】🎯 还在为找不到合适的台球教练而烦恼吗?或是想要在家就…

Django Nginx + uWSGI 安装配置

Django Nginx + uWSGI 安装配置 本文将详细介绍如何在Linux服务器上安装和配置Django、Nginx和uWSGI。这些技术通常一起使用来部署高性能的Django应用程序。我们将分步骤进行,确保您能够顺利地完成整个过程。 1. 安装Python和pip 在开始之前,请确保您的系统上安装了Python…

【C#学习笔记】数组

在C#中,数组是一种数据结构,用于存储一系列相同类型的元素。数组在C#中非常常见,因为它们提供了高效的数据存储和访问方式。下面,我将从基础概念到高级用法,为您详细解释C#中的数组。 基础概念 定义: 数组…

抽象代数精解【4】

文章目录 子群难点与例子中心化子与正规化子定义性质与正规化子的关系应用 det概述两个矩阵乘积的行列式等于这两个矩阵行列式的乘积 参考文献 子群 难点与例子 在 z 10 中,令 H { 2 ˉ , 4 ˉ , 6 ˉ , 8 ˉ } , 证明: H 中关于剩余类的乘法构成群&am…