1、首先说编译性语言和解释性语言:
程序猿编写的代码是给人看的,并不是给机器看的,所以在机器执行代码之前需要进行一次翻译,将代码翻译为机器能够识别的机器码。
编译性语言:在编译时为通篇编译,所有的代码编译完成后,才会执行。
解释性语言:在执行时才会进行翻译,翻译一行,执行一行,不会通篇翻译。
根据两种语言的特点:
编译性: C、C++
优点:快; 不足:移植性不好(不能跨平台)
解释性: JavaScript、php
优点:跨平台 不足:稍微慢点
2、JS代码执行是单线程同步执行(特点)
问题:既然js为单线程同步执行,为何能在页面上看到几个模块在同时展示?
js会将这些将要执行的队列随机的分割为无数的小序列,然后按照这个顺依次执行,由于执行时间非常短,已经超过肉眼所能分辨的情况。
3、主流浏览器:拥有独立的浏览器内核的浏览器称为主流浏览器。
IE trident
Chrome webkit/blink
firefox Gecko
Opera presto
Safari webkit
4、JS申明变量
在ES5中使用var关键字来申明变量 例如: var a = 123; 此过程可以拆解为两步:首先申明一个a变量 var a;,然后再给a赋值 a = 123;
5、JS中值类型:
原始值、引用值
原始值类型分为五类:number、string、boolean、null、undefined 引用值: function、object、array、date、RegExp....
并且在js中数字类型都是浮点型;在申明一个变量未赋值,即为undefined;null在js中表示占位值;
6、原始值与引用值如何存储
原始值会存在栈区,栈区存值先进的在底部。
var a = 10; var b =a;首先申明一个变量a;系统分给a一个空的栈区,将10赋值给a,系统立即会将10存入栈区。然后申明一个变量b;系统随即给b一个空的栈区,然后将a 赋值给b,系统会将a的值赋值一份出来放到存b的栈区。所以 a = 20;时系统将新分配一个房间(栈区)给a,并赋值为20,不会影响b的值,并且不会删除之前已分配的栈区。所以原值时改变时,不会相互影响。
栈区(stack) | 栈区 | ||
1010 | 10 | 1008 | 文本(空) |
b | 10 | 1007 | 文本(空) |
a | 20 | 1006 | 文本(空) |
引用值存储时:(散列结构)
var arr = [1,2],首先申请一个房间(栈区)arr,赋值时,引用值会存在堆区,与此同时会将堆内存中地址放入栈内存中。在var arr1; arr = arr1;系统将arr栈区的值复制一份给arr1,所以在改变arr的值时,同时会改变arr1的值。例如arr.push(3)
假如给arr重新赋值 arr = [1,3],那么会在堆区中重新存放一个[1,3],并将堆内存的地址重新存入arr对应的栈区内存中。
栈区(stack) | 堆区(heap) | ||
arr(1010) | heap1001 | 1001 | [1,2 ,3] |
arr1 | heap1001 | 1002 | [1,3] |
1008(arr) | heap1002 | 1003 |
注意:实际的栈区内存,赋值后不会被删除的,删除的只能是变量名称和实际存放值得一个联系,并不会真正清除栈内存。可以一直存,存满后,可以进行覆盖。
7、JS错误分两种:语法解析错误和逻辑错误
js为解释语言,但是在执行前,会整体扫描一遍,看下代码有么有语法错误,一旦出现语法错误,js代码一行都不会执行。
js中一个代码块的错误,不会影响另一个代码块。
8、JS运算符
优先级‘=’最弱,‘()’优先级较高
‘+’两种用途,数学运算和字符串链接符。
‘-’,‘*’,‘/’,'%',‘=’,‘()’ %(摩尔)为取余
‘++’,‘--’,‘+=’,‘-=’,'/=', '*=', '%='
比较运算符:‘>’,'<' , '==' , '<=' , '>=' , '!='
js比较符: 字符串比较时,比较的是asc码。但凡是比较运算符,得到的结果一定是true或false.
var a = 1 ==1; ,undefined ==undefined; infinity == infinity; 均返回true, NaN == NaN 返回false。
逻辑运算符:‘&&’,‘||’,‘!’
var a = 1 && 2 document.write('a'); 输出 2
与运算符有两个表达式时:
(1)与运算符一定会返回结果,与运算符会去检查它之前的第一个表达式,并且将其转换为布尔值,如果为真(转换规则undefined,null,NaN,“”,0,false ==> false;除此之外均为true),则继续往后看第二个表达式,并且直接返回该表达式的运算结果。
(2)当第一个表达式运算结果,转换为布尔值结果为false时,直接返回第一个表达式的运算结果。 var a = 0&&2 ; document.write('a'); 输出 0
与运算符多个表达式时:
当第一个表达式转换为布尔值结果为真,则继续看第二个表达式,如果第二个表达式转换布尔值结果为假,直接返回第二个表达式的运算结果;如果第二个继续为真,则继续判断,直到下一个表达式为假时返回该表达式的运算结果,或者返回最后的表达式运算结果。
或运算符:
var event = e || window.event
非运算符
!!将一个值变为布尔值
9、条件语句
条件成立执行,反之不执行
10、循环语句
for循环
for(var i=0;i<10;i++){
document.write('a')
}
分解:
(1)var i=0;
(2)if(i<10){
document.write('a')
}
(3)i++;
(4) if(i<10){
document.write('a')
}
(5) i++;
....循环3和4
执行顺序,先执行申明变量,在执行判断体,成立执行语句,最后执行i++;
var i=0;
for(;i<10;){
document.write('a');
i++;
}
while循环
实质就是for循环前后不写东西,即为for循环的简化版;
do{
}while(条件)循环,无论条件是否成立,都会执行一次执行体。
switch...case..
switch (n) {
case 1:
执行体1;
break;
case 2:
执行体2;
break;
default:{} 在switch.....case...中假如没有break,当他进入某个执行体后,以后每一个执行体都会执行,无论条件是否成立。
11、typeof ,类型转换
六种数据类型 : string number boolean undefined null 一种复杂类型 object (function,array)
typeof 区分数据类型 typeof(null) --object typeof null ----- object typeof NaN -----number
null类型进行typeof操作符后,结果是object,原因在于,null类型被当做一个空对象引用。
类型转换:
显式类型转化
Number()
var demo = true; var num = Number(demo) -----1 经过Number转换后变为数字类型
demo = null ; num = Number(demo) ------0 demo = undefined ; num = Number(demo) ----NaN
demo = ‘a’; num = Number(demo) ----NaN demo = ‘123’; num = Number(demo) ----123
parseInt(参数1,参数2) 参数2为基底 以目标参数为基底转为10进制 参数2 范围为:2----32
砍断原则,以最后以为数字为分界点,砍断,转换为整型。
应用举例:var demo='100px' 取出其中的100 用parseInt(demo) -- 100
parseInt(123.3) ----- 123 parseInt('123.3') ----- 123 parseInt('a') ----- NaN parseInt(true) ----- NaN
parseFloat()
以除了一个点以外的非数字位截止分分界点
String() 将其中的参数转化为字符串
Boolean() 将其中的参数转为bool类型
tostring() var demo=123 demo.tostring() 将目标转换为string类型。 注意:undefined,null不能用tostring
demo.tostring(radx) 以10进制为基底转换为目标进制
隐式类型转化
隐式类型转化都是调用显式类型的方法
isNaN()//判断是否不是数字 该方法会将参数放到Number()方法中转化,在进行判断。
++/-- +-(正负) 调用 Number()转为数字
var a='123' a++ ---- 124 var b= 'abc' ---- NaN typeof b ----number
var a = + 'abc' typeof a ---- number
+ 调用String()
var a = 'a' +1 ---- a1
- * / % 调用的 Number()
var a = '1' * 1 -----1
&& || ! 调用Boolean()
< > <= >= == !=
var a = '3'>2 字符串和数字比 调用Number()
false > true -----false 2>1>3 ----- false 2>3<1 ----- true
undefined >0 ----false undefined <0 ----false undefined == 0 ----false
null > 0 ---- false null < 0 ---- false null == 0 ---- false
特殊的:
null == undefined ---- true NaN == NaN ---- false 非数不等于任何
不发生类型转换: === !== 恒等于/绝对不等于 NaN === NaN ---false
js中未定义直接使用就会报错,但是有一种情况 typeof 可以输出未定义的变量,并且不会报错,还会输出值undefined
console.log(typeof(typeof(a))) ---- string
注意:typeof 返回值为字符串的类型