关于JS数据类型的Q&A

JS中的数据类型
javascript

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

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

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

1:0.1+0.2=?

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

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。bash

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。别问,问就是研究过。ide

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';毛关系都没有。字符串其实能够被看做为字符数组,就是这道题想要表达的含义


因此打印出的结果为'e'.

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

上一题说过,字符串其实能够被看作字符数组,可是字符串终究是字符串,咱们没法改变字符串中的单个字符。


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~九、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;返回的结果是什么?

返回的结果为:


其余类型:


别问,问就是研究过
相关文章
相关标签/搜索