javascript數據類型

1. JavaScript 定義了幾種數據類型? 哪些是原始類型?哪些是復雜類型?原始類型和復雜類型的區別是什么?

JavaScript 語言的每一個值,都屬于某一種數據類型。JavaScript 的數據類型,共有六種。(ES6 又新增了第七種 Symbol 類型的值)分別為:

數值(number)
字符串(string)
布爾值(boolean)
undefined
null
對象(object)
數值、字符串、布爾值稱為原始類型(primitive type)的值
對象稱為合成類型(復雜類型)(complex type)的值
undefined 和 null 一般看成兩個特殊值
-復雜對象可以細分,而原始對象不能細分,且副贊對象可以看作是多個原始對象的合成;

2. typeof和instanceof的作用和區別?

  • typeof可以檢測給定變量的數據類型,但是有局限性,對于Array、Null等特殊對象使用typeof一律返回object。 此外,typeof可以用來判斷一個變量是否存在,或者是未被定義 if (typeof v === "undefined") {}
  • 既然typeof對數組(array)和對象(object)的顯示結果都是object,那么就需要 instanceof(非唯一方法) 進行區分。
    instanceof用于判斷一個變量是否某個對象的實例,比如 var a = []; 那么 a instanceof Array 就會返回true。

3. 如何判斷一個變量是否是數字、字符串、布爾、函數

使用typeof, 能返回字符串,里面告訴了什么類型,未定義、 數字、字符串、布爾、函數、分別對應,"undefined"、"number"、"string"、"boolean"、"function"。

4. NaN是什么? 有什么特別之處?

NaN含義是Not a Number,即非數值,是一個特殊的數值,用于表示一個本來要返回數值的操作數未返回數值的情況(這樣就不會拋出錯誤了)。

特殊之處

