js数据类型
js中的数据类型
-
数据类型的分类
- 基本数据类型
- number
- string
- boolean (0, NaN, null, undefined, 空字符串转换为布尔为假)
- null (空对象指针)
- undefined (未定义)
- Symbol
- bigint
- 引用数据类型
- object
- function
- 基本数据类型
-
检测数据类型 (其他的 Array.isArray)
- typeof 检测数据类型的逻辑运算符
- instanceof 检测是否为某个类的实例
//A instanceof B //B的prototype属性 是否在 A的原型链上 function myInstanceof(A,B) { let proto = Object.getPrototypeOf(A);//获取对象的原型 let prototype = B.prototype;//获取到右侧的prototype对象 while(true) { if(!proto) return false; if(proto === prototype) return true; proto = Object.getPrototypeOf(proto) } }- constructor 检测构造函数
- Object.prototype.toString.call 检测数据类型的逻辑运算符
-
typeof [value] 返回当前值的数据类型 '数据类型'
- typeof 返回的结果都为字符串 结果有 "number" "string" "boolean" "underfined" "object" "symbol" "bigint" "function"
- typeof null => "object" 所以的值在内存中都是按照二进制来存储的,对象的前三位时000,但null存储时前三位也是000,所以检测数量为object
- typeof 不能识别对象的类型(检测普通对象或者数组对象时都是object)
let a = typeof typeof typeof [1,2];
console.log(a)//"string" typeof [1,2]=>"object" typeof "object"=>"string"
number(数字类型)
+ NaN 不是一个有效数字 NaN和谁都不相等包括它自己
+ isNaN() 用来检测是不是有效的数字 如果不是有效数字返回true,如果是返回false
+ Infinity 无穷大的值
+ parseInt() 处理的值是字符串,从字符串的左侧开始查找有效数字字符(遇到非有效数字字符则停止查找)-> 如果处理的不是字符串,需要先转换为字符串然后再开始查找
+ parseFloat() 处理的值是字符串,从字符串的左侧开始查找有效数字字符(遇到非有效数字字符则停止查找)-> 如果处理的不是字符串,需要先转换为字符串然后再开始查找(包括小数点)
+ Number() 直接调用浏览器最底层的数据类型检测机制来完成
- true => 1 false => 0
- null => 0 underfiend => NaN
- 字符串必须保证都是有效数字才会转为数字,否则都为NaN
let res = parseFloat("left:200px"); //=> NaN
if(res === 200) {
alert(200)
}else if(res === NaN) {
alert(NaN)
}else if(typeof res === "number") {//typeof NaN => "number"
alert("number")
}else {
alert('Invalid Number')
} => "number"
把其他数据转换为数字的方法
+ 强转换(基于底层机制转换的) Number([value])
+ 一些隐式转换都是基于Number完成的
- isNaN("12px") 先把其他类型转换为数字再检测
- 数学运算 (加号遇到字符串和对象是拼接)
- 加号什么时候是字符串拼接:在两边出现字符串(或者对象)的情况下,加号一定是字符串拼接 => 对象本身是要转换为数字进行运算的,只不过在转换数字的过程中,需要先转换为字符串,才能转换为数字,而一旦转换为字符串,就变成了字符串拼接了(被拦截了)
- 两个等号比较的时候
- []==true => false 都转换为数字Number([])=>Number("")=>0
- 对象==字符串 对象转化为字符串
- null==undefined true 但是和其他任何值都不相等 0==false false
- 剩下的两边不同都是转换为数字
- 在进行比较的时候,如果左右两边数据类型不一致,则需要先默认转换为一致的数据类型,然后再进行比较
+ 弱转换(基于一些额外的方法转换) parseInt([value])/parseFloat([value])
parseInt(""); //=> NaN
Number("");//=> 0
isNaN("");//=> false
parseInt(null);//=> NaN
Number(null);//=> 0
isNaN(null);//=> false
parseInt("12px");//=> 12
Number("12px");//=> NaN
isNaN("12px");//=> true
parseFloat("1.6px") + parseInt("1.2px") + typeof parseInt(null); //=> "2.6number"
| | |
1.6 1 "number"
isNaN(Number(!!Number(parseInt("0.8"))));//=> false
- parseInt("0.8") => 0
- Number(0)=> 0
- Number(false) => 0
- isNaN(0) => false
typeof !parseInt(null) + !isNaN(null);//=> "booleantrue"
| |
"boolean" !isNaN(null)=>!isNaN(0)=>!false => true
let result = 10 + false + undefined + [] + "Tencent" + null + true
+ {};
10+false=>10+undefined=>NaN+[]=>"NaN"+'Tencent'=>"NaNTencent"+null=>"NaNTencentnull"+true=>"NaNTencentnulltrue"+{}=>"NaNTencentnulltrue[object object]"
console.log(result);//=>"NaNTencentnulltrue[object Object]"
[]==false =>true [].toString()='' => ''==false
![]==false =>true 运算有效级,先算 ![] 再比较 ![] = false
//把其他类型转换为布尔类型遵循的规律:只有0/null/NaN/undefined/''五个值是false,其余的都是true(遵循的是浏览器底层运行的时候,有自己的转换规则)
{}+0 => 0 //大括号在js中太特殊了:对象,代码块(块级作用域) 此处把大括号当作一个代码块 后面是+0 +值 这个操作是数学运算(不论加谁) 这个{}认为是单独的一块
0+{} => '0[object Object]'
({}+0) => '[object Object]0'
{}+0+{} => '[object Object]0[object Object]'
大括号在运算符前后
- 在没有使用小括号处理优先级的情况下,不认为是数学运算,加小括号才算
- 出现在运算符的后面,认为是数学运算
补: 规则
- 对象==字符串 对象转换为字符串 [10] == "10" true
- null==undefined (三个等号下不相等),但是和其他任何的值都不相等 0==null false
- NaN和谁(包括自己)都不相等
- 剩下的情况都是转换为数字再做比较
- 把其他类型转换为布尔类型遵循的规律:只有0/null/NaN/undefined/''五个值是false,其余的都是true
在js中对象的属性是什么格式的?
- 普通对象的属性名只能是 "字符串" (普通对象的属性名可以是基本数据类型值)
- Map 这种数据结构支持 对象作为属性名
- 但是普通对象的属性名不能是对象,如果是对象,需要转换为字符串存储
var a={},b={n:'12'},c={m:'13'};
a[b] = "nihao"; => a['[object Object]']
a[c] = "xiaohua"; => a['[object Object]']
console.log(a[b])//"xiaohua"
js之所以能在浏览器中运行,是因为浏览器给js提供了执行环境 => 栈内存(Stack) (浏览器中有专门的线程(js引擎)来执行)
+ 堆(Heap) 栈(Stack)内存
+ ECStack(Execution Context Stack)和EC(Execution Context)
+ GO(Global Object)
+ VO(varibale Object)
+ AO(Activation Object)
栈内存:提供代码执行的环境
堆内存:存放东西(存放的是属性和方法)

浙公网安备 33010602011771号