JavaScript⾯试考点之数据类型及类型转换
1、JavaScript中的数据类型
在JavaScript中,我们把数据可以分为基本类型和引⽤类型。
Undefined、null
BigInt(es10新
Boolean、Undefined
symbol(es6新增,表⽰独⼀⽆⼆的值),BigInt
null、symbol
String、Boolean
1)基本数据类型
1)基本数据类型:Number
Number、String
增)。
Object。Object包括函数对象-Function、普通对象-Object、数组对象-Array、正则对象-RegExp、⽇期对象-Date、2)引⽤数据类型
2)引⽤数据类型:Objectjava变量的数据类型分为两种
Math数学函数对象等。
注意:a、在数值类型中,存在⼀种特殊数值NaN,意思为“不是数值”(可以使其他任何类型,所以NaN!=NaN。),⽤于表⽰返回数值的操注意
作失败了(不是抛出错误)。isNaN⽤来检测这个值是否为有效数字,不是有效数字则返回true,是有效数字返回false。
b、Undefined类型只有⼀个值就是特殊值undefined。当声明了变量但没有初始化时,就相当于给变量赋予了undefined值。
c、字符串⼀旦创建,值就不能改变了。如 let lang = "java"; lang = lang+"script" 。lang是先销毁再创建。
d、Null类型同样只有⼀个值,即特殊值null,表⽰⼀个空对象指针。这也是给typeof传⼀个 null 会返回 "object" 的原因。(let car = null; console.log(typeof car);  // "object")只要变量要保存对象,如果暂时没有哪个对象可保存,就可以⽤null来填充。undefined值由null值派⽣⽽来。(console.log(null == undefined); // true)
基本数据类型存储在栈中,存放的是对应的值;引⽤数据类型存储在堆中,在e、基本数据类型和引⽤数据类型存储在内存中的位置不同。基本数据类型存储在栈中,存放的是对应的值;引⽤数据类型存储在堆中,在栈中存放的是指向堆内存的地址。
2、数据类型检测
1)typeo f 检测数据类型的逻辑运算符
typeof 操作符返回⼀个字符串,表⽰未经计算的操作数的类型。直接在计算机底层基于数据类型的值(⼆进制)进⾏检测。
typeof 对于原始类型:除了 null 都可以显⽰正确的类型。
除了 null 都可以显⽰正确的类型。
typeof 对于原始类型
除了函数都会显⽰object。所以说typeof并不能准确判断变量到底是什么类型,所以想判断⼀个对象的正确类型,这时候可typeof对于对象:除了函数都会显⽰object。
typeof对于对象
以考虑使⽤instanceof。
2)insta nc eo f 检测是否为某个类的实例
instanceof 运算符⽤于检测构造函数(类型的)的 prototype 属性是否出现在某个实例对象的原型链上。instanceof 运算符
原型链去,直到到相同的原型对象,返回true,否则为false。instanceof的实现原理:顺着原型链
instanceof的实现原理
3)c o nstr uc to r 检测构造函数
如果我创建⼀个对象,更改它的原型,constructor就会变得不可靠了
4)Objec t.pr o String.c a ll 检测数据类型
Str ing.c
如果需要通⽤检测数据类型,可以采⽤String,调⽤该⽅法,统⼀返回格式“[object Xxx]”的字符串,其中Xxx就是对象的类型。
对于Object对象,直接调⽤toString()就能返回[object Object];⽽对于其他对象,只要把String执⾏,让它⾥⾯的this变为要检测的值,即需要通过call来调⽤,才能返回正确的类型信息。
总结:
布尔值;
布尔值;constructor返回的是⼀个布尔值
基本类型;instanceof返回的是⼀个布尔值
typeof会返回⼀个变量的基本类型
我们可以肆意的修改原型的指向,所以检测不准确。instanceof可以准确地判断复杂引⽤数据类型,但是不能正确判断基础数据类型;我们可以肆意的修改原型的指向,所以检测不准确。
因为对象存储在计算机中,都是以000开始的⼆进制存储,null也是,所⽽typeof 也存在弊端,它虽然可以判断基础数据类型(null 除外,因为对象存储在计算机中,都是以000开始的⼆进制存储,null也是,所以检测出来的结果是对象),但是引⽤数据类型中,除了function 类型以外,其他的也⽆法判断(“object”)。
以检测出来的结果是对象
实现:
传递的值是null或者undefined,就返回对应的字符串。基本数据类型都采⽤typeof检测。其他使⽤String。
3、JavaScript中的类型转换机制
我们在声明的时候只有⼀种数据类型,只有到运⾏期间才会确定当前类型。虽然变量的数据类型是不确定的,但是各种运算符对数据类型是有要求的,如果运算⼦的类型与预期不符合,就会触发类型转换机制。常见的类型转换有:强制转换(显⽰转换)、⾃动转换(隐式转换)
1)常见的显⽰转换⽅法有:N umber()、pa r seInt()、String()、Bo o lea n()
um ber()、pa rseInt()、String()、Bo
Number() 函数是将任意类型的值转化为数值。转化规则如下:
Number() 函数
parseInt() 函数逐个解析字符,遇到不能转换的字符就停下来。
parseInt() 函数
parseInt() ⽅法⾸先查看位置 0 处的字符,判断它是否是个有效数字;如果不是,该⽅法将返回 NaN,不再继续执⾏其他操作。但如果该字符是有效数字,该⽅法将查看位置 1 处的字符,进⾏同样的测试。这⼀过程将持续到发现⾮有效数字的字符为⽌,此时 parseInt() 将把该字符之前的字符串转换成数字。
例如,如果要把字符串 "12345red" 转换成整数,那么 parseInt() 将返回 12345,因为当它检查到字符 r 时,就会停⽌检测过程。
字符串中包含的数字字⾯量会被正确转换为数字,⽐如 "0xA" 会被正确转换为数字 10。不过,字符串 "22.5" 将被转换成 22,因为对于整数来说,⼩数点是⽆效字符。
parseInt() ⽅法还有基模式,可以把⼆进制、⼋进制、⼗六进制或其他任何进制的字符串转换成整数。基是由 parseInt() ⽅法的第⼆个参数指定的,所以要解析⼗六进制的值,需如下调⽤ parseInt() ⽅法:var iNum1 = parseInt("AF", 16);//返回 175。
parseInt(string,radix)