背景:面试问到null与undefined区别,回的不是很满意,查阅一些资料做了简要复习记录,有不足和错望各位指正
先从二者进行简要认识查阅记录起:
undefined可能会出现地方
1,变量申明但未赋值
var name
console.log(name) // undefined
name返回undefind 因为name未赋有效值也未被使用过,始终处于原始状态
2,函数定义了行参
function test(name){
console.log(name) // undefined
}
test()
由于test定义了参数,但在执行test时候并未传参,导致name参数就是原始,为赋值的变量
3,对象Object.不存在的变量
console.log(Object.name) // undefined
以前我一直以为Object是简单的对象,结果今天(2020-4-10)打开浏览器控制台
console.log(Object)
结果是这样的:ƒ Object() { [native code] } 即使:function Object() { [native code] }
又是一脸懵逼,难道说Object原型是Function???
Function.prototype.name = function(){}
for(var i in Objetc){
console.log(i) // 输出了read
}
紧接着查阅了了MDN上的资料 [MDN关于Object][1]
Object 构造函数为给定值创建一个对象包装器。如果给定值是 null 或 undefined,将会创建并返回一个空对象,否则,将返回一个与给定值对应类型的对象。
当以非构造函数形式被调用时,Object 等同于 new Object()。
此处查阅了MDN Object
4,使用void对表达式求值 void是运算符
void 0 或者 void(0)// undefined
void false // undefined
void [] // undefined
注:ECMAScript 规范 void 运算符 对给定的表达式进行求值,返回都是 undefined
最终可说明一点,undefind是来自某个表达式最原始的状态值,并非人为操作而得
undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined
null 可能会出现的情况
字面意思就是没有值,null是JavaScript里面的关键字,表示没有值或者不存在任何值
即:在内存里的表示就是,栈中的变量没有指向堆中的内存对象
var test = null
console.log(test) //null
可以通过 Object.prototype.toString.call(null) // "[object Null]"
null是一个有效不存在值的对象
一个对象或者被赋值为null时,原来的对象在内存中就是一个找不到家的孩纸,垃圾回收会在某个时机收回该对象并释放内存。所有如果需要释放某个对象或者变量就简单赋值为null
总结:
null与undefined区别
1,类型不同
console.log(typeof null) // object
console.log(typeof undefined) // undefined
// 可通过以下或者各自真实类型
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
null是一个有效不存在值的对象,并且是不可改变的,undefined的对象类型是本身未定义最初状态值
小细节
变量等于null小栗子
var test = null
console.log(test*10) // 0
变量等于undefined小栗子
var test
console.log(test*10) // NaN
从上两小栗子可得出:
任何具有null值的变量算术运算(+,-,*,/)都会产生整数值,而任何具有undefined值的变量算术运算(+,-,*,/)会导致变量为NaN
2,转换为原始类型的方式不同
null与undefined转换类型不同,null在算术运算转换时会转为数字类型0,而undefined则不会执行任何转换即最终为NaN
null ---> 0
undefined ---> NaN
null转为0
var _null = 10 + null
console.log(_null) // 10
undefined 添加到数字则不转换
var _und = 10 + undefined
console.log(_und) // NaN
复习小记,有错望各位大佬指正,建议改进
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。