JS系列浏览器解析与运行

11次阅读

共计 2300 个字符,预计需要花费 6 分钟才能阅读完成。

浏览器解析:

1. 当浏览器(内核、引擎)解析和渲染 js 的时候,会给 js 提供一个运行的环境,这个环境叫做“全局作用域(后端 global / 客户端 window scope)”
2. 代码自上而下执行(之前有个变量提升阶段)

=> 基本数据类型值,会存储当前作用域下

            var a = 12;
            var b = a;       栈内存本身就是 js 代码运行的环境,所以的基本类型存储在栈内存中开辟一个位置进行存储。b = 13;
            console.log(a); =>12
            var obj1 = {n: 100};
            var obj2 = obj1; == {n: 100} ; => obj1 = {n: 100};      堆内存用来存储引用类型的信息值的对象,对象存储的是键值对,函数存储的是代码字符串
            obj2['n'] = 200;  => obj1 = {n: 100};
            console.log(obj1.n); //=>200

var b = 13 ; a 和 b 没有任何关系,按值操作

   1) 首先开辟一个空间存储 12
   2)在当前作用域中声明一个变量 a (var a)
   3)让那个声明的变量和存储的 12 进行关联(把存储的 12 赋值给 a => 赋值操作叫定义)=>` 基本类型是重新赋值操作,基本数据类型也叫值类型,是按照值来操作:把原有的值复制一份,放到新的空间位置上和原来的值没有任何关系(浅拷贝)`

=> 引用类型的值不能直接存储到当前作用域下,(因为可能存储的内容过于复杂)我们需要开辟一盒新的空间(也就是仓库),把内容存储到这个空间中(深拷贝)

   var obj1 = {n:100};
   > 1)首先开辟一个新的内存空间,把对象的键值对以此存储起来(为了保证后面可以找到这个空间,此空间有 16 进制)>2)声明一个变量,让变量和空间地址关联在一起(把空间赋值给变量)>   引用类型不是按照值来操作,它操作的是空间的引用地址:把原来的空间地址赋值给新的变量,但是原来的空间没有别克隆,还是一个空间,这样就出现多个变量关联的是相同的空间, 值类型不会让 2 个变量产生关联,引用类型会产生关联。**` 作用域里面的内存叫栈内存 `**

作用域

形成全局作用域
代码自上而下执行
开辟一个新的堆内存,把键值对存储在堆内存中

n:10,
m:obj.n * 10 =>obj.n 此时堆内存信息还没有存储完成,空间地址没有给 obj 此时的 obj 是 underfined,obj.n 就是 underfined.n
    
    var obj = {
               n:10,
               m: obj.n*10
          };
          console.log(obj.m);
          VM165:3 Uncaught TypeError: Cannot read property 'n' of undefined
          at <anonymous>:3:11

正确的是在外获取:

    var obj = {n:10,};
          obj.m =obj.n*10;
          console.log(obj.m);
          => VM207:6 100 

js 中的判断语句

1.if / else / else if

     var num =12;
       if (num>10){num++;} else if(num>=0 && num <=10){num--;} else {num+=2;}
       console.log(num); =>13
     

* 有一个条件成立,后面不管是否还有成立条件,都不在判断执行了

 关于条件可以怎么写?// >= /<= / ==(常规等比较)  % 取余 4%2 =>0 
  
     if(0){//=> 不管在条件判断中写什么,最后总要把其计算出 true/false 判断条件是否成立(把其他的值转化成布尔类型,只有 0,NaN,'',null,underfined 是 false,其余是 true)}
     if('3px'+3){  
            //=> 在 js 中,+ - * / % 都是数学运算,除 + 以外。其余运算符的时候,如果遇到了非数字类型的值,首先转化为数字类型(number),然后在进行运算
          '3px'+3 => '3px3'
       }
       if ('3px'-3){'3px'-3 =>NaN}
       if(NaN>3) =>FASLE
       
       语法:if(({})>5)
         直接在 console 测试语法 ({})>5  'str'>5

BAT 面试题:

 var num = parseInt('width: 35.5px');
        if (num==35.5){alert(0);
        }else if (num==35){alert(1);
         }else if (num==NaN){   //=> NaN 和任何数不相等
         alert(2);
         }else if (typeof num=='number'){alert(3);   //=> alert 输出的都是字符串格式 '3'
             //=> 先算 typeof num
             //=> 再做比较
        }else {alert(4);
        }

typeof

在 js 中检测数类型的方式之一,还有其他

 > instanceof
 > constructor
 > Object.prototype.toString.call()


 语法:typeof[value] => 检测 value 的数据类型
 返回值:检测出来的结果是一个字符串,字符串中包含对呀的数据类型。例如:"number"/"string"/"boolean/"underfined"/"object"/"function"typeof 12 =>"number"typeof null =>"object" 因为 null 代表空对象指针(没有空间内存)typeof function(){} =>"function"
  typeof /^/ =>"object"
  typeof true =>"boolean"

typeof 检测数组 / 正则 / 对象,最后返回的都是 object, 弊端就是无法细分对象 "
面试题:

 
    console.log(typeof []) =>"object"
    console.log(typeof typeof []) =>type "object" => "string"


正文完
 0