一、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运行。
异步阻塞调用:去到别的线程,让别的线程阻塞起来等待结果,自己不阻塞。
异步非阻塞调用:去到别的线程,别的线程一直在运行,直到得出结果。