# 数据类型

## 8种数据类型（7种原始数据类型、1种复杂数据类型）

Number：代表数字，可以是整数或小数。 String：代表文本，可以使用单引号、双引号或反引号括起来。 Boolean：代表布尔值，只有两个可能的值，即 true 和 false。 Null：代表空值，表示一个变量没有值。 Undefined：代表未定义的值，表示一个变量没有被赋值。 Symbol：代表唯一的标识符，用于对象属性的键。 BigInt： 表示任意大小的整数

Object： 是一种无序名值对的集合 （复杂数据类型）

## typeof

typeof 操作符会返回下列字符串之一:

* "undefined"表示值未定义;
* "boolean"表示值为布尔值;
* "string"表示值为字符串;
* "number"表示值为数值;
* "object"表示值为对象(而不是函数)或 null;
* "function"表示值为函数;
* "symbol"表示值为符号。

## valueOf vs toString()

如果数据类型是字符串，先调用 valueOf() 方法，然后再调用 toString() 方法。 如果数据类型是数值、布尔值或 null，先调用 toString() 方法，然后再调用 valueOf() 方法。 如果数据类型是 undefined，直接报错。

```js
// 字符串
var str = "hello";
console.log(str.toString()); // "hello"
console.log(str.valueOf()); // "hello"

// 数字
var num = 123;
console.log(num.toString()); // "123"
console.log(num.valueOf()); // 123

// 布尔值
var bool = true;
console.log(bool.toString()); // "true"
console.log(bool.valueOf()); // true

// null
var n = null;
console.log(n.toString()); // "null"
console.log(n.valueOf()); // TypeError: Cannot convert null to object

// undefined
var u;
console.log(u.toString()); // TypeError: Cannot convert undefined to object
console.log(u.valueOf()); // TypeError: Cannot convert undefined to object

// let s1 = "some text";
// let s2 = s1.substring(2);
// =
let s1 = new String("some text");
let s2 = s1.substring(2);
s1 = null;

// Number
let numberObject = new Number(10);
let numberValue = 10;
console.log(typeof numberObject);             // "object"
console.log(typeof numberValue);              // "number"
console.log(numberObject instanceof Number);  // true
console.log(numberValue instanceof Number);   // false
let value = "25";
let number = Number(value);// 转型函数
console.log(typeof number);  // "number"
let obj = new Number(value); // 构造函数
console.log(typeof obj);// "object"

const b = BigInt(Number.MAX_SAFE_INTEGER);
console.log(typeof b);// "bigint"

```

## Symbol类型

符号是原始值，且符号实例是唯一、不可变的。 调用 Symbol()函数时，也可以传入一个字符串参数作为对符号的描述(description)，将来可以通 过这个字符串来调试代码。但是，这个字符串参数与符号定义或标识完全无关:

```js
let genericSymbol = Symbol();
let otherGenericSymbol = Symbol();
let fooSymbol = Symbol('foo');
let otherFooSymbol = Symbol('foo');
console.log(genericSymbol == otherGenericSymbol);  // false
```
