文章结构

  • 数据类型
    • 数据类型分类
    • 值类型与引用类型
  • 面试题

数据类型

数据类型分类

最新的 ECMAScript 标准定义了 8 种数据类型,包括 7 种原始数据类型(或叫做基本数据类型):

  • Boolean
  • Number
  • BigInt(BigInt 类型的数字必须加n后缀)
  • String
  • Symbol
  • Undefined
  • Null

其中,SymbolBigInt是 es6 后新增的类型。

和 1 种引用数据类型:

  • Object

值类型与引用类型

  • 值类型:值类型包括 7 种原始数据类型,值类型是按值传递的。
1
2
3
4
5
var a = 10;
var b = a;
b = 20;
console.log(a); // 10
console.log(b); // 20
  • 引用类型:引用类型是包括 Object 类型的所有,例如 Array、Date、Function。引用类型是按照共享传递的。
1
2
3
4
5
6
var a = { x: 10, y: 20 };
var b = a;
b.x = 100;
b.y = 200;
console.log(a); // {x: 100, y: 200}
console.log(b); // {x: 100, y: 200}

面试题:

  1. 题目:undefinednull的区别:
  • undefined:指缺少值。当一个申明了的变量未被初始化,此时它的值就是 undefined。
  • null:指空值。表示此处不应该有值。
  1. 题目:类型判断用到哪些方法?
  • typeof

typeof xxx 可以判断的类型有 boolean,number,bigint,string,symbol,undefined,function,object 。

1
2
3
4
5
6
7
8
9
typeof null // object 这是typeof的一个bug

// typeof判断对象和数组时都是object
typeof [1, 2, 3] // object
type {x: 10} // object
typeof Symbol('123') // symbol
typeof 123n // bigint
function test() {}
typeof test // function
  • instanceof

常用于实例和构造函数之间的判断。

1
[1, 2] instanceof Array; // true
  1. 题目:手写实现typeofinstanceof

typeof

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function getType(temp) {
// 获取传入变量的构造函数并转换为字符串。
let str = temp.constructor.toString();
return str.splice(9, str.indexOf('(')).toLowerCase();
}

getType(1); // number
getType('123'); // string
getType(false); // boolean
getType(123n); // bigint
getType(Symbol(111)); // symbol
getType(null); // Cannot read property 'constructor' of undefined
getType(undefined); // Cannot read property 'constructor' of undefined
getType([1, 2, 3]); // array
getType({ x: 10 }); // object