undefined、null、ReferenceError的区别

null表示"没有对象",即该处不应该有值。
典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。

undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。
典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。

ReferenceError:
不定义就直接用,报错!


接下来是示例演示:

var a = 10;
console.log(a);
console.log(b);

b没有被定义时,输出什么?

答案是,不定义时,会报错。

那么定义之后不赋值会输出什么呢?

let a = 10
let b
console.log(a)
console.log(b)


定义之后不赋值,输出的是undefined

综合完整代码:

let a = 10
let b
let c = []
let d = ''
console.log('a=', a)
console.log('!a=', !a)
console.log('!!a=', !!a)
console.log('!!!a=', !!!a)
console.log('---')
console.log('b=', b)
console.log('!b=', !b)
console.log('---')
console.log('c=', c)
console.log('!c=', !c)
console.log('---')
console.log('d=', d)
console.log('!d=', !d)
console.log('---')
function fun(e) {console.log('e=', e)console.log('!e=', !e)
}
fun()
console.log('---')
var g = new Object()
console.log('g.data=', g.data)
console.log('!g.data=', !g.data)
console.log('---')
console.log('Object.getPrototypeOf(Object.prototype)=', Object.getPrototypeOf(Object.prototype))
console.log('!Object.getPrototypeOf(Object.prototype)=', !Object.getPrototypeOf(Object.prototype))

输出:

由此可见

  • 第一个!取布尔值取反,往后每个!都是取上一个布尔值再取反。
  • 定义了有值就输出该值,没有值就输出undefined
  • 空字符串会输出空字符串,空数组就输出空数组
  • 在函数中,也算是定义了但没赋值,所以是undefined
  • 在Object里,没有被定义的,不知道有没有的子属性,是undefined
  • 唯独一个null:Object.getPrototypeOf(Object.prototype)

关于每个变量的布尔值如下:

let a = 10
let b
let c = []
let d = ''
console.log('a=', a)
console.log('Boolean(a):', Boolean(a)) //trueconsole.log('---')console.log('b=', b)
console.log('Boolean(b):', Boolean(b)) //falseconsole.log('---')console.log('c=', c)
console.log('Boolean(c):', Boolean(c)) //true
console.log('Boolean(b == c):', Boolean(b == c)) //falseconsole.log('---')console.log('d=', d)
console.log('Boolean(d):', Boolean(d)) //false
console.log('Boolean(b == d):', Boolean(b == d)) //falseconsole.log('---')function fun(e) {console.log('e=', e)console.log('Boolean(e):', Boolean(e)) //falseconsole.log('Boolean(b == e):', Boolean(b == e)) //true,都是定义了,没赋值
}
fun()console.log('---')var g = new Object()
console.log('g.data=', g.data)
console.log('Boolean(g):', Boolean(g)) //true
console.log('Boolean(g.data):', Boolean(g.data)) //false
console.log('Boolean(b == g):', Boolean(b == g)) //falseconsole.log('---')console.log('Object.getPrototypeOf(Object.prototype)=', Object.getPrototypeOf(Object.prototype))
console.log('Boolean(Object.getPrototypeOf(Object.prototype)):', Boolean(Object.getPrototypeOf(Object.prototype)))

由此可见,有值为true毋庸置疑,空数组(Array)为true,空对象(Object)为true,其余皆为false。
特别:空对象里面的不知道有没有的属性:false。

空值之间的相互等价判断呢

答案是不同类型的,判为false。都是undefined,判为true。
就像图中,b和g都是Undefined,相等。
其实某种意义上来讲g.data也是定义了没赋值。既然定义了g这个对象,那么里面的属性也一起被定义,但是没有拿出来被赋值。


变量作用域的问题

let a = 10
function fun(e) {console.log('e=', e)console.log('a(before):', a)a = 1console.log('a:', a)a = 1console.log('++a:', ++a)a = 1console.log('a++:', a++)
}fun()
console.log('a(after):', a)
// console.log(e)

运行结果:

如果去掉代码中最后一行的注释,会报错,因为在函数外面不认识e是谁~
++a:先自增,再输出。
a++:先输出,再自增。

如果不给a重新赋值呢?

