数据类型的检测
基本数据类型:number string boolean null undefined symbol BigInt
引用数据类型:object(普通对象、数组对象、正则对象、日期对象...) function
JS中数据类型的检测
- tyepof [value] 检测数据类型的运算符
- [example] instanceof [class] 检测某一个实例是否属于一个类
- [example].constructor===[class] 检测实例和类关系的,从而检测数据类型
- Object.prototype.toString.call([value]) 检测数据类型
typeof细节点
+ typeof 检测的结果首先是一个字符串,字符串中包含对应的数据类型(例如:"number"、"string"、"boolean"、"undefined"、"object"、"function"、"symbol"、"bigint")
+ 特殊检测结果:
+ NaN / Infinity 都是数字类型的,检测出来的结果是 "number"
+ typeof null 的结果是 "object" (这个是浏览器的BUG:所有的值在计算中都已二进制编码存储,浏览器中把前三位是000的当做对象,而null的二进制前三位就是000,所以被识别为对象,但是它不是对象,它是空对象指针,是基本类型值)
+ typeof 普通对象/数组对象/正则对象... 结果都是"object",这样就无法基于typeof区分是普通对象还是数组对象等了
```
百度和腾讯的面试题
console.log(typeof []); //=>"object"
console.log(typeof typeof typeof []); //=>"string" 由于typeof返回的结果永远是一个字符串(字符串中包含了对应的类型),所以连续出现两个及两个以上typeof检测的时候,最后结果都是 "string"
```
```
已知有一个变量x,但是我们无法确认其数据类型,我们需要有一个判断操作:当x的类型是对象的时候(什么对象都可以),则处理对应的事情
if (typeof x == "object") { //=>null检测结果也会是"object",所以结果是"object"不一定是对象,还可能是null呢}
if (x != null && typeof x == "object") {}
```
创建变量的几种方式
- var
- function 创建函数 函数名也是变量 ,值指向函数本身
- let
- const 创建的变量,它的值不能修改(不能重新指向新值),所以也可以叫做创建的是常量
- class 创建一个类
- import ES6Module模块的导入
JS中3中常用的判断方式
- if、else if、else
- 三元运算符
如果处理的事情比较多,我们用括号包起来,每一件事情用逗号分隔;如果不需要处理事情,可以使用null/undefined占位
- ? 条件成立处理的事情
- : 条件不成立做的事情
let x = 10; if (x>=10) { x++; } else { x--; } x >= 10 ? x++ : x--; console.log(x);
> 在条件成立或者不成立的时候,如果不想做一些事情,则使用null/undefined等来占位即可;不占位会报错
let x = 10; if (x == 10) { x++; } let x = 10; x == 10 ? x++ : null;
> 如果需要做多件事情,则用小括号包起来,每一件事情中间用逗号分隔即可
let x = 10; if (x > 0) { x++; console.log(x); } x > 0 ? (x++, console.log(x)) : null;
> 可以根据需求完成三元运算符的嵌套
let x = 10; if (x > 0) { if (x < 10) { x++; } else { x--; } } else { x--; } x > 0 ? (x < 10 ? x++ : x--) : x--;
- swich case
- 每一种case情况结束后最好都加上break
- default等价于else,以上都不成立干的事情
- 每一种case情况的比较用的都是==="绝对相等"
一个变量在不同值情况下的不同操作,我们可以改写为 switch case 判断(他只能应用于等于什么值做什么事情,不能用于大于或者小于啥值做啥)
let x = '10'; if (x == 1) { x += 1; } else if (x == 5) { x += 2; } else if (x == 10) { // 条件成立 x += 3; } else { x += 4; } console.log(x); =>'103'
```
let x = '10';
switch (x) {
case 1: //=>在x等于1的情况下做什么
x += 1;
break; //=>每一种情况结束都要设置break(以供当此条件成立并处理完事情后,通知代码不在向下执行)
case 5:
x += 2;
break;
case 10: //=>'10'===10 FALSE
x += 3;
break;
default: //=>等价于else,而且最后一个判断结束无需设置break
x += 4;
}
console.log(x); //=>'104' 每一种case情况都是基于 === 进行比较的(严格比较,需要保证数据类型的一致)
```
在JS中,比较两个值是否相等,我们有以下几种方式
- == 相等 (相等比较中,如果两边数据类型不同,则默认先转化为相同数据类型,然后再进行比较)
- === 绝对相等 (需要保证左右两边数据类型和值都一样,才会相等,只要有一样不一样,结果都不相等)
- Object.is ES6中规范中新增加的方式
基本数据类型和引用数据类型的区别
-
基本数据类型(值类型):值类型由于结构相对简单,直接把创建的值存储到"栈内存"中即可,所以栈内存有两个作用:
- 供代码执行
- 存储基本类型值
-
引用数据类型(对象函数):引用数据类型的结构相对复杂(一个综合体,包含很多值),不能直接存储在栈内存中,需要单独开辟空间来存储,这个空间就是“堆内存”;引用数据类型值都存储在单独开辟的“堆内存”中!
- 堆内存只有一个作用:存储引用类型值的
webkit底层渲染机制(底层渲染的过程)
- 在浏览器中打开页面,浏览器引擎会渲染相关代码(包括JS代码),换句话说,会把代码自上而下执行
- 浏览器想要执行代码,会提供一个供代码执行的环境,我们把这个环境叫做 ECStack(Execution Context Stack执行环境栈) =>栈内存 Stack
- 栈内存的作用:供代码自上而下执行
- 最开始执行的是全局代码,所以会形成一个EC(GLOBAL)全局执行上下文,在栈内存中执行全局的代码
- 在全局的执行上下文中有一个VO(GLOBAL)全局变量对象,可以把接下来定义的变量和对应的值储存在这里面
内存的概念
+ Stack 栈内存
+ Heap 堆内存
+ 所谓堆栈内存,其实就是在计算机内存中分配出来的一块空间,用于执行和存储代码的
网友评论