关于JS数据类型的Q&A

JS中的数据类型

本篇博客的主题是JS数据类型,我结合了阮一峰JS教程总结出了一些问题,方便自己日后的复习与总结。JavaScript语言中共有七种数据类型,分别是:

  1. number(数值型)
  2. string(字符串)
  3. boolean(布尔型)
  4. undefined(未定义)
  5. null(空)
  6. object(对象)
  7. symbol(独一无二的值)

从简单的小问答理解各个数据类型

1:0.1+0.2=?

0.1+0.2=?这不仅仅是学习JS要注意的坑,实际上学习任何编程语言都一样,我们需要铭记只要涉及到浮点数运算,那么结果就是一个不靠谱的值。


1



值得一提的是,在JS中所有的数字都是以64位浮点数的形式进行存储的。也就是说在JS底层中压根就没有整数这样的一个概念。某些运算只有整数才能完成,JS在涉及到整数时,会将64位的浮点数自动转化为32位整数。

2:typeof NaN 返回什么?

NaN是JS的一个特殊值,全称为Not a Number。在我们进行一些错误的运算时例如:1-'a' 就会返回NaN这样一个结果。typeof 运算符则会返回一个值的数据类型。那么Not a Number的数据类型是什么呢?


a



是的,NaN它说自己不是一个Number, 但是它的类型依然属于Number数值型。别问,问就是研究过。

3:JS中的正零,负零,正无穷与负无穷相关计算

JavaScript中数字会以64位浮点数形式进行存储,其中第1位是符号位,0代表正数,1代表负数。这其实会造成一个问题,那就是任何一个数字都会有一个正值和一个负值,当然也包括了0。JS内部中实际上存在着2个0,一个是+0一个是-0,好在它们是等价的即:


2



JS中Infinity代表无穷,无穷自然也分正负,Inifinity用来表示正无穷,-Inifinity即是负无穷。那么,什么样的运算能得到正无穷和负无穷呢?这时候正零与负零就排上用场了。

3



接下来,看几个数学题:

4



0/0的结果返回为NaN这一点我们都可以理解。但是后面的部分计算结果有没有出乎大家的意料呢?


首先是0*Infinity,大部分人想到的答案是0,但实际上结果应该是NaN。首先0*Infinity是无法直接进行计算的,因为这两个数在数学中代表的概念一个是无穷小,一个是无穷大,两者相乘得到的结果一定是NaN。如果你还是不理解,可以这样想:

0*Infinity -> (1-1)*Infinity
(1-1)*Infinity -> Infinity-Infinity

一个无穷大的数减去一个无穷大的数自然是得不到结果的。0/Infinity思考方法大体相同:

0/Infinity -> 0/Infinity*1
0/Infinity*1 -> 0*(1/Infinity)
0*(1/Infinity) ->0*0

0乘以0的结果自然是0。

4:parseInt(12e2)和parseInt('12e2')分别返回什么?

这道题的考点有二:第一,e或E是数值的一种表示方法:科学记数法。12e2代表的含义是12*10^2即1200。第二:parseInt()方法。parseInt是用于将字符串转化为整数的一个方法。当parseInt()内部传入的并非是一个字符串时,则JS会将内部的非字符串转化为一个字符串再将字符串转换为整数。对于parseInt('12e2')而言,JS先将一个个字符进行转换,当遇到不能转为数字的字符e就无法进行转换了,所以结果返回为12。而parseInt(12e2)则不同,JS首先会将科学记数法表示的12e2解析为1200,然后将1200转化为字符串'1200',结果自然是1200.

b



当然,JS不仅会将科学记数法表示的数字进行解析,还会对某些数字自动转换成科学记数法。

parseInt(0.0000001)

d



上例中,JS首先将0.0000001转化为科学记数法表示的1e-8 然后再将其转化为字符串'1e-8' ,使用parseInt()方法得到的结果为1。

5:parseFloat('')与parseFloat(null)分别返回什么?

parseFloat()方法为将一个字符串转换为浮点数。其实,无论是parseFloat('')还是parseFloat(null),亦或是parseInt(''),parseInt(null)返回的结果都是NaN。别问,问就是研究过。

6:undefined与null有什么区别?

这道题有一定几率会出现在面试当中。其实,undefined和null几乎是没有什么区别的,甚至使用JS中的相等运算符比对二者返回的结果都是true.


n



