What is Symbol in ES6?

I used to be asked in an interview : Do you know Symbol in ES6? And I answered nope and explained other features such as lamda and ClASS. But it doesn’t help, however, the interviwer doesn’t care at all. :’(
Recent days I’ve tried to learn about Symbol.
MDN define it as below:

A symbol is a unique and immutable data type and may be used as an identifier for object properties. The Symbol object is an implicit object wrapper for the symbol primitive data type.

It makes me confused at first. I screamed inside my heart : What the fxxt is it ?
What is an implicit object wrapper ? The 7th basic type of data in JavaScript? Where should we use it?

And I tried to read some articles, most of that were same and translated into Chinese form English apparently. Bad translating and making people confused. What is 这里也有几个可能的问题。他们都与这样的事实相关,那就是你的代码不是唯一一个使用 DOM 的代码。? What does this sentence mean? I couldn’t read it once more.
I’d better read it from English cause it’ll be easier for me to understand.
I tried to use BABEL to translate symbol to ES5, but it doesn’t help either. It won’t compile this feature.
Finally I chose to try this feature in Chrome Devtool and figured out the usage of SYMBOL.

Practice is the best way to comprehend the

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var people_I_know = {}
var friend1 = Symbol("friend");
people_I_know[friend1] = {name: "Jude Law", gender: "male"}
var friend2 = Symbol("friend");
people_I_know[friend2] = {name: "Theo James", gender: "male"}
var uncle1 = Symbol("relative");
people_I_know[uncle1] = {name: "Bradley Cooper", gender: "male"}

//Object {Symbol(friend): Object, Symbol(friend): Object, Symbol(relative): Object}
console.log(people_I_know);
//even if I set variable friend1 or friend2 free. It won't influence object at all.
//The only difference is that I cannot access people named 'Jude Law'
//Luckily, ES6 also provides us **Object.getOwnPropertySymbols** to loop through all the symbols of an object
//and another one is **Reflect.ownKeys**. It will return an array in which includes all the property name of object


var friend3 = "friend",
friend4 = "friend";
people_I_know[friend3] = {name: "f3"};
people_I_know[friend4] = {name: "f4"};
//Aparently in this case object will only have a property "friend" and value "{name: 'f4'}"

We introduce Symbol in order to prevent the conflict of same property name. Everytime we call the Symbol, it will return a exclusive value for you. You’ll never need to worry about this issue.

参考链接
ES6学习笔记3—Symbol