關於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;返回的結果是什麼?

返回的結果爲:


其餘類型:


別問,問就是研究過
相關文章
相關標籤/搜索