JavaScript基础

变量和类型

1.JavaScript规定的几种数据类型

JavaScript规范中一共定义了七种数据类型,分类基本类型和引用类型。
其中基本类型有:String、Number、Boolean、Undefined、Null、Symbol(es6)
引用数据类型:Object

2.JavaScript对象的底层数据结构是什么

在JavaScript中Object底层是使用FixedArray,一种类数组的方式来实现的,通过记录JSON数据格式的数据中的index与value来记录数据。这里推荐李银城大佬的博文,讲解的很详细。

从Chrome源码看JS Object的实现

3.Symbol类型在实际开发中的应用?如何可手动实现一个简单的Symbol?

首先我们先简单的看看Symbol的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!-- Symbol() -->
let s1=Symbol('symbol');
let s2=Symbol('symbol');

s1==s2 //false

s1.toString() // "Symbol(symbol)"
s2.toString() // "Symbol(symbol)"

<!-- Symbol.for() -->

let s3=Symbol.for('symbol')
let s4=Symbol.for('symbol')

s3===s4 //true

<!-- 隐式调用toString方法 -->

const returnString={
toString(){
return 'testSymbol'
}
}

let sbl=Symbol(returnString);

sbl //testSymbol

<!-- 对Symbol类型的转换 -->

Boolean(Symbol())//true

Number(Symbol()) // TypeError

<!-- Symbol在对象中的使用 -->
let symbolKey=Symbol();

let obj={}
obj[symbolKey]='123';

// or
let obj={
[symbolKey]:'123'
}

// or
let obj = {};
Object.defineProperty(obj, symbolKey, { value: '123' });


obj[symbolKey] //123

场景一:使用Symbol来做对象的属性名。

使用Symbol来做属性名时是没办法被Object.keys或者for in来枚举,就算使用JSON.stringify对其打印显示的也只是一个空对象

Ps:但是不是真的无法获取以Symbol方式定义的对象属性,例如使用Object.getOwnPropertySymbols(obj) ,Reflect.ownKeys(obj)  仍然是可以拿到对象属性。

场景二:使用Symbol来代替常量
因为Symbol的唯一性所以在命名一些常量时,其本身就是唯一的,减少命名的冲突