JavaScript
js的书写,每一条语句后面加; 代表语句结束
js语法错误会引发后续代码终止,但是不会影响接下来其他的代码块
JavaScript的引入
引入js有两种方法,很简单:
1 页面引入js,利用script标签
2 直接引入外部js
JavaScript变量
html/css不是变成语言,js是编程语言,需要给变量。
创建一个变量:
var a=100;
这句代码其实是两个过程,首先申请变量空间,然后赋值:
1 第一步,首先声明一个变量a,var a;
2 第二步 给声明的变量a赋值100,a=100;
变量的命名规则
1 头一位必须是英文字母,_,$开头。
2 变量名可以包含英文字母,_,$,数字。
3 不可以使用系统的关键字,保留名作为变量名,系统保留字如下
变量之间的运算
等号右边的值(内容)先进行运算,运算结束后,把结果值赋给等号右边
JavaScript的数据类型
JavaScript是弱类型的编程语言,声明变量的时候不用指明其类型,变量的类型由变量的值来决定,所以js的数据类型是直接针对变量的值的,数据类型限制了数据可以进行的操作,以及数据需要占用的存储空间。
JavaScript的数据类型一共有六种,又分为两类,分别为原始值和引用值:
JavaScript的原始值有五种,分别为Number数字类型,String字符串类型,Boolean布尔类型(是/否),Undefined未定义类型,Null空类型。
除了上述五种原始值以外的数据类型均属于引用值,也就是对象类型,数组,函数都属于对象类型。
栈内存和堆内存
原始值和引用值的存放空间是不一样的,原始值存放在栈(stack),引用值存放在堆(heap)
下面详细介绍这两种不同存放空间的区别
栈内存:
栈内存用来放原始值,先进去的东西最后出来
栈内存和栈内存之间的关系是拷贝,比如在栈里面给一个a=10,再让b=a,其内部原理是先把a拿出来,给a的值进行一份拷贝,再把拷贝的值赋予b,对a本身没有影响,后续修改a的值就是修改a的值,修改b的值就是修改b的,两者之间没有直接关系,互相不影响。
堆内存:
堆内存的存放规则,var arr=[1,2],声明一个引用值数组,内部存放原理是,还是先在栈内存的底部,创建一个arr的房间,就是正常的变量声明过程。然后系统发现该变量的值[1,2]是一个数组,是引用值,就会将[1,2]这个引用值放进heap堆里面存放,并且在栈内存里存进,存储[1,2]的栈内存的地址。
如果再声明一个arr1=arr,则还是先走栈内存赋值流程,把arr里存放的[1,2]数组的heap的地址拿出来,复制一份地址,把复制的地址送给arr1,这样arr1和arr都指向[1,2]的heap地址,修改heap内存中的[1,2]
如给[1,2]里面额外push一个3,会导致arr1和arr的内存都随之改变为[1,2,3]
但是如果是
var arr=[1,2]
var arr1=arr;
arr=[1,3];
这时的arr1的值还是为[1,2],而没有随着arr的改变变成1,3。为什么呢,因为让arr=[1,3]等于在堆内存heap中存入了一个新的[1,3],并用指针从原本的arr与[1,2]相连改为与[1,3]相连。同时栈stack里存放的heap地址也会改成新的[1,3]的heap地址。
引用值和原始值的不同是赋值形式的不同,原始值的特点,不可改变的原始值,房间里放入了值就不可以改变。还有一个内部机制,var a=100,a=200,a的值发生改变的时候,并不是在原有储存a=100的房间中直接修改a的值,而是新启用一个空间,在空间中存入200的值,并且给这个空间贴上变量a,最后再把原先a=100的空间注销掉,变成一个野房间。
JavaScript运算符,逻辑运算符
加号+ :字符串+字符串=字符串连接 任何数据类型+字符串=字符串
摩尔% :取余数
++:等于a+=1 在自身原有基础上加一
- - :等于a-=1 在自身原有基础上上减一
赋值顺序,从右向左,计算的顺序,自左向右,如果有括号的话,和数学一样优先运算。
比较运算符
大于等于小于 字符串比较的是ASCII码
逻辑运算符
&&:与
||:或
!:非
与运算符 &&:
与运算符会先看符号左边的表达式是否为True,除了下列为False以外,其他的值都为True
undefined,null,NaN,"",false,0这些为false,除了这些都是True
先看第一表达式转换为布尔值的结果,如果第一个表达式为假,直接返回第一个表达式的值,如果为真,会看第二个表达式转换为布尔值的结果。
如果只有两个表达式,就只看到第二个表达式,返回第二个表达式的值。也就是说,只有两个表达式,第一个表达式为真,不管后面第二个表达式的真假,都返回第二个表达式的值
更多的表达式也是一样的,按照这个规则,只要为真就往后看,是假的就返回
与运算符,可以当短路语句使用,data && document.write,data有意义的时候才会执行
或运算符 ||:
还是看布尔值,只要布尔值为真就返回,如果所有都为假,返回最后一个假的的值。
非运算符 !:
转换为布尔值取反,如果是!!的话,则取反再取反