当前位置: 首页 > backend >正文

Javascript 编程基础(2)基础知识 | 2.2、变量

文章目录

  • 一、变量
    • 1、变量声明方式
      • 1.1、`var` (ES5 及之前)
      • 1.2、`let` (ES6+)
      • 1.3、`const` (ES6+)
    • 2、变量作用域
      • 2.1、全局作用域
      • 2.2、函数作用域
      • 2.3、块级作用域
    • 3、变量提升
    • 4、原始类型 vs 引用类型
      • 4.1、原始类型(按值传递)
      • 4.2、引用类型(按引用传递)
    • 5、变量命名规范
    • 6、最佳实践

一、变量

1、变量声明方式

JavaScript 提供了三种主要的变量声明方式:

1.1、var (ES5 及之前)

var name = "John";
  • 函数作用域
  • 存在变量提升(hoisting)
  • 可重复声明
  • 全局声明会成为 window 对象的属性

1.2、let (ES6+)

let age = 30;
  • 块级作用域
  • 不存在变量提升
  • 不可重复声明
  • 不会成为 window 对象的属性

1.3、const (ES6+)

const PI = 3.14159;
  • 块级作用域
  • 声明时必须初始化
  • 不可重新赋值(但对于对象和数组,内容可修改)
  • 其他特性与 let 相同

2、变量作用域

2.1、全局作用域

在任何函数或代码块之外声明的变量拥有全局作用域。

var globalVar = "I'm global";

2.2、函数作用域

使用 var 在函数内声明的变量只在函数内可见。

function test() {var functionScoped = "Inside function";
}

2.3、块级作用域

使用 letconst 在代码块({})中声明的变量只在该块内可见。

if (true) {let blockScoped = "Inside block";
}

3、变量提升

JavaScript 引擎在执行代码前会先处理变量声明:

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

等同于:

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

注意:

  • letconst 也存在提升,但存在"暂时性死区"(TDZ),在声明前访问会报错
  • 只有声明被提升,赋值不会被提升

4、原始类型 vs 引用类型

4.1、原始类型(按值传递)

  • String, Number, Boolean, Null, Undefined, Symbol, BigInt
  • 直接存储在栈内存中
  • 赋值是值的拷贝
let a = 10;
let b = a; // b 是 a 的副本
a = 20;
console.log(b); // 仍然是 10

4.2、引用类型(按引用传递)

  • Object, Array, Function
  • 存储在堆内存中,变量保存的是引用地址
  • 赋值是引用地址的拷贝
let obj1 = { name: "John" };
let obj2 = obj1; // obj2 和 obj1 指向同一个对象
obj1.name = "Jane";
console.log(obj2.name); // "Jane"

5、变量命名规范

  • 区分大小写
  • 可以包含字母、数字、下划线(_)和美元符号($)
  • 不能以数字开头
  • 不能使用保留字作为变量名
  • 推荐使用驼峰命名法(camelCase)
  • 常量通常使用全大写加下划线(SCREAMING_SNAKE_CASE)

6、最佳实践

  • 优先使用 const:默认使用 const,只有在需要重新赋值时才使用 let
  • 避免使用 var:除非有特殊需求,否则使用 letconst
  • 初始化变量:声明时尽量初始化变量
  • 有意义的命名:变量名应清晰表达其用途
  • 避免全局变量:减少全局变量的使用,防止命名冲突
  • 使用严格模式"use strict" 可以帮助避免一些常见的错误
http://www.xdnf.cn/news/7557.html

相关文章:

  • Day31
  • 阿里云服务器Ubuntu的git clone失败问题解决方案
  • C++中的宏
  • 【全网首发】知识库的批量导入以及更新
  • C#学习10——泛型
  • 股指期货模型,简单易懂的套利策略
  • DevExpress GridControl 复选列实时获取选中状态的解决方案
  • VMWare清理后,残留服务删除方案详解
  • bi报表是什么意思?如何制作一张bi报表?
  • 【算法-栈】深入栈模拟题:从题型特征到实现技巧
  • Opencv常见学习链接(待分类补充)
  • 【笔试强训day37】
  • [luogu12542] [APIO2025] 排列游戏 - 交互 - 博弈 - 分类讨论 - 构造
  • Keil软件中STM32(ARM)与C51兼容方法
  • 预先学习:构建智能系统的 “未雨绸缪” 之道
  • RabbitMQ的基本使用
  • SSL证书:谷歌算法排名的安全基石与信任杠杆
  • 【小明剑魔视频Viggle AI模仿的核心算法组成】
  • Wan2.1 通过首尾帧生成视频
  • 【综述】视频目标分割VOS
  • 【DICOM之加密传输】DICOM实现TLS加密传输的一些经验
  • 二、【环境搭建篇】:Django 和 Vue3 开发环境准备
  • Spark离线数据处理实例
  • 20250520在全志H3平台的Nano Pi NEO CORE开发板上运行Ubuntu Core16.04.3时跑通4G模块EC20
  • 大模型——多模态检索的RAG系统架构设计
  • CentOS系统上挂载磁盘
  • 【图像大模型】Stable Diffusion 3 Medium:多模态扩散模型的技术突破与实践指南
  • CentOS Stream安装MinIO教程
  • 算力:数智时代的核心生产力引擎​
  • idea 插件开发自动发布到 nexus 私服中(脚本实例)