文章内容摘抄于:01 代码基本功测试(上):JS 的数据类型你了解多少?_哔哩哔哩_bilibili 仅供个人学习
javascript类型有八种:Number,String,Boolean,Null,undefined,Symbol,BigInt,object。
前七种为基础数据类型,object为引用数据类型
BigInt数据类型是为了让JavaScript程序能表示超出Number 类型支持的数值范围。BigInt可以表示任意大的整数
数据类型大致可以分为两类来进行存储
1.基础类型存储在栈内存。被引用或者拷贝时,会创建一个完全相等的变量。
2.引用类型存储在堆内存。存储的是地址,多个引用指向同一个地址。(涉及“共享”概念)
let a = {
name:'gaga',
}
let b = a
console.log(a.name); // 输出:gaga
b.name = 'GAGA'
console.log(a.name); // 输出:GAGA
console.log(b.name); // 输出:GAGA
这里就体现出了引用类型的共享特征,即这两个值都存在同一块内存中共享,一个发生了改变,另一个也随之改变。
let a = {
name:'gaga',
age:20
}
function change(obj){
obj.age = 24
obj = {
name:'GAGA',
age:30
}
return obj
}
let b = change(a)
console.log(a); // {name: 'gaga', age: 24}
console.log(b); // {name: 'GAGA', age: 30}
这里function和return带来了不一样的东西。
原因:函数传参传进来的obj传递的是对象在堆中的内存地址。通过调用 obj.age = 24 改变了a对象的age属性,但是return obj 又把obj变成了另一个内存地址,将name:'GAGA', age:30 这个对象存入其中
数据类型检测
比如如何判断是否为数组
第一种:typeof
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
其中须注意的是 typeof null 虽然他是object,但不表示他是引用类型,这是js的一个历史bug。因此,null在typeof返回的结果是有误的,不能作为判断null的方法。
第二种:instanceof
let Car = function(){}
let benz = new Car()
benz instanceof Car // true
let car = new String ('Mercedes Benz')
car instanceof String // true
let str ='Covid-19'
str instanceof String // false
instanceof 运算符用于检查一个对象是否是指定构造函数(或其原型链上的任何构造函数)的实例。它通过检查对象的原型链来确定对象的类型。如果对象是指定构造函数的实例,那么 instanceof 返回 true,否则返回 false。
两种方法的总结:
两种判断数据类型的差异:
instanceof可以准确地判断复杂引用数据类型但是不能正确判断基础数据类型
而 typeof也存在弊端,它虽然可以判断基础数据类型 (null 除外) 但是引用数据类型中,除了 function 类型以外,其他的也无法判断
第三种:Object.prototype.toString
Object.prototype.toString.call()方法可以很好的判断引用类型
Object.prototype.toString(f) //"[object Object]"
Object.prototype.toString.call(0)//同上结果,加上call也ok
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call('1') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call(null) //"[object Null]"
Object.prototype.toString.call(undefined) //"[object Undefined]"
Object.prototype.toString.call(/123/g) //"[object RegExp]"
Object.prototype.toString.call(new Date())//"[object Date]"
Object.prototype.toString.call([])//"[object Array]"
Object.prototypetoString.call(document) //"[object HTMLDocument]"
Object.prototype.toString.call(window) //"[object Window]"
需注意的是,使用这个方法最后返回的字符串格式为:[object Xxx] 这里面的Xxx第一个手写字母需要大写,使用typeof返回的是小写
数据类型转换
第一种:强制类型转换
例如:Number()、parselnt()、parseFloat()、toString()、String()、Boolean()方法
Number()方法的强制转换规则:
对于Boolean值:true和false分别被转换为1和0;数字返回自身;null返回0;undefined返回NaN;
对于字符串:如果字符串只包含数字,则将其转换为十进制;如果字符串包含有效浮点格式,将其转换为浮点数值;如果是空字符串,将其转换为0;如果不是以上格式的字符串,均返回NaN。
Boolean()方法的强制转换规则:
除了undefined、null、false、"、0(包括+0,-0)、NaN转换出来是false,其他都是true
第二种:隐式类型转换
凡是通过逻辑运算符( && 、|| 、! )、运算符( + 、- 、* 、/ ,是)、关系操作符(>、<、>=、<=)、相等运算符(==)、if/while条件的操作。如果遇到两个数据类型不一样的情况,都会出现隐式转换。
'=='的隐式类型转换规则:
如果类型相同,则无须进行类型转换;
如果其中一个操作值是 null 或者 undefined那么另一个操作符必须为 null 或者undefined才会返回 true,否则都返回 false
null == undefined // true
null == 0 // false
''==null // false
''==0 // true
'123'==123 // true
0== false // true
1 == true // true
var a = {
value:0,
valueOf:function(){
this.value++
return this.value
}
}
console.log(a==1&&a==2&&a==3); // true a == 1:JavaScript 尝试调用 a.valueOf(),返回 1,比较为 true。 同理 a==2,a==3 所以最终为true
'+'的隐式类型转换规则:
'+'号操作符,不仅可以用作数字相加,还可以用作字符串拼接
如果其中有一个是字符串,另外一个是undefined、 null或布尔型,则调用toString()方法进行字符串拼接
如果是纯对象、数组、正则等,则默认调用对象的转换方法会存在优先级,然后再进行拼接
如果其中有一个是数字,另外一个是 undefined. null、布尔型或数字则会将其转换成数字进行加法运算,对象的情况还是参考上一条规则
如果其中一个是字符串、一个是数字则按照字符串规则进行拼接
'1'+undefined // '1undefined'
'1'+ null // '1null'
'1' + true // '1true'
'1'+ 1n // 11 BigInt 是一种可以表示任意精度整数的数据类型,它通常使用后缀 "n" 来标识。
1 +undefined // NaN
1 +null // 1
1 + true // 2
1+1n // 错误 不能把BigInt和Number类型直接相加
'1'+3 // '13' // 拼接