基础语法
一、基础语法
1、变量
概念:内存中存储数据的一个容器。
声明方式:
var 变量名 // 在内存中开辟了一个空间
var 变量名 = 值 // 内存中开辟空间并放入数据
变量名的规则:变量名由字母、数字、下划线、美元符号、汉字组成,不能用数字开头,不能将关键字作为变量名。
关键字:
var typeof isNaN Number String Boolean Object Array Function function break if else switch case default for while do continue in of Date top window new this Math
=
在代码中不叫等于
叫赋值符
。左边一定是一个即将放入数据的变量,右边一定是具体的数据或能得到具体数据的表达式,作用是将右边的数据放入左边的变量中。
2、数据类型
js中的数据类型:
-
number:数字类型
isNaN(数据) - 判断数据转成数字是否是NaN
小数计算不精准:
原因:计算机内部对数字的处理要转成二进制,小数转二进制有时会转成无限死循环,导致计算机存储小数不精准,所以计算结果也不精准。
解决:
① 先乘以10的n次方将两个数字都转成整数,计算,除以10的n次方 ② 数字.toFixed(数字) - 强制保留小数点后几位
-
string:字符串类型
字符串可以进行
+
运算,将两个小字符串拼接成更大的字符串用document.write输出标签,必须将标签当做字符串输出,才能在页面中解析标签
单引号字符串不能嵌套单引号字符,双引号字符串不能嵌套双引号字符,除非将引号字符转义:
\
-
boolean:布尔值 - 描述一个条件的成立与不成立,只有两个数据:true/false
-
undefined:未定义 - 当一个变量定义了但没有赋值,值就是undefined(浅灰色),类型也是undefined(黑色字符串)
-
object:对象 - 复杂的数据,一个空间存储多个数据
-
function:函数 - 存储一段代码的变量
3、运算
-
算术运算
符号:
+ - * / %
-
赋值运算
+= -= *= /= %=
是简写
-
比较/关系运算
> >= < <= == === != !==
!=和!==是==和===的取反
-
逻辑运算
&& || !
4、类型转换
4.1、隐形转换
-
+
左右两边有一个是字符串,另一个也会转成字符串进行拼接 - 算术运算符号会将左右两边都转成数字进行算数运算
- 比较运算左右两边有一个是数字,另一个也会转成数字进行数字的大小比较
- 数据放在分支语句的小括号,会隐形转成布尔类型
- 非字符串数据作为对象的属性,会隐形转成字符串类型
4.2、强制转换
-
转数字
Number(数据):
转成数字纯数字字符串
空字符串、null、[]转成0,其余数据都转成NaN
parseInt(数据):只有整数开头的字符串能转成整数,其余的都是NaN
parseFloat(数据):只有数字开头的字符串能转成数字,其余的都是NaN
-
转布尔类型
Boolean(数据):0、空字符串、null、undefined转成false,其余的都是true
-
转成字符串
String(数据):数组转字符串,去除了[];对象转字符串 - '[object Object]'
数据.toString():null和undefined不能使用,其余的结果跟上面一样
二、分支语句
概念:做判断的结构
1、单分支
if(条件) {
当条件为true的时候执行的代码段
}
2、双分支
if(条件) {
当条件是true的时候执行的代码段
} else {
当条件为false的时候执行的代码段
}
3、多分支
if(条件1) {
当条件1是true的时候执行的代码段
} else if(条件2) {
当条件2是true的时候执行的代码段
} else if(条件3){
当条件3是true的时候执行的代码段
}...
else{
上面条件都是false的时候执行的代码段
}
多选1执行
第一个不成立,才会去执行第二个。。。
4、switch多路判断
switch(变量) {
case 值1:
当变量 === 值1 的时候执行的代码段
break
case 值2:
当变量 === 值2 的时候执行的代码段
break
....
default:
上面条件都不成立的时候执行的代码段
}
break可以省略,后续的case不判断,直接执行
default可以省略
多路判断比多分支效率高,只判断一次
多路判断只能判断 全等
5、三元运算
能且仅能简化简单的双分支
条件 ? 条件是true的时候执行的代码 : 条件是false的时候执行的代码
整个三元运算表达式可以当做是一个具体的数据,进行输出、赋值
例:
num = num.length === 1 ? '0'+num : num
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed)
三、循环结构
学习目的:简化重复
1、while
while(条件) {
条件是true的时候重复执行的代码段
}
2、do-while
do{
代码段 - 先执行一次,然后判断条件,后续是否执行就看条件是否为true
}while(条件)
3、for
for(初始值定义语法; 条件; 变化) {
条件为true的时候重复执行的代码段
}
重点:循环执行的过程
四、函数
理解:存储一段代码的容器
定义语法:
function 函数名(形参1, 形参2, ...) { // 形参就是变量名
// 形参就相当于在函数内提前定义好的变量
// 如果没有实参给形参赋值 - 形参默认是undefined
// 形参可以直接给赋值 - 形参有默认值 - 只能放在最后
代码段
// 如果函数调用后需要得到一个结果 - 必须return 结果
// return 可以阻止代码向下执行
}
函数名的规则:跟变量名的规则一样
调用语法:
var 变量 = 函数名(实参1, 实参2, ...)
<font color="red">**预解析: **</font>
概念:代码在执行之前先进行解析
过程:从当前作用域找所有变量定义和函数定义,找到后将变量定义和函数定义的代码提升到当前作用域的最前面。代码按照提升后的顺序执行。
注意事项:
- 只提升定义,不提升赋值
- 当变量名和函数名同名,保留函数,忽略变量
- 预解析一定在执行之前 - 不会执行的代码中如果有变量和函数的定义,也会预解析
- 全局有全局预解析,局部也有局部的预解析
- 局部如果有形参,先给形参赋值,再进行预解析,且预解析的函数跟形参同名,函数会覆盖掉形参的值
- 代码报错以后的代码就不再执行了 - 如果代码中有报错,就无法阻止默认行为了
- 连等特殊语法:var a = b = 9 相当于:var a = 9 b = 9
函数的本质:就是一个特殊变量,存储了一段代码,可以通过变量名()执行这段代码
匿名函数:将一个函数赋值给变量使用 - 这个变量的类型是function,值就是这一段代码 - 原本函数中的名字就失效了 - 这样没有名字的函数就叫匿名函数
匿名函数作用:
-
将匿名函数赋值给变量使用
-
自调用
(function(形参) { })(实参)
<font color="red">作用域</font>
概念:能起到作用的区域
分类:全局和局部
在全局中定义的变量叫全局变量 - 可以在任何地方使用
在局部中定义的变量叫局部变量 - 只能在局部中使用
重点:全局不能访问局部变量,局部可以访问全局变量
作用域链:作用域会发生嵌套,这样形成一条链式结构叫作用域链。
作用域链的规则:
- 将一个变量当做具体数据使用(输出、让他去运算)的时候,先在当前作用域中找这个变量的定义,如果没有,就去上级作用域中找,。。。直到全局,全局没找到,报错:XX is not defined
- 给一个变量赋值,先在当前作用域中找变量的定义,如果没有,就去上级作用域中找,。。。直到全局,全局没找到,就在全局定义这个变量并赋值 - 省略var定义变量
递归函数:
概念:在函数内调用自己 - 形成循环
注意事项:一定要添加停止的条件
事件:
给标签添加行为。
标签.on类型 = 一段函数代码
一段函数代码可以是匿名函数,也可以用函数名表示。一定不是函数调用的语法。
网友评论