[JS] undefined、null、ReferenceError的区别、变量作用域问题
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的区别、变量作用域问题相关推荐
- Javascript 中的非空判断 undefined,null, NaN的区别
JS 数据类型 在介绍这三个之间的差别之前, 先来看一下JS 的数据类型. 在 Java ,C这样的语言中, 使用一个变量之前,需要先定义这个变量并指定它的数据类型,是整型,字符串型,.... 但是 ...
- 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题
5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对 ...
- js call(),apply(),对象冒充,改变变量作用域
1.apply(); function box(n1,n2){return n1+n2; } function pox(n1,n2){alert(box.apply(this,[n1,n2])); / ...
- js中null和undefined的区别
在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理. 总所周知:null == un ...
- uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...
理解:let变量的作用域只能在当前函数中 js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客blog.csdn.net 全局作用域中,用 const 和 l ...
- js 中null,undefined区别
首先摘自阮一峰先生的文章: 大多数计算机语言,有且仅有一个表示"无"的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nil. 有点奇 ...
- [js] js中的undefined和 ReferenceError: xxx is not defined 有什么区别?
[js] js中的undefined和 ReferenceError: xxx is not defined 有什么区别? undefined是变量已声明,但未赋值 ReferenceError: x ...
- js中null和undefined区别
null是空对象引用,引用指向为空 undefined是只定义了引用 typeof null:"object" typeof undefined : "undefined ...
- css里面的let,js中let和var定义变量的区别
javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是"javascript 严格模式",比如下述的代码运行就会报错: let hello = ' ...
最新文章
- 字符串中 去掉字符串前后空格以、'\t'(tab) C函数实现,附sscanf正则方式
- shell实例第16讲:猜拳游戏
- step1 . day3 C语言基础
- 大数据(11) - kafka的安装与使用
- How is SCM product maintenance tcode redirecting access to MARA
- 三线调速风扇原理_学修电风扇~风机转速慢、调速失灵故障维修。
- RHEL 7.2 + Oracle 12cR2 + RAC
- 筚路蓝缕的十九年,天翎经历了什么?
- php 多图合成一张,多张图片拼成一张图,支持图片拼接功能,多种拼图模板的软件...
- 【AI学习笔记】退出 Anaconda 虚拟环境时 遇到的两种报错。
- 阴阳师ios和android,《阴阳师》App Store表现优异,安卓苹果惊喜同服
- PDF Expert for Mac最新2020注册码激活版下载
- 原生JS写一个首字母排序的通讯录效果
- 国家规定的三级分销违法吗?
- Mac必备效率软件|Alfred的基础使用教程
- 计算机程序设计理论知识,计算机程序设计员理论知识试卷
- 推特算法,分布式ID
- 芳华难回首,中年再出发——寄语2018的通信行业
- 情人节,请问你愿意为你们的爱情买一份保险吗?
- Android 语音遥控器的整体分析-底层实现机制分析
热门文章
- 2022-2028年中国中密度纤维板市场投资分析及前景预测报告
- 不同编程语言之间的具体实现对比
- Go 知识点(19)— Go 语言中的野指针
- 2022-2028中国曝光机市场现状及未来发展趋势
- 智能文档理解:通用文档预训练模型
- BERT大火却不懂Transformer?读这一篇就够了 原版 可视化机器学习 可视化神经网络 可视化深度学习...20201107
- Android数据持久化:文件存储
- 合肥工业大学—SQL Server数据库实验七:数据查询
- SpringBoot配置文件YAML配置注入(详解)
- Tomcat 1099端口占用重启无效,查不到进程,改换端口无效解决方案