1.js组成
1)ECMAscript
ECMA为了同意浏览器对js的解释,特定了一个标准
变量
注释
保留关键字
操作符
数据类型
流程控制豫剧
数组
函数
对象
正则表达式
DOM(页面局部更新)
文档对象模型
浏览器厂商根据js的标准编写的操作html/css的库就叫做DOM
BOM(ajax)
浏览器对象模型
浏览器厂商利用js编写的操作浏览器的库
超时调用,间歇调用
本地存储
ajax
弹框
location
定位
2.注释
//当行注释
/*
多行注释
*/
3.变量
1)使用
声明
var a; //通过var关键字声明一个变量,a为变量名
a = 2; //初始化,第一次赋值
var a = 2;
console.log(a); //使用
2)弱类型
java属于强类型语言
int a; //1.变量的类型在声明的时候确定
a = 2;
typeof a; //
a = true; //2.a为int类型,无法将Boolean类型的值赋值给a
a = 3.5;
typeof a; //
js属于弱类型语言
var a; //1.变量的类型在声明的时候无法确定
a = 3; //变量的类型在赋值的时候确定
typeof a; //3.number
a=true; //2.变量的类型可以通过赋值的不同而发生变化
a = 4.5;
typeof a; //3.获取a的数据类型,number
3)奇葩的var
1.可以在变量声明之前访问变量
console.log(a); //执行结果为undefined;
var a=3;
var声明的变量会被提升,在执行环境中,执行代码之前,会将所有的var声明变量提升到所有代码执行之前
var a;
console.log(a);
a = 3;
2.变量可以重复声明
var a = 3;
console.log(a);
var a = hello world;
console.log(a);
输出结果为
3
hello world
因为var声明的变量会被提升
var a;
a = 3;
console.log(a);
a = hello world;
console.log(a);
3.没有局部作用域
function foo(){
var a = 3;
if(true){
var b = 4;
}
console.log(b);
}
foo();
输出结果
5
4.es6的改进
为了符合服务器编程的特点,提供了替代var的东西,即let。let与java、c常规服务器编程语言相似
const与let类似,不同的是const用于声明常量,let用于声明变量
4.数据类型
1)基本数据类型[简单数据类型]
number
var a = 3;
var a = 011; //八进制
var a = 0x11; //十六进制
var a = 3.2;
var a = 'a'/2; //NaN不是一个数字
var a= 2/0; //infinite
Boolean
var a = true;
var a = false;
string
var a = 'hello world'
var a = "hello world"
var a = `hello world`
反引号在使用的时候会保留回车
var a = `
hello
world
`
输出结果:
a:
hello
world
react jsx (javascript + html)
注意
引号的嵌套是不同类型,除非是字符串拼接
字符串拼接变量使用加号
var name = "terry"
var a = "hello" + name + "welcome"
null
空对象,目前为空,将来的某个时刻为对象
typeof null //object
var gf =null;
console.log("a:",a); //输出结果为null
console.log("a的数据类型:",typeof a);
undefined
var a; //a为undefined
var a = undefined;
2)引用数据类型复杂数据类型
变量中实际保存的是值在堆中的引用地址
除了基本数据类型之外的其他数据类型都为引用数据类型
所有的引用数据类型的值都可以调用object、prototype
object
var a = {name:"terry",age:12,gender:"male"}
function
array
var a = ["merry","lili","nana"]
RegExp正则
var = /\d{11}/ig
3)基本数据类型和引用数据类型在内存中的表现
栈区:后进先出,栈区用来保存变量的值,如果变量是基本数据类型,变量的值保存在栈区;如果变量是引用数据类型,引用地址(指针)保存在栈区
堆区:引用类型的值
5.操作符
1)算术运算符
一般用于数字之间的运算,但是也支持非数字类型的运算,非数字类型的先转换为数字类型,再进行运算
+,+=
-,-=
*,*=
%,%=
/,/= 除(因为js为弱类型语句,所以为除;java有高精度,所以在java中为取整)
=
2)逻辑运算符(短路运算符)
操作数可以为任意数据类型,并且返回值也可能是人任意数据类型
&&
esp1 && esp2
esp1为true或者是可以转换为true,整个表达式的结果取决于exp2,返回esp2
“hello” && “world” //结果为world
esp1为false或者可以转换为false,整个表达式的结果已经确定,返回exp1
null && true //结果为null
||
esp1 || esp2
esp1为true或者是可以转换为true,整个表达式的结果已经确定,直接返回esp1
esp1为false或者可以转换为false,整个表达式的结果取决于exp2,返回esp2
!
!false //true
!“hello” //false,先将hello转换为true
!!“hello” //true
快速将其他类型的数据转换为布尔类型
3)比较运算符
>
<
>=
<=
==,!=
当两个操作为都为引用数据类型,比较的是引用地址
不比较数据类型,直接比较值,如果两个值的数据类型不同,会先转化为相同类型的值再比较
===,!==(推荐)
当两个操作为都为引用数据类型,比较的是引用地址
先比较数据类型,再比较值,如果数据类型不一致直接返回false,如果数据类型相同再来比较值
4)三目运算符
esp1?esp2:esp3
判断esp1是否为真,如果为真,返回exp2,否则返回exp3
var age = 12;
var msg = age > 16?"成年人":"未成年人"
5)位运算符
原码、反码、补码
&
3 & 2
3: 0000 0011
2: 0000 0010
0000 0011
&
0000 0010
0000 0010
|
0000 0011
&
0000 0010
0000 0011
^
0000 0011
&
0000 0010
0000 0001
6)一元运算符
+ 正
+true //1
可以通过这种方式快速将其他数据类型转换为数值类型
- 负
-true //1
可以通过这种方式快速将其他数据类型转换为数值类型
++ 自增
前置
先自增,再参与其他运算
后置
先参与其他运算,再进行自增
var a = 3;
++a + a++ //8
/*
执行过程
++a 4 a为4
a++ 3 a为3
++a + a++为4+4=8
a最后为5
*/
-- 自减
7)拼接运算符
“true” + 1 //“true1”
undefined + 1 //“undefined1”
任意数据类型的值与字符串相加都为字符串
6.类型检测
1.typeof
var a = 3;
typeof a; //检测a的数据类型
2.isNaN(是非数值)
isNaN(a);
当a为NaN类型时返回true
3.isFinite(是非有限值)
isFinite(a)
当a为infinity类型时返回false
7.数据类型的转换
Number
Number() 无法从字符串中解析数字,一般用于将字符串数字转化为数字
parseInt(str[,flag]) 从字符串中解析数字,整数,从前往后解析,直到遇到非数字字符
flag 表示进制
parseFloat() 从字符串中解析数字,小数
Boolean
Boolean()
一般会将null、undefined、0、“”、NaN等负面值转换为false
String
String()
a + "" //任意的数据类型加上空字符串都会成为字符串类型
8.流程控制语句
1.分支
(1)if-else
单分支
if(esp1){ //遇见卖葡萄
esp1 //买葡萄
}
exp3 //回家
当esp1为真,执行esp2,esp3始终执行
双分支
if(exp1){
exp2
}else{
exp3
}
当exp1为真时,执行exp2,否则,执行exp3
多分支
if(exp1){
exp2
}else if(exp3){
exp4
}... else{
exp
}
当exp1为真时,执行exp2;当exp1为假,单exp3为真时,执行exp4....如果在else之前全部为假,则执行exp
(2)switch-case
switch(变量){
case 常量1:
exp1
break;
case 常量2:
exp2
break;
...
default
exp
}
2.循环
要素:初始化条件,结束判定条件,迭代
(1)for
for(初始化条件;结束判定条件;迭代){
循环体
}