JS-------数据类型
JS中的数据类型
原始值类型「基本数据类型、值类型」
- number
- string
- boolen
- undefined
- null
- symbol
- bigint
对象类型「引用数据类型」
- 标准普通对象 object {}
- 标准特殊对象 数组、正则、日期、Error错误对象、Math...
- 函数对象(可调用可执行对象,内部实现了[[call]]方法) function
- 非标准特殊对象 原始值类型对应的对象类型实例,例如:new Number(10)...
数据类型转换
类型转换可以分为隐式类型转换和显示类型转换
转换为string
显示 :String()直接转字符串
隐式 :+号代表字符串拼接
如果加号有左右两边,其中一边是字符串或者对象,属于字符串拼接)、
parseInt中的第一个参数必须是字符串、alert...
String([1, 2, 3]) //"1,2,3"
String({}) //"[object Object]"
1 + '123' //"1123"
1 + {} //"1[object Object]"
转为boolean
除了“0/NaN/空字符串/null/undefined”变为false,其余都是true
对象转换为布尔也是按照上面这句话,结果都是true
布尔类型转换只会有true和false两种结果
显示: Boolean()直接转为布尔值
隐式 :隐式类型转换通常在逻辑判断或者逻辑运算符时触发(&&||!)
逻辑运算符(比如 || 和 &&)是在内部做了 boolean 类型转换,但实际上返回的是原始操作数的值,即使他们都不是 boolean 类型。
Boolean(2) // 显示类型转换
if (2) { } // 逻辑判断触发隐式类型转换
!!2 // 逻辑运算符触发隐式类型转换
2 || 'hello' // 逻辑运算符触发隐式类型转换
// 返回 number 类型 123,而不是 boolean 型 true
// 'hello' 和 '123' 仍然在内部会转换成 boolean 型来计算表达式
let x = 'hello' && 123 // x === 123
转为number
显示: Number()转换为数字类型
- 字符串->数字 空字符串变为0;出现任意非有效数字字符,结果都是NaN
- 布尔->数字 true转换为1 false转换为0
- undefined->NaN
- null->0
- Biglnt去除n
- symbol会报错
- 对象->数字
- 先调用 “对象[Symbol.toPrimitive]”,如果不存在这个属性
- 再调用 “对象.valueOf”,看获取的是否为原始值,如果不是原始值
- 再调用 “对象.toString”,转换为字符串
- 最后把字符串转换为数字
let obj = {
name: 'xxx'
}
console.log(obj - 10) // 数学运算:先把obj隐式转换为数字,再进行运算
//运行机制
obj[Symbol.toPrimitive] //undifined
obj.valueof() // {name:xxx}
obj.toString() // [object object]
Number("[object object]") // NaN
NaN - 10 // NaN
隐式: 数学运算、isNaN、==... 基于Number(val)实现转换
当+操作存在任意的操作数是String时,不会触发number类型的隐式转换
isNaN和NaN
NaN
- 表示非数值 not anumber不是个数字
- NaN和任何数据比较,永远返回false
- 任何与NaN进行运算的结果都是NaN
- NaN不与任何值相等,包括他自身,它属于number类型
isNaN
- isNaN用来判断某个值是不是有效数字返回结果是布尔型类型
- true非有效数字
- false有效数字
- 如果判断的值不是数字类型,会隐式调用Number方法,转为数字之后再进行判断
isNaN(0);//false
isNaN(1);//false
isNaN("12px");//===》Number("12px")===>NaN==>isNaN(NaN)===>true
isNaN({});//===>Number({})===>{}.toString()==>"[object Object]"==>Number("[object Object]");//====>NaN====isNaN(NaN)====>true
isNaN([]);//===>isNaN(0)===>false
isNaN([1,2]);// true
//-----不管是true还是false 都是布尔,转为数字不是1就是0,都是有效数字
isNaN(true);// false
isNaN(false);// false
==比较的隐式转换规则
如果两边的数据类型不同,需要先转为相同的类型,然后再进行比较
- 对象==字符串 对象转换为字符串
- NaN==NaN => false NaN和任何值都不相等
- null==undefined => true 三个等号比较就是false,但是和其它值都不相等
- 对象==对象 比较的是堆内存地址 []==[] => false
- 剩下如果两边不相等,都是转换为数字
练习题
let result = 100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false;
// result应该是?
[解析]
1.首先100+true
连接符两边存在Number类型,true转为number为1进行加法运算101
2.101+21.2
连接符两边均为Number类型,进行加法运算结果为122.2
3.122.2+null
连接符两边存在Number类型,null转为number为0.进行加法运算122.2
4.122.2+ undefined
连接符两边存在Number类型,undefined转number为NaN,NaN与任何数据运算都是NaN
5.NaN+"Tencent"
连接符两边存在String类型,NaN转string类型"NaN"进行字符串拼接结果为"NaNTencent"
6."NaNTencent"+[]
连接符两边存在String类型,[]转为string"",进行字符串拼接"NaNTencent"
7."NaNTencent"+null
连接符两边存在String类型,null转string为"null",进行字符串拼接,结果为:"NaNTencentnull"
8."NaNTencentnull"+9
连接符存在String类型,9转string为"9",进行字符串拼接,结果为:"NaNTencentnull9"
9."NaNTencentnull9" +false
连接符存在String类型,false转string为"false",进行字符串拼接,结果为:"NaNTencentnull9false
-------------------------------------------------完结-------------------------------------------------------------
--------------------------接受大佬们的批改,欢迎留言--------------------------------------------------