浅析Js之”变量”篇

429 阅读4分钟

一、JS中变量与函数的使用

1.变量

JS中的数据类型

基本数据类型 引用数据类型
数值(number) 对象(Object
字符串(String 函数(Function
布尔(Boolean 数组(Array)
Undefined
空(Null

判断数据的类型,使用typeof这个运算符。

    <script>
    console.log(typeof undefined);  // undefined
    console.log(typeof 'absdef');   // string
    console.log(typeof 123456);     // number
    console.log(typeof true);       // boolean
    console.log(typeof function(){});//Function
    console.log(typeof {});         // object
    console.log(typeof []);         // object
    console.log(typeof null);       // object
    console.log(typeof console.log);
    </script>

变量提升

var 的变量会提升,没有var的变量不会提升。(提升是指提升到了代码段的第一行。)

(1)普通的var变量,肯定要提升。

<scirpt>
console.log(a); //undefined
var a = 100;
console.log(a); //110
</script>

(2)循环内部中的var变量,也会提升。

<scirpt>
console.log(i,j); //undefined undefined
for(var i=0;i<10;i++){
    for(var j=0;j<10;j++){
        
    }
}
console.log(i,j); //10 10
</script>

(3)在函数中的var变量,也是可以提升的。

<script>
function f(){
    console.log(a); //undefined
    var a =110;
    console.log(a);//110
}
f();
</script>

注意:在函数中的变量的提升,并不是提升到了代码段的第一行,而是提升到了函数内部的第一行


2.函数

函数的提升

函数在JS中,主要分两类:一类是函数声明 ,另一类是函数表达式。

(1)函数声明提升

<script>
f();  
function f(){
    console.log("f..."); //f...
}
</script>

(2)函数表达式不提升

<script>
g();
var g =function (){
console.log("g...");//报错
}
</script>

注意:提升是发生在同一个代码段中,是不能提升到上一个代码段中的。

二、进程和线程的区别?

(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元

(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程。

(3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束

(4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的 (5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源

(6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志

阻塞与非阻塞

阻塞调用是指调用结果返回之前,调用者会进入阻塞状态等待。只有在得到结果之后才会返回。

非阻塞调用是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

一个线程/进程经历的5个状态,创建,就绪,运行,阻塞,终止。各个状态的转换条件如上图,其中有个阻塞状态,就是说当线程中调用某个函数,需要IO请求,或者暂时得不到竞争资源的,操作系统会把该线程阻塞起来,避免浪费CPU资源,等到得到了资源,再变成就绪状态,等待CPU调度运行。

同步与异步

同步:在发出一个同步调用时,在没有得到结果之前,该调用就不返回。

异步:在发出一个异步调用后,调用者不会立刻得到结果,该调用就返回了。

同步的定义看起来跟阻塞很像,但是同步跟阻塞是两个概念,同步调用的时候,线程不一定阻塞,调用虽然没返回,但它还是在运行状态中的,CPU很可能还在执行这段代码,而阻塞的话,它就肯定不在CPU中跑这个代码了。这就是同步和阻塞的区别。同步是肯定可以在,阻塞是肯定不在。

异步和非阻塞的定义比较像,两者的区别是异步是说调用的时候结果不会马上返回,线程可能被阻塞起来,也可能不阻塞,两者没关系。非阻塞是说调用的时候,线程肯定不会进入阻塞状态。

上面两组概念,就有4种组合。

同步阻塞调用:得不到结果不返回,线程进入阻塞态等待。

同步非阻塞调用:得不到结果不返回,线程不阻塞一直在CPU运行。

异步阻塞调用:去到别的线程,让别的线程阻塞起来等待结果,自己不阻塞。

异步非阻塞调用:去到别的线程,别的线程一直在运行,直到得出结果。