持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
日期:2022-05-26 周四
本题目已收录至专栏:《JavaScript每日一题》
目录
今日每日一题
前言
在ES6之前,JavaScript中基本数据类型为Number、String、Boolean、Null、Undefined,引用数据类型为Object,如果划分的再细致一点,Object中则又可以包含object、array、function,而判断数据是什么类型则使用typeof、instanceof,也可以使用toString搭配call来进行判断。而数据类型之间的关系也是错综复杂,比如 [] == 0
会返回true,这是因为在使用相等运算符比较时,[]
会调用valueof
方法,从而返回0,所以导致两者的比较结果为true,而像这种隐式类型转换的例子在JS中更是比比皆是。读到这里,还没吃疯狂星期四
的小伙伴要格外注意了,在开发中如果一定要对数据类型有所约束时,可以使用===
全等运算符来做进一步判断,也可以选用TypeScript
来进行开发。
题目
var a = {b: 1}
var b = {a: 2}
var obj = typeof (c)
obj++
if (obj == NaN) {
obj[a] = 3
}
obj[b] = 4
console.log(obj[a])
浅析
总的来说,今天的每日一题中我们需要注意的点有很多,而我们真正需要注意的点,其实只有一个——包装类
。首先我们应该知道typeof在判断一个未声明的变量时会返回什么,是undefined、null,还是报错?其次,obj[a] = 3
中的a既然为对象(object)类型,那么这个赋值操作是在做什么,这个值3最终给到了谁,会不会跟我们前言中所讲到的隐式类型转换有什么关联,相信如果这些都搞懂了,那么今天的题绝对是没有压力的。
昨日每日一题
题目
var f = function () {
if (!n) {
var n = n2 = 1
}
n = 2
}
f()
var n
var n2 = 3
f()
console.log(n,n2)
答案
undefined,1
解析
这道题我们先在大脑中过一下整体的代码,发现有一行var n = n2 = 1
,而这一行代码所对应的操作就是链式赋值
,相当于var n = 1; n2 = 1;
,我们要注意的是,n其实是使用var直接声明在f的函数作用域中,而n2则是直接加在了全局作用域中,我们在f函数外是可以通过window来访问到n2的值的;其次要注意的就是var拥有全局作用域和函数作用域,并不是只要用var声明了变量就一定会挂载到全局作用域中。那么这个搞明白了,我们再来把代码执行一遍。第一次调用f函数,由于!n
为true
,随后将n2的值设为1,而f函数中的n具有函数作用域,所以与全局作用域中的n毫无关联,在此我们不讨论n的声明与赋值。继续执行var n2 = 3
,将n2的值设为3,然后又执行了一遍f函数,n2的值又变回了1;所以打印结果为undefined,1
结语
如果你对本专栏《JavaScript每日一题》有任何建议,欢迎反馈,博主一定会耐心听取;如果你对今天的《每日一题》有任何问题、不懂的地方,请在评论区留言,与大家一起讨论吧~
创作不易,少年,就请留个赞再走吧!