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

第二节:变量、数据类型与运算符:JS 的基石

📌 第二节:变量、数据类型与运算符:JS 的基石

目标:理解变量声明、作用域规则,掌握原始类型与引用类型的底层差异,熟练运用运算符。


一、变量:数据的“容器”

1. 变量是什么?
  • 类比:变量如同一个带标签的“盒子”,用于存储数据(如数字、文字等)。
  • 核心作用:在程序运行中动态存储和修改数据。
2. 变量声明方式
  • var(ES5 及之前)

    var userName = "Alice"; // 可重复声明,无块级作用域
    var userName = "Bob";   // 不会报错(不推荐)
    
    • 问题:
      1. 允许重复声明(可能覆盖原值)。
      2. 无块级作用域({} 内声明的变量会“泄漏”到外部)。
  • let(ES6+ 推荐)

    let age = 25;
    let age = 30; // SyntaxError: 重复声明报错
    
    • 改进:
      1. 块级作用域(iffor 内的变量不会污染外部)。
      2. 禁止重复声明。
  • const(常量声明)

    const PI = 3.14;
    PI = 3.1415; // TypeError: 重新赋值报错
    
    • 规则:
      1. 声明时必须初始化(不能先声明后赋值)。
      2. 不可重新赋值(但对象属性可修改,见下文)。

二、数据类型:变量存储的内容

1. 原始类型(Primitive Types)
  • 特点:按值传递,存储在栈内存,不可变。

  • 类型

    类型示例说明
    String"Hello"字符串,用单/双引号包裹
    Number423.14整数/浮点数,无 int/float 区分
    Booleantruefalse逻辑值
    Nullnull空值(显式赋值,非对象)
    Undefinedundefined未定义(变量未赋值时的默认值)
    SymbolSymbol("id")唯一标识符(ES6+)
    BigInt9007199254740991n大整数(ES2020+)
  • 示例

    let name = "Alice"; // String
    let isActive = true; // Boolean
    let count; // undefined
    
2. 引用类型(Reference Types)
  • 特点:按引用传递,存储在堆内存,可变。

  • 类型:

    • Object(包括 ArrayFunctionDate 等)。
    • 类比:原始类型是“盒子”,引用类型是“文件柜”(内部有多个抽屉)。
  • 示例:

    let user = { name: "Alice", age: 25 }; // Object
    let numbers = [1, 2, 3]; // Array(特殊对象)
    let greet = function() { console.log("Hi"); }; // Function
    

三、原始类型 vs 引用类型:底层差异

1. 赋值行为对比
  • 原始类型:拷贝值(完全独立)。

    let a = 10;
    let b = a; // b 拷贝了 a 的值
    b = 20;
    console.log(a); // 10(未受影响)
    
  • 引用类型:拷贝引用(共享同一对象)。

    let obj1 = { x: 1 };
    let obj2 = obj1; // obj2 拷贝了 obj1 的引用
    obj2.x = 2;
    console.log(obj1.x); // 2(原对象被修改)
    
2. 不可变性
  • 原始类型不可变:

    let str = "hello";
    str[0] = "H"; // 无效!字符串不可变
    console.log(str); // "hello"(未改变)
    
  • 引用类型可变:

    let arr = [1, 2];
    arr.push(3); // 数组可变
    console.log(arr); // [1, 2, 3]
    
3. const 与引用类型
  • const 限制的是引用地址:

    const obj = { x: 1 };
    obj.x = 2; // 合法(对象属性可修改)
    obj = {};   // 报错!不能重新赋值引用
    

四、类型检测:typeofinstanceof

1. typeof 操作符
  • 作用:检测原始类型或 function

  • 示例:

    typeof 42; // "number"
    typeof "Hi"; // "string"
    typeof true; // "boolean"
    typeof undefined; // "undefined"
    typeof {}; // "object"(注意:null 也返回 "object"!)
    typeof function() {}; // "function"
    
2. instanceof 操作符
  • 作用:检测对象是否为某构造函数的实例。

  • 示例:

    let arr = [1, 2];
    arr instanceof Array; // true
    arr instanceof Object; // true(数组是对象的子类)
    
