目录
ES5中:5个基本数据类型 :number,boolean,string,null,undefined
引用数据类型:对象(数组,函数都可称为对象)
ES6中:1个基本数据类型:Symbol(独一无二的)
后面还会学的 Bigint
所以问JS的数据类型有哪几种
回答:number,boolean,string,null,undefined,Symbol,Bigint,对象 共8种
引入:
<script>
//JS中
var b = new Number(200);
var b = 200; //显示写法 隐式写法是var b = new Number(200);
b.age = 20;
console.log(b); //一个new Number(200);
console.log(b.age); //另外一个new Number(200); 两个是不同的
</script>
1.概述
Symbol()是一个内置全局函数,生成一个独一无二的的数据。
symbol是一个ES6标准中新增的一种基本数据类型,
Symbol类型数据的原理:保证每一个属性名都是独一无二的,从根本上防止属性名的冲突。
2.symbol值的生成
symbol 的值是通过 Symbol() 函数生成,
<script>
let data = Symbol();
console.log(data); //红色字体:Symbol() 表示Symbol数据
console.log(typeof data); //"symbol"类型
</script>
注意点:Symbol(),虽然像Array(),Object()等这些函数一样,是官方内置的函数,但是利用其生成symbol数据时却不用加new ,这是因为生成的 Symbol 是一个原始类型的值,并不是对象。
let A = new Object(); //像这种生成对象都要加new //生成symbol类型数据就不加new let data = Symbol();
每一个 symbol 的值都是唯一的,Symbol() 函数可以接受一个字符串作为参数,表示对该值的描述,因此即使定义 symbol 使用相同的参数互相之间也不是相同的:
<script>
let a1 = Symbol("G");
let a2 = Symbol("G");
console.log(a1 == a2); //false 不严格情况下都不相等,严格情况下更不相等
//这里通俗理解为:两个不同的人,叫相同的名字G,你能说是同一个不?
</script>
3.作为属性名的Symbol值
symbol 类型的值可以作为对象的属性标识符使用,这也是 symbol 类型设计的目的。
现在对象属性名可以为两种类型:一种就是原本的字符串类型,一种即为新增的 symbol 类型。由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。
<script>
let mySymbol = Symbol();
let mySymbol1 = Symbol();
console.log(mySymbol); //Symbol类型数据 Symbol()
let a = {};
a[mySymbol]= "hello";
a[mySymbol1] = "girl";
console.log(a); //{Symbol(): 'hello', Symbol(): 'girl'}
</script>
分析:看着a对象的两个属性名Symbol()是一样的,但是因为Symbol类型数据是每一个不一样的 ,所以是两个不同的属性名,只是形式一样而已
注意点:
1.Symbol作为对象属性名时,不能用点运算符。(点运算符后面总是字符串)
因为点运算符是给对象添加一个属性,而不是像[ 变量名] 一样引用变量的值作为对象的属性。
2.在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中。方括号中的属性名代表了Symbol值。
3.Symbol 值作为属性名时,该属性还是公开属性,不是私有属性。
4.symbol数据的总结注意
1.Symbol()
函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol
函数的返回值是不相等的。
2.symbol值不能与其他类型的值进行运算
<script>
let A = Symbol();
// console.log("aaaa" + A);//Cannot convert a Symbol value to a string
//无法将Symbol值 隐式 转换为字符串
console.log(1 + A); //Cannot convert a Symbol value to a number
//console.log(true + A); //布尔值会转为数字,Cannot convert a Symbol value to a
//number
</script>
3.虽然 symbol值 不能隐式转换为字符串,但是可以手动显示转换为字符串
<script>
let A = Symbol();
console.log(A); //红色字体:Symbol() symbol类型数据
console.log(A.toString());//黑色字体Symbol() 字符串类型数据"Symbol()"
</script>
那是否可以显示转换为其它数据类型呢?
<script>
let A = Symbol();
console.log(Boolean(A)); // true
console.log(Number(A));; // TypeError: Cannot convert a Symbol value to a number
</script>
总结:可以显示转换为字符串,和布尔值(不能与布尔值进行运算,比如说加法,布尔值会先转换为数字,但是symbol数据又不能跟数字型进行计算,所以不能。),不能转换为数字型数据。
4.通过 symbol.description 可以获得定义symbol型数据的描述(Symbol()的参数字符串)
<script>
let A = Symbol("girl");
console.log(A.description); //"girl"
</script>