引言

在 JavaScript 中,变量是用于存储数据的容器。理解变量的声明和数据类型是学习 JavaScript 的基础。本篇文章将详细介绍变量的声明方式、命名规则以及各种数据类型。


变量声明

在 JavaScript 中,变量是用来存储数据的容器。JavaScript 提供了三种声明变量的方式:varletconst

  1. var
    var 是 JavaScript 最早引入的变量声明方式,作用域为函数作用域。它有变量提升的特性,即变量可以在声明之前使用,但其值为 undefined

    console.log(name); // 输出:undefined
    var name = "Alice";
    console.log(name); // 输出:Alice

    这是因为 var 声明的变量会被提升到函数或全局作用域的顶部,但赋值不会提升。

  2. let
    let 是 ES6(ECMAScript 2015)引入的变量声明方式,作用域为块级作用域。let 声明的变量在块级作用域内有效。

    if (true) {
      let age = 25;
      console.log(age); // 输出:25
    }
    console.log(age); // 抛出错误:age is not defined
  3. const
    const 也是 ES6 引入的,用于声明常量,声明后不能再被重新赋值。const 具有块级作用域,与 let 类似。

    const PI = 3.14;
    console.log(PI); // 输出:3.14
    // PI = 3.15; // 抛出错误:TypeError: Assignment to constant variable.

let 与 const 的相同点和不同点

相同点:

  1. 块级作用域letconst 声明的变量都具有块级作用域,即只在块级作用域内有效。

    if (true) {
      let x = 10;
      const y = 20;
      console.log(x); // 输出:10
      console.log(y); // 输出:20
    }
    console.log(x); // 抛出错误:x is not defined
    console.log(y); // 抛出错误:y is not defined
  2. 不存在变量提升:与 var 不同,letconst 声明的变量不存在变量提升(hoisting),在声明之前使用会抛出错误。

    console.log(a); // 抛出错误:Cannot access 'a' before initialization
    let a = 5;
    
    console.log(b); // 抛出错误:Cannot access 'b' before initialization
    const b = 10;
  3. 暂时性死区(TDZ)letconst 在块级作用域内,从变量绑定到变量声明之间形成暂时性死区(Temporal Dead Zone, TDZ),在 TDZ 内访问变量会抛出错误。

    {
      console.log(z); // 抛出错误:Cannot access 'z' before initialization
      let z = 5;
    }

不同点:

  1. 重新赋值

    • let 声明的变量可以重新赋值。

      let age = 25;
      age = 26;
      console.log(age); // 输出:26
    • const 声明的变量不能重新赋值,再次赋值会抛出错误。

      const PI = 3.14;
      // PI = 3.1415; // 抛出错误:TypeError: Assignment to constant variable.
  2. 声明时必须初始化

    • let 声明的变量可以不初始化,默认值为 undefined

      let x;
      console.log(x); // 输出:undefined
      x = 10;
      console.log(x); // 输出:10
    • const 声明的变量必须在声明时初始化,否则会抛出错误。

      // const y; // 抛出错误:Missing initializer in const declaration
      const y = 20;
      console.log(y); // 输出:20
  3. 常量对象const 声明的对象的引用不能被修改,但对象的属性可以被修改。

    const person = { name: "Alice" };
    person.name = "Bob";
    console.log(person.name); // 输出:Bob
    
    // person = { name: "Charlie" }; // 抛出错误:TypeError: Assignment to constant variable.

变量命名规则

在 JavaScript 中,变量命名必须遵循以下规则:

  1. 变量名只能包含字母、数字、下划线(\_)和美元符号($)。
  2. 变量名不能以数字开头。
  3. 变量名区分大小写(例如,myVarmyvar 是两个不同的变量)。
  4. 变量名不能是保留字(例如,letconstfunction 等)。

数据类型分类

JavaScript 提供了两类数据类型:基本数据类型和引用类型。

基本数据类型:

  1. 字符串(String)
  2. 数字(Number)
  3. 布尔值(Boolean)
  4. null
  5. undefined
  6. Symbol

引用类型:

  1. 对象(Object)
  2. 数组(Array)
  3. 函数(Function)

基本数据类型和引用类型的主要区别:基本数据类型存储的是值本身,而引用类型存储的是对内存中对象的引用。


