又是疯狂星期四,这次我悟了,原来JS中的数据类型还可以这么考

678 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

日期:2022-05-26 周四
本题目已收录至专栏:《JavaScript每日一题》
1.jpg

目录

今日题

  1. 前言
  2. 题目
  3. 浅析 昨日题
  4. 题目
  5. 答案
  6. 解析 结语

今日每日一题

前言

在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函数,由于!ntrue,随后将n2的值设为1,而f函数中的n具有函数作用域,所以与全局作用域中的n毫无关联,在此我们不讨论n的声明与赋值。继续执行var n2 = 3,将n2的值设为3,然后又执行了一遍f函数,n2的值又变回了1;所以打印结果为undefined,1

结语

如果你对本专栏《JavaScript每日一题》有任何建议,欢迎反馈,博主一定会耐心听取;如果你对今天的《每日一题》有任何问题、不懂的地方,请在评论区留言,与大家一起讨论吧~
创作不易,少年,就请留个赞再走吧!