任何涉及NaN的操作(例如NaN+10)都會返回NaN
NaN和任何值都不相等,包括NaN本身(例如 NaN == NaN //false)

5. 如何把非數值轉化為數值?

   Number()
   parseInt()
   parseFloat()

Number()

  • Number()可以用于任何數據類型,布爾值 true=>1, false=>0. 數字則是簡單傳入,null=>0, undefined=>NaN,
  • 字符串
    字符串只包含數字(十進制、八進制、十六進制)都會轉換成十進制;
    字符串包含有效的浮點格式,則轉換為對應的浮點數值;
    字符串是空的(包括空格字符),都轉換為0;
    如果字符串包含除上述格式之外的字符,則將其轉換為NaN, 這意味著需要parseInt() 和 parseFloat() 進一步對字符串進行更合理的轉換。
  • 如果是對象,則調用對象的valueOf()方法,然后依照前面的規則轉換返回的值。如果轉換結果是NaN,則繼續調用對象的 toString() 方法,然后再次依照規則轉換返回的字符串值。

parseInt() 和parseFloat()

  • 都是對字符串進行數制轉換。前者是針對整數格式,后者是解析包括整數在內的浮點格式的數值。
  • parseInt()可以指定第二個參數作為轉換時的基數,指定有多少進制進行轉化,比如parseInt(111,2) 結果是7,如果不指定parseInt(111), 則默認是十進制進行解析轉換,那么結果就是111,除了指定二進制,你還可以指定其他進制。
    因此多數情況下,我們要解析的都是十進制數值,因此還是建議指定10,避免錯誤解析。
  • 相同點
    忽略字符串前面的空白字符,找到第一個非空白字符
    如果第一個字符不是-或者數字返回NaN
    0開頭會當做八進制,0x開頭會當做十六進制
    如果是繼續解析,直到非數值模式為止
    如果是空字符串(包括含有空格的字符串),則返回NaN

6. ==與===有什么區別

5=='5'
使用相等比較運算符的時候,會將string '5',自動轉換成number 5,進行比較,從而可以滿足比較條件,因為 5 == 5。

5==='5'
使用 === 嚴格相等 的比較運算符時, 則不會自動做轉換處理,顯然 number 5 ,是不會和 string '5',相等的。因此,返回boolean的 false值。

  • 所以一般做判斷時用===

7. break與continue有什么區別

for( var i = 1; i < 5; i++ ){
if( i === 3 ){
break;
}
console.log(i);
}
// 輸出為 1 2
// break 為強制退出整個循環體,執行后面的語句所以輸出 1 2 到此為止

for( var i = 1; i < 5; i++ ){
if( i === 3 ){
continue;
}
console.log(i);
}
// 輸出為 1 2 4
// continue 用于退出本次循環,執行下次循環
//所以 i === 3的時候,這一次退出循環,不再輸出 i,而是此后 繼續 i++,進行下一次的 i < 5 的判斷

8. void 0 和 undefined 在使用場景上有什么區別

例如

function fn() {
  var undefined = 3;
  var a;
  if(a === undefined ){
    console.log('===') 
  }else{
    console.log('!==')
  }
}
fn()

上面的代碼中,a雖然聲明變量了,但是沒有賦值,所以應該是未定義undefined,在接下來的條件判斷語句中,a應該會嚴格等于undefined。
但是在一開始,對 undefined 聲明并且賦值為3
Infinity、NaN、undefined 這三個詞雖然不是保留字,但因為具有特別含義,一般不應該用作標識符,但是強行用也是可以的。
這個時候,程序的結果是 !==, 顯然a !== undefined,嚴格不等于undefined,因為undefined是3, 實際上,a != undefined ,a 也不等于 undefined,徹底的不一樣了。

然而,a顯然還是undefined,未定義。這是個bug,怎么辦呢?所以要最保險的方法是是void操作符。
void運算符的作用是執行一個表達式,然后返回undefined。
根據這個特性,其他不變,把if判斷條件修改一下:

function fn() {
  var undefined = 3;
  var a;
  if(a === void 0 ){
    console.log('===') 
  }else{
    console.log('!==')
    console.log(a)
  }
}
fn()

此時 void 優先級高于 比較運算符 === ,所以 void 0 無腦返回 undefined,從而 a === 真正純天然無污染的 undefined。最后判斷結果是 布爾值 true。 輸出 ===

9. 以下代碼的輸出結果是?為什么?

console.log(1+1);   //輸出number 2
console.log("2"+"4");  //輸出string "24"
console.log(2+"4");  //輸出string "24"
console.log(+"4");  //輸出number 4

首先這些都是 運算符 + 在不同數據類型下具有的不同含義。

  1. 第一個很好理解,兩個參數都是數字,則此時的+就是加法運算。
  2. 兩個參數都是string,這時候會進行字符串的拼接,于是拼接成新的string "24"。
  3. 一個參數是number,但是另一個是string,那么會把number轉化成string,與另一個string進行拼接。所以結果還是string '24'。
  4. 最后一個,只有一個數字參數,則會返回其正數值。是number,直接返回number,是string,但里面是number,則還是返回number,如果是字符串,會嘗試轉換為數值,如果 console.log("jirengu"),則返回NaN。可以理解為 本性還是數值類型,但是字符串 jirengu,是沒辦法轉化成一個具體number值的。

10. 以下代碼的輸出結果是?

var a = 1;  
a+++a;  
typeof a+2;

結果是字符串 "number2"
為什么會這樣子?
因為這里的 + 實際上并不是算數運算符里面的加法運算符,而是代表字符串拼接。
a 不管怎樣,都是number類型,而typeof返回的是數據類型是string格式的(注意,這里不是說typeof返回的結果,告訴我們是string類型。)
至于第二行中 a+++a,實際上可以拆分成:
(a++)(+a)
理解為:
a=1
b=a
a= a+1
b+a

11. 以下代碼的輸出結果是? 為什么

 var a = 1;
 var b = 3;
 console.log( a+++b ); //輸出結果是4

結果是4, 首先++ 自增運算符優先級高于 + 加法運算符。 a++,表示參與當前的運算后(先賦值),再自增1。
所以是 1 + 3 = 4
這時候,再console.log(a) , 則返回 4

  1. 遍歷數組,打印數組每一項的平方
  • 平方
var arr = [3, 4, 5]
for(i = 0; i<arr.length; i++){
  console.log(arr[i]*arr[i])
} 
// 輸出為 9 16 25
  • 倒序遍歷數組并打印
 var arr = [100, 90, 80, 70, 60]
 for(var i = arr.length - 1; i >= 0; i-- ){
   console.log(arr[i])
 }
// 輸出為 60 70 80 90 100
  • 正序遍歷偶數序位的數組
var arr = [100, 90, 80, 70, 60, 50, 40]
for(var i = 1; i < arr.length; i += 2){
  console.log(arr[i])
}
// 輸出為 90 70 50

13. 遍歷 JSON, 打印里面的值

var obj = {
 name: 'hunger', 
 sex: 'male', 
 age: 28 
}
for( var key in obj ){
  console.log(obj[key])
}
// 輸出為 hunger male 28

14. 以下代碼輸出結果是? 為什么 (選做題目)

var a = 1, b = 2, c = 3; 
var val = typeof a + b || c >0
console.log(val) 
// 輸出 number2

typeof優先級最高,判斷a是"number",接著和 2 進行拼接,成為"number2",由于是 || 或運算符,所以左邊成立,右邊即可忽略,不會執行。 因此最后把"number" 賦值給 val,通過console.log(val) 的時候,就去掉了""

var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
// 輸出 bb undefined

因為先執行console.log 輸出bb,然后 d == 5為 true,然后&&右邊 console.log('bb') 無法被自動轉換為布爾值,不是true也不是false,而是undefined,于是就把undefined 賦值給了 data。

var data2 = d = 0 || console.log('haha')
console.log(data2)
// 輸出 haha  undefined

首先因為是console.log所以先無腦輸出haha, 然后 因為這是或運算符,左邊 0 轉化為false,所以繼續看右邊的,右邊console.log('haha')無法被有效的轉換為 布爾值boolean, 因此是undefined未定義。所以最后把 undefined賦值給 data2。
所以最后輸出兩行:
haha
defined
因為console.log()方法會自動換行

var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
// 輸出 2

原因很簡單, 首先括號優先級最高,其次里面有逗號運算符,雖然逗號運算符低的不要不要的, 但是可以讓我們去忽略逗號前面的 !"world"
所以返回的是逗號后面的表達式, "from here!!" 本來是無辜的字符串,但是使用了布爾運算符中的 ! 取反運算符,所以被偷偷轉換為布爾值,因為字符串非空,所以是true,進行了兩次取反,最后還是true。
然后再看!!"Hello" 同理,轉換為boolean值 true, 這時候 有個 加法運算符 + ,
于是布爾值 又被偷偷轉換為number參與 加法運算, true對應的是1,
所以
x = 1 + 1

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 強制轉換 強制轉換主要指使用Number、String和Boolean三個構造函數,手動將各種類型的值,轉換成數字...
    燈火闌珊Zone閱讀 483評論 0 3
  • 一、JavaScript 定義了幾種數據類型? 哪些是原始類型?哪些是復雜類型? 最新的 ECMAScript 標...
    zh_yang閱讀 375評論 0 0
  • 每天一句:每個月要讀一本書,離開學校了,你還要經常保持閱讀的習慣,大學時候,考前的通宵達旦,說明你具備快速學習的能...
    EndEvent閱讀 440評論 0 0
  • 什么是iconfont? 以前在做項目的時候經常使用到圖片資源,哪怕是一個勾或者叉都要加載圖片,最早是一張一張加載...
    zcynine閱讀 1,420評論 0 0
  • 萬物逆旅,百代過客,浮生若夢,為歡幾何?前不見古人后不見來者,而每一次孤身上路,一步步征途于當年帝國之版...
    空中的石頭1閱讀 193評論 0 3