基本数据类型

  1. 字符串(String)
    字符串用于表示文本数据。可以使用单引号、双引号或反引号(模板字符串)创建字符串。

    let greeting = 'Hello, World!';
    let name = "Alice";
    let message = `Hello, ${name}!`;
    console.log(greeting); // 输出:Hello, World!
    console.log(message); // 输出:Hello, Alice!
  2. 数字(Number)
    数字类型用于表示整数和浮点数。JavaScript 中的所有数字都是 64 位浮点数。

    let age = 30;
    let temperature = 36.6;
    let hex = 0xff; // 十六进制表示
    let bin = 0b1010; // 二进制表示
    let oct = 0o12; // 八进制表示
    console.log(age); // 输出:30
    console.log(temperature); // 输出:36.6
    console.log(hex); // 输出:255
    console.log(bin); // 输出:10
    console.log(oct); // 输出:10
  3. 布尔值(Boolean)
    布尔值有两个取值:truefalse。常用于条件判断。

    let isRaining = false;
    let isSunny = true;
    console.log(isRaining); // 输出:false
    console.log(isSunny); // 输出:true
  4. null
    null 表示一个空值,即一个不存在的对象。通常用于显式地表示“没有值”。

    let car = null;
    console.log(car); // 输出:null
  5. undefined
    undefined 表示变量已声明但未赋值。函数没有返回值时也会返回 undefined

    let house;
    console.log(house); // 输出:undefined
    
    function doNothing() {}
    console.log(doNothing()); // 输出:undefined
  6. Symbol
    Symbol 是 ES6 引入的一种新的基本数据类型,表示独一无二的值。常用于对象属性的唯一标识符。

    let sym1 = Symbol("unique");
    let sym2 = Symbol("unique");
    console.log(sym1 === sym2); // 输出:false

null 和 undefined 的区别

尽管 nullundefined 都表示“无值”或“空值”,但它们之间有一些显著的区别:

  1. 定义

    • undefined 表示变量已声明但尚未赋值,或者对象属性不存在。

      let x;
      console.log(x); // 输出:undefined
      
      let person = {};
      console.log(person.name); // 输出:undefined
    • null 是一个表示“空值”或“无对象”的特殊值,通常用于显式地指示变量或属性为空。

      let y = null;
      console.log(y); // 输出:null
      
      let car = { make: null };
      console.log(car.make); // 输出:null
  2. 类型

    • undefined 的类型是 undefined

      console.log(typeof undefined); // 输出:undefined
    • null 的类型是 object

      console.log(typeof null); // 输出:object
  3. 使用场景

    • undefined 通常在变量未赋值时自动出现。

      let z;
      console.log(z); // 输出:undefined
    • null 通常由开发者显式赋值,用于指示“无值”或“空对象”。

      let empty = null;
      console.log(empty); // 输出:null
  4. 相等性比较

    • 使用宽松相等(==)运算符时,nullundefined 是相等的。

      console.log(null == undefined); // 输出:true
    • 使用严格相等(===)运算符时,nullundefined 不相等。

      console.log(null === undefined); // 输出:false
  5. 历史问题
    typeof null === "object" 是一个历史遗留问题。最初的 JavaScript 设计中,null 被认为是一个对象的占位符,但这个设计后来被发现是不理想的。尽管如此,为了保持向后兼容性,这个问题一直没有修复。

引用类型

除了基本数据类型,JavaScript 还有引用类型,包括对象、数组和函数。

  1. 对象(Object)
    对象是键值对的集合,用于存储复杂的数据结构。可以通过点操作符或方括号操作符访问对象属性。

    let person = {
      name: "John",
      age: 30,
      job: "Developer",
    };
    console.log(person.name); // 输出:John
    console.log(person["age"]); // 输出:30
    
    // 动态添加属性
    person.country = "USA";
    console.log(person.country); // 输出:USA
  2. 数组(Array)
    数组是一组按次序排列的值的集合,可以存储不同类型的值。数组的索引从 0 开始。

    let colors = ["red", "green", "blue"];
    console.log(colors[0]); // 输出:red
    console.log(colors.length); // 输出:3
    
    // 添加元素
    colors.push("yellow");
    console.log(colors); // 输出:["red", "green", "blue", "yellow"]
    
    // 迭代数组
    colors.forEach(function (color) {
      console.log(color);
    });
  3. 函数(Function)
    函数是可重复使用的代码块。可以通过函数声明或函数表达式创建函数。

    // 函数声明
    function greet(name) {
      return "Hello, " + name;
    }
    console.log(greet("Alice")); // 输出:Hello, Alice
    
    // 函数表达式
    let greet = function (name) {
      return "Hello, " + name;
    };
    console.log(greet("Bob")); // 输出:Hello, Bob

结论

理解变量声明和数据类型是学习 JavaScript 的基础。varletconst 各有用途,而基本数据类型和引用类型在编程中有不同的应用场景。掌握这些概念可以帮助我们更好地进行代码编写和调试。

最后修改:2024 年 08 月 08 日
如果觉得我的文章对你有用,请随意赞赏