JavaScript数据类型
- number
- string
- boolean
- null
- undefined
- symbol
- static Symbol
- Symbol.prototype
- bigint
- object
- 普通对象
- 数组对象
- 正则对象
- 日期对象
- Math数学函数对象
- JSON对象
- Set
- Map
- …
- function
- 普通函数
- 箭头函数
- 构造函数
- 生成器函数
- 匿名函数
- 自调用函数
- …
数据类型检测
- typeof 检测数据类型的逻辑运算符
- instanceof 检测是否为类的实例
- constructor 检测构造函数
- Object.prototype.toString.call 检测数据类型
typeof [value] 返回当前值的数据类型,返回的数据类型是字符串
- 返回的结果都是字符串
- 局限性:
- typeof null => “object” 类型
- typeof 不能细分对象类型(检测普通对象或数组对象等都是返回"object")
- 原理:
- 所有的数据类型值在计算机中都是按照“二进制”进行存储
- null的二进制值是“000000”
- 只要是对象都是以“000”开始的
- typeof检测时是按照计算机存储的二进制值来检测的,所以检测null时也是返回“object”
把其它数据类型转换为数字的方法:
- 强转换(基于底层机制转换) Number(value)
- 一些隐式转换是基于Number完成的
- isNaN(‘12px’) 先把其它类型值转换为数字再检测
- 数学运算 “12px” - 13
- 字符串 == 数字 两个等于号比较很多时候也是要把其它类型值转换为数字
- …
- 弱转换(基于额外的方法转换)parseInt(value)/parseFloat(value)
数据类型转换及面试题:
let a=typeoftypeoftypeof[12,23]
console.log(a)
- NaN 跟任何值都不相等,包括它自己,与任何值相加都是NaN
let res=parseFloat("left:200px");if(res===200){alert(200);}elseif(res===NaN){alert(NaN)}elseif(typeof res==="number"){alert("number")}else{alert("Invalid Number")}
- parseInt/parseFloat 处理的值是字符串,先从字符串左侧开始查找有效数字字符(遇到非有效数字字符则停止查找) 如果处理的值不是字 符串,需要先转换为字符串然后再开始在开始查找
- parseInt([value],[radix])传2个参数的转换规则:
- [radix]表示是一个进制,不写或者写0默认都是按照10进制处理,(特殊情况:如果value是以0x开头则默认是16进制)
- 进制有一个取值范围:2-36之间,如果不在这个范围内,则转换结果一定是NaN
- 把value看做是radix进制,最后把radix进制转换为10进制
- Number 直接调用浏览器最底层的数据类型检测机制来完成
+ true 1 flase 0
+ null 0 undefined NaN
+ 字符串中必须保证都是有效数字才会转换为数字,否则都是NaN - == 两个等号比较时
+ 对象==字符串,对象转换为字符串
+ null == undefined 返回true (===返回false),但是和其它值都不相等
+ 0 == null 返回false null和undefined在进行等号比较时不进行数据类型转换
+ 其余两边不同都转换为数字 - === 三个等号比较时:两边类型一致,值也一致才相等,类型不一样直接不对等,不会转换
- 0 NaN null undefined “” 转换为布尔类型都是false,其余的都是true
- 大括号与运算符结合:
+ 大括号在运算符前面并且没有小括号处理优先级,则不认为是数学运算,加了小括号后才会运算
+ 如果大括号出现在运算符后面则认为是数学运算 - 普通对象toString()是调用Object.prototype.toString()用来检测数据类型的,返回’[object Object]’
- 对象在做数学运算时的底层机制:
- 先检测对象的Symbol.toPrimitive这个属性值,如果有则基于这个值运算,如果没有
- 再检测对象的valueOf这个值【原始值:基本类型值】,如果有则基于这个值运算,如果没有
- 再获取对象的toString方法,把其变为字符串,如果是‘+’处理,则看到字符串会变为字符串拼接
- 如果最后想变为数字,则再把字符串转换为数字即可
let obj={[Symbol.toPrimitive]:function(hint){return10;},
valueOf:function(){return20;},
toString:function(){return30;}}
console.log(10+ obj);
parseInt('')Number('')isNaN('')parseInt(null)Number(null)isNaN(null)parseInt('12px')Number('12px')isNaN('12px')parseFloat('1.6px')+parseInt('1.2px')+typeofparseInt(null)isNaN(Number(!!Number(parseInt("0.8"))))typeof!parseInt(null)+!isNaN(null);[]==true10+false+ undefined+[]+'Tencent'+null+true+{}[]==false![]==false{}+0({}+0)或({})+00+{}let n='10', m=10;
console.log(n+10);
console.log(++n);
console.log(+n);
console.log({}+m);let res={}+ m;
console.log(res);
console.log(m+{});
console.log(m+newNumber(10));
var a={}, b='0', c=0;
a[b]='hello';
a[c]='world';
console.log(a[b]);
var a={}, b=Symbol('1'), c=Symbol('1');
a[b]='hello';
a[c]='world';
console.log(a[b]);
var a={}, b={n:'1'}, c={m:'2'};
a[b]='hello';
a[c]='world';
console.log(a[b]);
var a={n:1};var b= a;
a.x= a={n:2};
console.log(a.x);
console.log(b);
var x=[12,23];functionfn(y){
y[0]=100;
y=[100];
y[1]=200;
console.log(y);}fn(x);
console.log(x);[100,23]
var obj={
name:'hello',
fn:(function(name){
console.log(name);})(obj.name);}
let arr=[10.18,0,10,25,23];
arr= arr.map(parseInt);
console.log(arr);parseInt('10.18',0);parseInt('0',1);parseInt('10',2);parseInt('25',3);parseInt('23',4);
- 先将其它进制值的个十百千等拆分成单独的数
- 然后由个位数乘以该进制的0次幂 + 十位数乘以该进制的1次幂 + 百位数乘以该进制的2次幂…以此类推
- 最后相加得到的值就是十进制值,如上面代码中的4进制值23转为10进制就是:
2x4^1 +
3x4^0 = 8+3=11