let a = 10
function fun(e) {console.log('e=', e)console.log('a(before):', a)a = 1console.log('a:', a)console.log('++a:', ++a)console.log('a++:', a++)
}fun()
console.log('a(after):', a)
// console.log(e)

运行结果:

还是符合刚才得出的结论,第一个,先自增,再输出。第二个,先输出,再自增。执行完之后,此时的a已经变成了3

[JS] undefined、null、ReferenceError的区别、变量作用域问题相关推荐

  1. Javascript 中的非空判断 undefined,null, NaN的区别

    JS 数据类型 在介绍这三个之间的差别之前, 先来看一下JS  的数据类型. 在 Java ,C这样的语言中, 使用一个变量之前,需要先定义这个变量并指定它的数据类型,是整型,字符串型,.... 但是 ...

  2. 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题

    5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对 ...

  3. js call(),apply(),对象冒充,改变变量作用域

    1.apply(); function box(n1,n2){return n1+n2; } function pox(n1,n2){alert(box.apply(this,[n1,n2])); / ...

  4. js中null和undefined的区别

    在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理. 总所周知:null == un ...

  5. uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

    理解:let变量的作用域只能在当前函数中 js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net 全局作用域中,用 const 和 l ...

  6. js 中null,undefined区别

    首先摘自阮一峰先生的文章: 大多数计算机语言,有且仅有一个表示"无"的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nil. 有点奇 ...

  7. [js] js中的undefined和 ReferenceError: xxx is not defined 有什么区别?

    [js] js中的undefined和 ReferenceError: xxx is not defined 有什么区别? undefined是变量已声明,但未赋值 ReferenceError: x ...

  8. js中null和undefined区别

    null是空对象引用,引用指向为空 undefined是只定义了引用 typeof null:"object" typeof undefined : "undefined ...

  9. css里面的let,js中let和var定义变量的区别

    javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是"javascript 严格模式",比如下述的代码运行就会报错: let hello = ' ...

最新文章

  1. 字符串中 去掉字符串前后空格以、'\t'(tab) C函数实现,附sscanf正则方式
  2. shell实例第16讲:猜拳游戏
  3. step1 . day3 C语言基础
  4. 大数据(11) - kafka的安装与使用
  5. How is SCM product maintenance tcode redirecting access to MARA
  6. 三线调速风扇原理_学修电风扇~风机转速慢、调速失灵故障维修。
  7. RHEL 7.2 + Oracle 12cR2 + RAC
  8. 筚路蓝缕的十九年,天翎经历了什么?
  9. php 多图合成一张,多张图片拼成一张图,支持图片拼接功能,多种拼图模板的软件...
  10. 【AI学习笔记】退出 Anaconda 虚拟环境时 遇到的两种报错。
  11. 阴阳师ios和android,《阴阳师》App Store表现优异,安卓苹果惊喜同服
  12. PDF Expert for Mac最新2020注册码激活版下载
  13. 原生JS写一个首字母排序的通讯录效果
  14. 国家规定的三级分销违法吗?
  15. Mac必备效率软件|Alfred的基础使用教程
  16. 计算机程序设计理论知识,计算机程序设计员理论知识试卷
  17. 推特算法,分布式ID
  18. 芳华难回首,中年再出发——寄语2018的通信行业
  19. 情人节,请问你愿意为你们的爱情买一份保险吗?
  20. Android 语音遥控器的整体分析-底层实现机制分析

热门文章

  1. 2022-2028年中国中密度纤维板市场投资分析及前景预测报告
  2. 不同编程语言之间的具体实现对比
  3. Go 知识点(19)— Go 语言中的野指针
  4. 2022-2028中国曝光机市场现状及未来发展趋势
  5. 智能文档理解:通用文档预训练模型
  6. BERT大火却不懂Transformer?读这一篇就够了 原版 可视化机器学习 可视化神经网络 可视化深度学习...20201107
  7. Android数据持久化:文件存储
  8. 合肥工业大学—SQL Server数据库实验七:数据查询
  9. SpringBoot配置文件YAML配置注入(详解)
  10. Tomcat 1099端口占用重启无效,查不到进程,改换端口无效解决方案