资料型别
为何需判断型别,其因为电脑在执行时,需先判断资料是何种型别,才可採取运算方式。例如数字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 它自己。
面试常见题
请问以下 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
请问当使用了 new Number() 建立资料后,此时使用 typeof() 会出现什么型别?
Ans:object
在以下代码中,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汙染全域变数。