JS数据类型

undefined
undefined
的含义是未被赋值
未被初始化
null
值未知
的特殊值。
bigint
- JS 中,"number" 类型不能安全地表示大于
(253-1)
的整数值(即9007199254740991
),或小于-(253-1)
的负数。 BigInt
可以表示任意长度的整数。
js
const bigInt = 1234567890123456789012345678901234567890n;
symbol
- 创建唯一标识符
常用symbol
js
Object.prototype[Symbol.iterator]=function(){
let arr=Object.values(this)
return arr[Symbol.iterator]()
}
let [a,b]={a:1,b:2}
console.log(a,b);
//1 2
类型检测
typeof
typeof
适合判断基本类型(除null
外)
typeof
原理: 数据在底层都表示为二进制,在Javascript中二进制前(低)三位存储其类型信息。
typeof 对于原始类型来说,除了 null 都可以显示正确的类型
js
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
typeof null // 'object'
typeof [] // 'object'
typeof {} // 'object'
typeof console // 'object'
typeof console.log // 'function'
instanceof
instanceof
用于检测对象的具体实例类型 ,无法判断原始类型
如果有静态方法 Symbol.hasInstance
,那就直接调用这个方法:
js
let a={}
a[Symbol.hasInstance]=function(arg){
if(arg=='111'){
return true
}
}
console.log('111' instanceof a);//true
如果没有,则检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上。
js
console.log("11" instanceof String); //false
console.log(11 instanceof Number); //false
console.log({} instanceof Object); //true
console.log([] instanceof Array); //true
toString
方法
对象的toString()
- 取得该对象的
[Symbol.toStringTag]
属性值作为tag
,然后返回"[object " + tag + "]"
形式的字符串。
js
let user = {
[Symbol.toStringTag]: "User"
};
console.log(Object.prototype.toString.call(user));
//[object User]
js
console.log(Object.prototype.toString({}));//[object Object]
console.log(Object.prototype.toString.call([])); //[object Array]
console.log(Object.prototype.toString.call('11'));//[object String]
为啥需要调用call
直接调用数组和字符串实例的toString
方法可能会受到原型上toString
方法被覆盖的影响。而使用Object.prototype.toString.call()
确保了调用的是最原始、未被修改的toString
方法,提高了代码的稳定性和可靠性。
数组的toString()
js
console.log([1, 2, 3].toString()); // 正常输出:"1,2,3"
其他的toString()
js
//Number
let num = 123;
console.log(num.toString()); // 输出 "123"
//String
let str = "Hello";
console.log(str.toString()); // 输出 "Hello"
//Boolean
console.log(true.toString()); // 输出 "true"
console.log(false.toString()); // 输出 "false"
//函数function
let func = function() { return "Hello"; };
console.log(func.toString()); // 输出 "function (){ return "Hello"; }"
Array.isArray()
Array.isArray()
的判断逻辑:
- 在JS中,每个对象都有一个内部属性
[[Class]]
,它是一个字符串,描述了对象的具体类型(如"Array"
、"Date"
、"RegExp"
等)。 - 使用
Object.prototype.toString.call()
判断