iT邦幫忙

2

[ JS個人筆記 ] 資料型別—DAY1

資料型別

為何需判斷型別,其因為電腦在執行時,需先判斷資料是何種型別,才可採取運算方式。例如數字123與字串的123的處理方式。

除了基本型別(Primitives)外,剩餘的皆為物件型別(Object)

基本型別

number、string、boolean、null、undefined、symbol

  • undefined vs null

    • undefined => 變數已宣告,但無賦值
    • null => 指該變數"目前"沒有值
  • null 是基本型別之一,但 typeof null 卻得到 object,而非 null!

  • 可用 typeof 來檢測值的資料型別(typeof回傳都會是字串)

typeof 1234567; // 'number'
typeof 'Hello World!'; // 'string'
typeof true; // 'boolean'
typeof null; // 'object'
typeof undefined; // 'undefined'
typeof Symbol(); // 'symbol'

常見物件

Object

  • 可使用 new Object() 建立物件

  • 或使用大括號{}直接寫入物件與其值(此種方式稱 物件實字 Object literal)

  • 物件存取方式可透過 「.」點 或是 [ ]中刮號 進行存取(若物件所引有空白字串或數字,則使用中括號存取)

  • 可使用 in運算子 與 hasOwnProperty() 方法,判斷物件的屬性是否存在

    • hasOwnProperty()不會檢查物件的原型鏈(prototype chain),只檢查物件本身
    • 而 in運算子會繼續順著物件原型鏈上檢查

Array

  • 在 JS 中並沒有 Array 這個型別,它一樣屬於物件,其在記憶體中的位置也不是連續的。

  • 長度由length屬性取得,且其屬性值可被覆寫(字串length則無法覆寫),故長度可隨時增減,且就算指定索引元素,也無須連續指定

  • 可使用 isArray() 方法判斷是否為陣列


Function

  • 函式只是物件的"一種"
  • function 跟物件一樣有屬性(property)
  • 雖然說 function 是物件的子型別,但 typeof function() {} 是得到 function 而非 object
function greet() {
  console.log('Hello');
}

greet.language = 'english';

輸入 console.log(greet.language),則是會顯示 greet.language 的值
這樣的例子說明了,function只是一種特殊的物件,它可以被當作物件來使用。

奇怪總結

  • null 是基本型別之一,但 typeof null 卻得到 object,而非 null!

  • function 是物件的子型別,但 typeof function() {} 是得到 function 而非 object

  • NaN 表示是無效的數字,但依舊還是數字,因此在資料型別的檢測 typeof NaN 結果就是 number,不要被字面上的意思「不是數字」(not a number)給弄糊塗了。另外,NaN 與任何數字運算都會得到 NaN,並且 NaN 不大於、不小於也不等於任何數字,包含 NaN 它自己。

面試常見題

  1. 請問以下 a、b、c、d、e 的型別是?
var a = true;
var b = 'undefined';
var c = 1;
var d = null;
var e = NaN;

Ans:boolean / string / number / object / number

  1. 請問當使用了 new Number() 建立資料後,此時使用 typeof() 會出現什麼型別?
    Ans:object

  2. 在以下代碼中,typeof a和typeof b的值分別是什麼:

function foo() { 
let a = b = 0;
a++;
return a; 
} 

foo();
typeof a; 
typeof b; 

Ans:typeof a是 'undefined'。變數a僅在 foo()範圍內宣告,在外部不可用。
typeof b等於'number'。因b無宣告,故b汙染全域變數。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

2
良葛格
iT邦新手 2 級 ‧ 2021-07-29 12:28:34

你談的應該是資料型別,而不是變數型別,JavaScript 的變數沒有型別之分。

ㄚ淳淳 iT邦新手 4 級 ‧ 2021-07-29 13:18:50 檢舉

好的!謝謝!我在更正~

我要留言

立即登入留言