一、变量相关:未赋值或未声明的引用
-
声明但未赋值的变量
变量通过var/let/const声明后,若未赋值,默认值为undefined(注意:const声明后必须赋值,否则会报错,因此仅var和let有此情况)。let name; console.log(name); // undefined -
访问未声明的变量
直接引用未声明的变量时,在非严格模式下返回undefined(严格模式下会报错ReferenceError)。console.log(age); // undefined(非严格模式)
二、函数相关:返回值与参数
-
函数无return语句
函数执行完毕后,若未显式使用return返回值,默认返回undefined。function sum(a, b) { a + b; // 无return } console.log(sum(1, 2)); // undefined -
return后无值
函数使用return但未指定返回内容,返回undefined。function foo() { return; // 仅return,无值 } console.log(foo()); // undefined -
函数参数未传递
调用函数时,若未传递某个参数,该参数在函数内默认值为undefined(除非设置了默认参数)。function greet(name) { console.log(name); // 未传递参数时为undefined } greet(); // undefined
三、对象与数组:无效的访问
-
访问对象不存在的属性
尝试获取对象中不存在的属性时,返回undefined(不会报错)。const user = { name: 'Alice' }; console.log(user.age); // undefined(age属性不存在) -
访问数组越界的索引
数组索引超出实际长度范围时,返回undefined。const arr = [1, 2, 3]; console.log(arr[5]); // undefined(索引5不存在) -
删除数组元素后访问原索引
使用delete删除数组元素后,原索引位置值变为undefined(数组长度不变)。const arr = [1, 2, 3]; delete arr[1]; console.log(arr[1]); // undefined
四、操作符与表达式:特殊场景
-
void操作符
void操作符会执行表达式,但始终返回undefined(常用于阻止默认行为,如href="javascript:void(0)")。console.log(void 123); // undefined console.log(void (a = 5)); // undefined(a被赋值为5,但返回undefined) -
解构赋值时未匹配到值
解构对象/数组时,若目标属性/索引不存在,变量会被赋值为undefined。const { age } = { name: 'Bob' }; console.log(age); // undefined(对象中无age属性) const [a, b] = [1]; console.log(b); // undefined(数组中无第二个元素)
五、问题
1. 问:undefined和null的区别是什么?
- 答:
undefined是“未定义”(变量未赋值、属性不存在等场景的默认值),null是“空值”(需显式赋值,表示故意清空一个值)。例如:let a;中a是undefined,let b = null;中b是null。
2. 问:如何判断一个变量的值是undefined?
- 答:推荐用
typeof(typeof x === 'undefined'),或严格相等(x === undefined)。注意避免用非严格相等(x == undefined会同时匹配null)。
总结
“JavaScript中undefined表示‘未定义’,常见场景包括:变量声明后未赋值、函数无return语句、访问对象不存在的属性、数组越界索引等。它和null的区别在于,undefined是默认状态,null是显式清空的值。实际开发中,可通过typeof或严格相等判断undefined,避免因未定义的值导致逻辑错误。”