3. 特殊情况
  • null 的类型:

    typeof null; // "object"(历史遗留问题,需单独判断)
    
  • 解决方案:

    function safeTypeCheck(value) {if (value === null) return "null";return typeof value;
    }
    

五、动手实践:变量与类型综合练习

任务 1:变量声明与赋值
// 1. 用 let 声明变量并赋值
let productName = "Laptop";
let price = 999.99;// 2. 修改变量值
price = 899.99;// 3. 尝试用 const 声明价格(会报错吗?为什么?)
// const fixedPrice = 999.99; // 正确
// fixedPrice = 899.99; // 报错!
任务 2:类型判断与转换
// 1. 判断以下变量的类型
let a = 10;
let b = "20";
let c = true;
let d = null;
let e = {};console.log(typeof a, typeof b, typeof c, typeof d, typeof e);// 2. 将 b 转换为 Number 类型并计算 a + b
let numB = Number(b); // 或 +b
console.log(a + numB); // 30
任务 3:引用类型操作
// 1. 创建对象并修改属性
let user = { name: "Alice", age: 25 };
user.age = 26; // 合法// 2. 创建数组并添加元素
let fruits = ["apple", "banana"];
fruits.push("orange");
console.log(fruits); // ["apple", "banana", "orange"]

📌 关键点总结

  1. 变量声明:
    • 优先用 let(可变)和 const(不可变),避免 var
  2. 数据类型:
    • 原始类型(按值传递) vs 引用类型(按引用传递)。
  3. 类型检测:
    • typeof 用于原始类型,instanceof 用于对象。
  4. 常见陷阱:
    • nulltypeof"object",需单独判断。

🎯 下一节预告

「条件语句与循环:控制程序流程」

  • 掌握 if-elseswitch 的实际应用场景。
  • 破解 for 循环与 forEach 的性能差异。
  • 动手实现一个猜数字游戏。

如果需要调整内容深度或补充示例(如更详细的 VSCode 调试配置),可以随时告诉我! 😊

http://www.xdnf.cn/news/4881.html

相关文章:

  • 佰力博科技与您探讨薄膜极化的类型、机制与应用领域
  • 从零开始的python学习(六)P86+P87+P88
  • 【软件工程】软件多缺陷定位方法总结
  • 从韦斯利・卡普洛看北斗星咨询公司的技术咨询引领之路
  • Docker Compose 部署 MeiliSearch 指南
  • Oracle 执行计划中的 ACCESS 和 FILTER 详解
  • 数据可视化大屏——物流大数据服务平台(二)
  • 从生产事故看软件质量保障:开发规范落实与时间资源矛盾的深度探讨
  • 如何清除windows 远程桌面连接的IP记录
  • kafka 面试总结
  • 仁合医疗核心产品:引领医疗科技新潮流
  • 从 Git 到 GitHub - 使用 Git 进行版本控制 - Git 常用命令
  • 数据同步选择推Push还是拉Pull
  • 45.传导发射整改摸底测试方法
  • 文旅田园康养小镇规划设计方案PPT(85页)
  • C++23 views::chunk_by (P2443R1) 详解
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十三)(1)
  • 3D桌面可视化开发平台HOOPS Native Platform,如何实现3D系统快速开发与部署?
  • stm32 debug卡在0x1FFFxxxx
  • OPC UA 介绍及开发示例
  • 【Survival Analysis】【机器学习】【3】deepseek流程图
  • 22、城堡防御工事——React 19 错误边界与监控
  • 如何用Jmeter实现自动化测试?
  • 【MySQL】存储引擎 - FEDERATED详解
  • WPF之静态资源与动态资源
  • 从 AGI 到具身智能体:解构 AI 核心概念与演化路径全景20250509
  • JVM详解
  • 路由组件1
  • 创建没有 TPM 和安全启动的 Windows 11 可启动 USB 驱动器
  • 【MySQL】数据库、数据表的基本操作