既然非要谈区别,就不得不说undefined被设计出来的原因。JS的设计者Brendan在设计JavaScript语言时被要求JS的语法必须要像Java,为什么?别问,问就是研究过。所以说,最开始,JS像Java一样只设置了null,null在Java当中表示为一个空对象,这也是JS中,如果使用typeof(null)返回的结果为object的原因,当然这是一个BUG,因为null也是一种数据类型呀...

z



根据编程语言自C开始留下的传统,null可以自动转化为0.

z



可是当时的JS并没有错误处理机制,如果一个null值自动转化为0,那么就会出现不容易被发现的错误。再加上JS的设计者Brendan觉得一个表示为“无”的值最好不是一个“对象”。所以undefined就被设计出来了,将undefined转化为一个数值型时,这个值会是NaN。

v



当然Brendan自己也说过:JavaScript原创之处并不优秀,优秀之处并非原创。现在web设计者普遍会这么用:

  • 如果一个变量(非对象)没有赋值,通常会给这个变量一个undefined。
  • 如果一个对象,现在还不想给值,通常赋予null。

7:isNaN(undefined)与 isNaN(null)返回的结果是什么?

看过第六题后,这道题就很容易了。Number(undefined)返回值为NaN,Number(null)返回值为0。所以isNaN(undefined)返回结果为true,isNaN(null) 返回结果为false。

8:isFinite(undefined)与 isFinite(null)返回的结果是什么

isFinite()方法返回一个布尔值,表示某个值是否为正常的数值。它是一个和isNaN()对立的方法,后者表示的是是否为一个非数值。所以isFinite(undefined)返回的结果为false,isFinite(null)返回的结果为true。但是需要注意的是isFinite(Infinity)isFinite(-Infinity)返回的值为false,
isNaN(Infinity)isNaN(-Infinity)返回的结果也是false。为什么?别问为什么,问就是研究过。

9:var s = 'hello';console.log('hello'[1])结果为?

这道题其实根前面的var s = 'hello';毛关系都没有。字符串其实可以被看作为字符数组,就是这道题想要表达的含义

image



所以打印出的结果为'e'.

10:var s = 'hello';delete s[0];console.log(s)的结果为?

上一题说过,字符串其实可以被看做字符数组,但是字符串终究是字符串,我们无法改变字符串中的单个字符。

image


11:'𝌆'的unicode为'\u1D306'。'𝌆'.length=?

这道题涉及到了JS编码的问题,JavaScript使用了Unicode字符集,但并非是UTF-8编码,而是UCS-2。
为什么呢?因为那时候,UTF-8还没有被发明出来。所以ES5出现了一个BUG,那就是无法表示'\uFFFF'之后的字符,即一旦字符长度超过两个字节,ES5之前包括ES5都会认为长度超过了一个字符的长度。虽然'\u1D306'仅仅代表一个字符'𝌆',但是还是'𝌆'.length的结果还是返回为两个字符的长度即2。

12:Base64是什么?

Base64 是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、+和/这64个字符组成的可打印字符。使用它的主要目的,不是为了加密,而是为了不出现特殊字符,简化程序的处理。原生JS提供两个Base64相关的方法即:

  • btoa():将任意值转化为Base64编码
  • atob():Base64编码转化为原来的值

13:var a={};var b=a;a.foo=1;console.log(b.foo)会输出什么?

结果是:1。因为变量a,b都指向了同一个对象。

14:var person={name:'Kim'} console.log(person[name]);打印出了什么?

答案是会报错:Unexpected identifier。因为person的key只有'name',要想获取key对应的value可以使用person['name']person.name其中 person.name就相当于person['name']。如示例:

var person = {name:'DobbyKim'}
for(var key in person){
    console.log(person.key);
}

上面的代码运行后也会报相同的错误,因为person.key 就相当于person['key'],而person对象在声明中是没有这样的一个key的。

15:function f(){} typeof f;返回的结果是什么?

返回的结果为:

image



其他类型:

image



别问,问就是研究过

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 变量 声明变量 命名变量区分大小写的语言第一个字符是字母或下划线_,数字不能作为第一个字符字符必须是字母,数字或者...
    flyingtoparis阅读 789评论 0 0
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,092评论 0 21
  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 1,628评论 0 6
  • JS中数据类型分为2种:基本数据类型和复杂数据类型(引用数据类型)。 【判断数据类型】typeof和instanc...
    梅子_may阅读 622评论 0 0
  • 第三章 基本概念 3.1 语法 ECMAScript标识符一般采用驼峰大小写格式,也就是第一个字母小写,剩下的每个...
    小雄子阅读 523评论 0 1