第三天

作者: 晚月川 | 来源:发表于2020-03-06 08:49 被阅读0次

数据类型的检测

基本数据类型: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 堆内存
+ 所谓堆栈内存,其实就是在计算机内存中分配出来的一块空间,用于执行和存储代码的

相关文章

网友评论

    本文标题:第三天

    本文链接:https://www.haomeiwen.com/subject/cntvrhtx.html