js什么时候会返回undefined

85 阅读3分钟

一、变量相关:未赋值或未声明的引用

  1. 声明但未赋值的变量
    变量通过var/let/const声明后,若未赋值,默认值为undefined(注意:const声明后必须赋值,否则会报错,因此仅varlet有此情况)。

    let name;
    console.log(name); // undefined
    
  2. 访问未声明的变量
    直接引用未声明的变量时,在非严格模式下返回undefined(严格模式下会报错ReferenceError)。

    console.log(age); // undefined(非严格模式)
    

二、函数相关:返回值与参数

  1. 函数无return语句
    函数执行完毕后,若未显式使用return返回值,默认返回undefined

    function sum(a, b) {
      a + b; // 无return
    }
    console.log(sum(1, 2)); // undefined
    
  2. return后无值
    函数使用return但未指定返回内容,返回undefined

    function foo() {
      return; // 仅return,无值
    }
    console.log(foo()); // undefined
    
  3. 函数参数未传递
    调用函数时,若未传递某个参数,该参数在函数内默认值为undefined(除非设置了默认参数)。

    function greet(name) {
      console.log(name); // 未传递参数时为undefined
    }
    greet(); // undefined
    

三、对象与数组:无效的访问

  1. 访问对象不存在的属性
    尝试获取对象中不存在的属性时,返回undefined(不会报错)。

    const user = { name: 'Alice' };
    console.log(user.age); // undefined(age属性不存在)
    
  2. 访问数组越界的索引
    数组索引超出实际长度范围时,返回undefined

    const arr = [1, 2, 3];
    console.log(arr[5]); // undefined(索引5不存在)
    
  3. 删除数组元素后访问原索引
    使用delete删除数组元素后,原索引位置值变为undefined(数组长度不变)。

    const arr = [1, 2, 3];
    delete arr[1];
    console.log(arr[1]); // undefined
    

四、操作符与表达式:特殊场景

  1. void操作符
    void操作符会执行表达式,但始终返回undefined(常用于阻止默认行为,如href="javascript:void(0)")。

    console.log(void 123); // undefined
    console.log(void (a = 5)); // undefined(a被赋值为5,但返回undefined)
    
  2. 解构赋值时未匹配到值
    解构对象/数组时,若目标属性/索引不存在,变量会被赋值为undefined

    const { age } = { name: 'Bob' };
    console.log(age); // undefined(对象中无age属性)
    
    const [a, b] = [1];
    console.log(b); // undefined(数组中无第二个元素)
    

五、问题

1. 问:undefinednull的区别是什么?
  • undefined是“未定义”(变量未赋值、属性不存在等场景的默认值),null是“空值”(需显式赋值,表示故意清空一个值)。例如:let a;aundefinedlet b = null;bnull
2. 问:如何判断一个变量的值是undefined
  • :推荐用typeoftypeof x === 'undefined'),或严格相等(x === undefined)。注意避免用非严格相等(x == undefined会同时匹配null)。

总结

“JavaScript中undefined表示‘未定义’,常见场景包括:变量声明后未赋值、函数无return语句、访问对象不存在的属性、数组越界索引等。它和null的区别在于,undefined是默认状态,null是显式清空的值。实际开发中,可通过typeof或严格相等判断undefined,避免因未定义的值导致逻辑错误。”