数据类型
基本数据类型:number / string / boolean / null / undefined / symbol / bigint
//symbol —— 不能new ,每次创建都是一个唯一值
Symbol(10)===Symbol(10) //false
bigint:
Number.MAX_SAFE_INTEGER 最大安全数
Number.MIN_SAFE_INTEGER 最小安全数
超过最大安全数后面+n 类型为bigint
//Infinity 正无穷大
//NaN:not a number 不是一个有效数字,但是属于number类型
//NaN===NaN 为false,NaN和自己或者任意值都不相等
//isNaN([val]):把[val]隐式转化(通过Number[val]转换)为数字类型,在看一下是否为非有效数字,如果确实是非有效数字,结果返回true,反之如果是有效数字,返回结果为false
//NaN+数字=NaN NaN+字符串=字符串
引用数据类型:object / function
object : new Array / new RegExp / new Date ...
检测数据类型
4种方法:typeof / instanceof / constructor / Object.prototype.toString.call([val])
{} / [] / null / 正则 —— typeof 都是object
typeof
a、检测返回的结果是一个字符串,字符串种包含对应的数据类型;
b、typeof null=>'object' null不属于对象,而是因为二进制存储值以000开头了;检测对象细分的类型也都是'object'
c、检测数组、正则、日期、对象返回的都是object,所以无法基于此方法细分对象;
let a = typeof typeof typeof [12,23];
console.log(a) //'string'
基于alert输出一个值,都要把值隐式转换为字符串然后输出。alert输出的结果都会转换为字符串
数据类型转换
把其他数据类型转换为Number类型:Number / parseInt / parseFloat
/*********************Number规则**********************/
Number(val)==0,其中val可以为:'' false null []
//把字符串转换为数字,要求字符串中所有字符都必须是有效数字才能转换
console.log(Number('')); //0
console.log(Number('5')); //10
console.log(Number('5px')); //NaN----px属于非有效数字
//布尔值转换为数字
console.log(Number(true)); //1
console.log(Number(false)); //0
//把空转换为数字
console.log(Number(null)); //0
console.log(Number(undefined)); //NaN
//把Symbol/BigInt转换为数字
console.log(Number(Symbol(10))); //报错----不允许转换
console.log(Number(BigInt(10))); //10
//把对象或者函数转换为数字,要先用toString把对象转换为字符串,再把字符串转换为数字
console.log(Number({
0:10
}));//NaN 普通对象toString()是检测数据类型,结果[object Object]=>转换数字NaN
console.log(Number([20]));//20 数组.toString()=>"20"
console.log(Number([1,2]));//NaN 数组.toString()=>"1,2"
console.log(Number([]));//0 数组.toString()=>""
/******************parseInt/parseFloat规则**************************/
//parseInt/parseFloat([val]):先把val转换为字符串,再从字符串左边第一个字符开始查找,把所有找到的有效数字变为数字,直到遇到一个非有效数字则停止查找,如果一个有效数字字符都没找到,返回结果NaN;
//parseFloat只是比parseInt多能识别一个小数点而已。
console.log(parseInt("10px20")); //10
console.log(parseInt('10.3px'));//10
console.log(parseFloat('10.3px'));//10.3
console.log(parseInt("width:10px"));//NaN
把其他类型转换为字符串:toString() / String
/**********************toString()********************/
//其他类型转换为字符串,一般都是直接""包起来,只有{}普通对象调用toString是检测数据类型,因为调用了Object.prototype.toString,返回结果:"[object Object]",转换为数字NaN。
//在加号运算时,如果加号某一边出现字符串,则不是数学运算,而是字符串拼接;
//基于alert/confirm/prompt/document.write...输出内容时,都要先把内容转换为字符串再输出;
let result = 10 + false + undefined + [] + 'Tencent' + null + true + {};
//=>10+0=>10+NaN=>NaN+""=>"NaN"+'Tencent'=>"NaNTencent"+后面都是字符串=>"NaNTencentnulltrue[object Object]"
console.log(result); //"NaNTencentnulltrue[object Object]"
注意:加号即使一边出现字符串或者对象,也不一定是字符串拼接,比如 ++i/i++/+i —— 数学运算,如下:
let n = '10';
console.log(++n); //11 => 转换类型+计算
console.log(typeof ++n) //number
let n = '10';
console.log(+n); //10 => 只转换类型
console.log(typeof +n) //number
console.log({}+0); //0 {}认为是代码块,不参与运算=>只处理+0=>0
console.log(({}+0));//'[object Object]0' {}参与运算
console.log(0+{});//'0[object Object]'
把其它数据类型转换为布尔
/*
* 1. ! 转换为布尔值后取反;
* 2. !! 转换为布尔值;
*/
//规则:只有0、NaN、null、undefined、空字符串这5个值会转换为false,其余都是true;
console.log(!!({})); //true
JS中的比较操作:== ===
==:如果左右两边数据类型不一致,==会默认把数据类型转换为一致的再去比较;
===:如果左右两边数据类型不一致直接返回false,因为它要求数据类型和值都一样才相等;
/*******************==比较规则***********************/
//类型一样的特殊点
{}=={} //false 对象比较的是堆内存地址
[]==[] //false
NaN==NaN //false NaN和谁都不相等
//类型不一样的转换规则
1.null==undefined //true 剩下null/undefined和其他任何数据类型值都不相等
2.字符串==对象,要先把对象转换为字符串
3.如果==两边数据类型不一致,都需要先转换为数字再比较
console.log([] == false); // true
// 规则:比较过程中,两边数据值不一样,都转换为数字再比较
// 左边[] =====> '' ====> 0
// 右边 false => 0
console.log(![] == false); // true
// 规则:先算![] => false
// false == false
看完上面的规则,再来练个手呗!
练习:
//练习1
parseInt("") //NaN 非有效数字
Number("") //0
isNaN("") //false ===> isNaN(Number('')) => isNaN(0) => false
//练习2
parseInt(null) //NaN ===> parseInt("null") => NaN
Number(null) //0
isNaN(null) //false ===> isNaN(Number(null)) => isNaN(0) => false
//练习3
parseInt("12px") //12
Number("12px") //NaN
isNaN("12px") //true
parseFloat("1.6px") + parseInt("1.2px") + typeof parseInt(null); //"2.6number"
//1.6+1+"number" => "2.6number"
//练习4
isNaN(Number(!!Number(parseInt("0.8")))) //false
//parseInt('0.8') => 0
//!!Number(0) => false
//Number(false) => 0
//isNaN(0) => false
//练习5
typeof !parseInt(null) + !isNaN(null); ////"booleantrue"
//!parseInt(null) => !NaN => !false => true
//typeof !parseInt(null) => "boolean"
//!isNaN(null) => !false => true
熟记以上转换规则,就可以轻松解决这些题了!