一、js数据类型
- 基本(简单、原始)数据类型:number/string/boolean/undefined/null/symbol/bigint
- 引用(复杂)数组类型:object(function,array,date)
1、symbol是什么?有什么作用?使用场景?
symbol是es6新增的基本数据类型,叫做符号。符号实例是唯一的不可变的。
作用:确保对象属性使用唯一标识符,不会发生属性冲突。
- 使用场景:
(1)作为对象唯一属性名
确保对象属性名的唯一性,避免命名冲突。
javascript"> let gender = Symbol();let people = {};people[gender]='女';console.log(people[gender]);//女
(2)作为对象属性的隐藏标识
利用symbol()给对象定义一些不想对外操作和访问的属性。
因为,symbol()类型定义的对象的key值不能通过object.keys()或者for in来枚举。
javascript"> let gender = Symbol();let person = {name: 'cgp',age: 18,[gender]: '女',};for (const key of Object.keys(person)) {console.log(key);//name age}for (let key in person) {console.log(key); //name age}
(3)定义常量
当需要定义的常量很多时,要考虑到常量唯一值的设定。当用symbol来定义常量,后面想要修改常量的值就会抛出错误。
javascript"> const PI = Symbol('π');// 由于Symbol的唯一性,我们可以确保PI不会被意外修改// 尝试修改PI的值会抛出错误PI = 3.14; // 这会抛出错误 Uncaught TypeError: Assignment to constant variable.console.log(PI); // 输出: Symbol(π)
2、bigint是什么?有什么作用?使用场景?
bigint用于表示任意精度格式的整数。
作用:
存储比js默认更大的整数,确保数据完整度和计算精度。
- 使用场景:
当普通的number存储更大的数字时,会出现不精确的情况。用bigint存储更大的整数,确保数字的完整度和精确度。
javascript">const big1 = BigInt(1234567890123456789012344563784);const big2 = 12345678992736n;console.log(typeof big1);//bigintconsole.log(big1);//1234567890123456849145940148224nconsole.log(typeof big2);//bigintconst num1 = 124894637849362739274859;console.log(num1);//1.2489463784936274e+23
二、检测数据类型
1、typeof
适用:准确的判断简单数据类型
特殊的:检测 空数组[] 、{} 、正则 >>object 检测函数>>function
javascript"> console.log(typeof 123);//numberconsole.log(typeof 'abcd');//stringconsole.log(typeof true);//booleanconsole.log(typeof a);//undefinedlet b = Symbol();let c = Symbol();console.log(b);//Symbol()console.log(c); //Symbol() console.log(b==c); //false let f = Symbol('sym');console.log(f); //Symbol(sym)console.log(typeof null);//objectlet d = null;console.log(typeof d);//objectconsole.log(d==null)//trueconsole.log(d===null)//trueconsole.log(typeof function () {});//function console.log(typeof []); //object let e = [1,2,3]console.log(typeof e);//objectconsole.log(typeof {});//objectconsole.log(typeof /\d/);//object 正则
2、instanceof
适用:可以准确的判断复杂数据类型(array date ) ,不能检测基本数据类型会全部返回false
原理:判断在对象的原型链中是否能找到该类型的原型
javascript"> let arr = [];console.log(arr instanceof Array); // truelet date = new Date();console.log(date instanceof Date); // truelet add = function(){};console.log(add instanceof Function);//true
3、constructor(不推荐)
适用:引用数据类型(不能检测基本数据类型)
原理:利用原型上的prototype.constructor指向实例的构造函数来进行判断
javascript">let arr = [];
console.log(arr.constructor === Array); // true let date = new Date();
console.log(date.constructor === Date); // true let reg = /a/g;
console.log(reg.constructor === RegExp); // true let func = function() {};
console.log(func.constructor === Function); // true let obj = {};
console.log(obj.constructor === Object); // true
4、Object.prototype.toString.call()
适用于:简单、复杂数据类型
javascript">let arr = [];console.log(Object.prototype.toString.call(arr)); // [object Array]let date = new Date();console.log(Object.prototype.toString.call(date)); // [object Date]let reg = /a/g;console.log(Object.prototype.toString.call(reg)); // [object RegExp]let func = function () {};console.log(Object.prototype.toString.call(func)); // [object Function]let str = 'hello';console.log(Object.prototype.toString.call(str)); // [object String]