新!JS学习笔记
W3C HTML DOM标准
- 整个文档是一个文档节点
- 每个HTML元素是一个元素节点
- HTML元素内文本是文本节点
- HTML属性是属性节点
DOM树能干什么
- 1.JavaScript 能够改变页面中的所有HTML元素
- 2.JavaScript 能够改变页面中的所有HTML属性
- 3.JavaScript 能够改变页面中的所有CSS样式
- 4.JavaScript 能对页面中所有事件作出反应
简介&特点&作用
1 | ### 简介 |
JS组成
ECMAScript - 描述了该语言的语法和核心
BOM - 浏览器对象模型
DOM - 文档对象模型, 描述与浏览器进行交互的方法和接口
引入方式
- 内部:
<script> </script>
- 行内:
<div onclick="alert('')"></div>
- 外部:
<script type="text/javascript" src="path">
关键字
关键字
: 已经具有一定功能的词语
保留字
: JS保留的,可能会在将来使用成关键字的词语
var 变量名 = “属性值”;
语句
输出语句
- 页面输出语句:
1
2
3document.write(); // 直接写在页面上
document.writeln(); // 写完屁股带个空格
document.write("可以写标签") - 控制台输出:
1
console.log();
变量
- 存储作用
四种:
- 声明变量的同时直接赋值
- 先声明,后赋值
- 只声明,不赋值
- 不声明,直接赋值(尽量PASS)
示例:
1 | var 变量名; |
特殊类型 NaN, Infinity
NaN(not a number)
- NaN(not a number) 非数字的数值类型
Infinity
- Infinity 无穷大(正无穷)
- -Infinity 无穷小(负无穷)
示例:
1 | console.log(0 / 0); //NaN |
数据类型
number 数值类型
- 包括整数和浮点数
string 字符串类型
- 用单引号或双引号括起来的零个或多个单一的字符所组成
boollean 布尔类型
- 取值为true (1) 和 false (0)
undefined 未定义值
null 空类型
- null取值只有null
object 对象
- 引用型
数据类型 检测&验证&转换
typeof //检测类型
- 用法:console.log(typeof 验证对象);
isNaN() //验证是否为 非数字(其他类型)
- 用法:console.log( isNaN(验证对象) );
======
.toString() //转换字符串
- 用法:转换对象.toString();
- 不能转换null和undefined
String() //转换字符串
- 用法:String(转换对象);
- 啥类型都转
内容与空字符串拼接,可对其他所有类型进行转换字符串
- 用法:转换对象 + “”
======
- Boolean() //强转布尔类型
- 用法:Boolean(转换对象);
======
Number() //转数值,任何类型都可
- 用法:Number(转换对象)
parseInt() //转整数, 只对字符串起作用
- 用法:parseInt(转换对象)
- 不能转布尔类型和null
parseFloat() //转浮点数, 只对字符串起作用
- 用法:parseFloat(转换对象)
- 不能转布尔类型和null
.toFixed() //保留小数点位数
- 用法:处理对象.toFixed(位数)
转换数值类型, 奇妙方法
- 转换对象 * 1
- 例子:console.log(typeof ( 转换对象 * 1 ));
- +转换对象
- 例子:console.log(typeof ( +str2 ));
- 转换对象 * 1
对象object
- 引用数据类型(复杂数据类型)
- 用于存储各种键值集合和更复杂的实体
- JS对象有属性和方法,属性是存储在对象中的名称: 值对,方法是存储在属性中的函数,用于执行某些动作
- 分为 内置对象 / 原生对象 和 自定义对象
- 内置对象/原生对象是JS语言本身预定义的对象,如String、Number、Boolean、Array、Date、Math等
- 自定义对象由用户创建,也可以说是封装好的功能,可以用Object()函数创建
运算符
算数运算符
+
加- 数值计算,字符串拼接
-
减- 数值计算,字符串是纯数字做计算,是字符输出NaN
*
乘- 小数与小数相乘时,需要分别扩大倍数,结果缩小总倍数
- 小数例:console.log((0.2 * 100) * (0.2 * 100) / 10000); 输出:0.04
- 交互时用这种很不错 (a * 100) * (b * 100) / 10000
/
除- 第二个数字不能为0
- 正数除0情况:console.log输出 Infinity 正无穷
- 负数除0情况:console.log输出 Infinity 负无穷
%
取模取余- 取余的第二个数字也不能为0
- 是的情况,console.log输出 NaN
++
自增--
自减
自增 & 自减
++在后
- i先将自身的值赋值给变量a , 然后再自增1
1 | 变量设为i |
++在前
- ++在前,先给自身加1,再计算表达式
1 | 变量设为i |
–在后
- –在后,先计算表达式,再给i自身减1
1 | 变量设为i |
–在前
- –在前,先给自身减1,再计算表达式
1 | 变量设为i |
关系运算符
>
大于<
小于>=
大于等于<=
小于等于=
赋值==
等于!=
不等于===
全等 比较值和类型是否都相等!==
不全等 同上
逻辑运算符
&&
逻辑与 运算 也叫 短路与 运算- 多条件都满足 输出
||
逻辑与 运算 也叫 短路与 运算- 满足所有条件之一 输出
!
逻辑非运算
位运算符
&
按位与 运算- 数值二进制化运算(对应位都为1 输出1 否则为0)
- 例:3 & 5 = 1
- 二进制化:0011 & 0101 = 0001
|
按位或 运算- 数值二进制化运算(对应位其一为1 输出1 否则为0)
- 例:3 & 5 = 7
- 二进制化:0011 & 0101 = 0111
^
按位异或 运算- 数值二进制化运算(对应位相同为0 输出0 否则为1)
- 例:3 ^ 5 = 6
- 二进制化:0011 & 0101 = 0110
~
按位非 运算- 数值二进制化运算(对应位 0变1 1变0)
- 就是数字加一并取反
- 例:~3 = -4
- 二进制化:32位补全,反过来,在反过去
<<
左移- 数值二进制化运算 二进制值右边填0数量为被操作数
- 就是操作数乘上2的指数(值为被操作数)
- 例:3 << 2 = 3 * (2 * 2) = 12
- 二进制:0011 填0后 = 001100
- 例:5 << 7 = 5 * (2 * 2 * 2 * 2 * 2 * 2 * 2) = 256
>>
右移- 数值二进制化运算 二进制值左边移动数量为被操作数
- 就是操作数除(取模)2的指数(值为被操作数)保持正负号
- 小数变0, 负小数进一取整如 -0.12 = -1 ,-1.22 = -2
- 例:-12 >> 2 = -3
- 例:3 >> 2 = 0
- 例:-3 >> 2 = -1
>>>
无符号右移- 数值二进制化运算 无符右移动 忽略正负号
- 就是操作数左边补0 忽略正负号
- 例:-12 >>> 2 = 1073741820
- 二进制:-12 = 1111111111111111111111111111111110001100
- 额现阶段不太理解,后续更改吧
三元运算符(三目运算符)
跟if else效果差不多
语法:
- 判断条件 ? 执行语句1 : 执行语句2
- 结果为真执行? 后语句1
- 结果为假执行: 后语句2
- 多条件可以换行写,但是行尾不要加分号
案例:
1 | /* |
- 案例2:
1 | /* |
条件语句
if…else if…else
1 | //单分支结构语句 |
switch语句
case 常量 : //表示不同情况
表达式的结果等于哪个case的常量,则执行其后的语句,执行完break就跳出switch结构,都不满足则执行default的语句。
switch 用的是全等比较
语法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28switch(表达式){
case 常量1 :
语句;
break;
case 常量2 :
语句;
break;
···
case 常量n :
语句;
break;
default:
语句;
break;
}
//也可以--
switch(){
case 常量1:
case 常量2:
case 常量3:
语句;
break;
case 常量4:
语句;
break;
}
循环
while语句
循环结果为true,就继续,直到false
人话:满足条件就停止
持久循环使用这个
下面迭代条件语法位置顺序要写对,🐎蛋写错了会把内存撑爆
语法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16while(循环条件){
//循环体
//统计次数, 从零开始(可有可无)
//迭代条件 ++ --
}
-------------
//例:
//打印10次OK 循环从0开始
var i = 0
while(i < 10){
console.log("OK");
count++ ; //统计次数,从零开始(可有可无)
i++ ; //迭代条件
}死循环写法:
没差啥条件为true而已
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18/*案例:
银行存款有5万元
利息是0.73%
几年后能到11万
*/
var money = 5000;
var year = 0;
while(true){
money = money + money * 0.0073 ;
year++ ; //循环一次 年份加一
if(money >= 110000){
break; //true 终止操作
}
}
console.log(year + "年可达11万元")
do-while 语句
与while循环区别,这个是先循环后判断 ,至少会跑一次
- 也就是说不满足跑一次
语法:
1 | do { |
for循环
- 语法:
1 | //执行顺序 1(初始变量) 2(循环条件) 3(循环体) 4(迭代条件) |
区别
while 和 do-while 区别
while 先判断,后执行
do-while 先执行,后判断
while循环和 do while循环当while后面的表达式的第一次的值为“真”时
- 两种循环得到的结果相同;否则不相同。
for 和 while 区别
- while是多用于不知道循环次数的时候使用
- for是多用于已知循环次数的时候使用
break和continue的区别
break 结束整个循环 执行循环后的语句
continue 结束本次循环 继续下一次循环
DOM文档接口 & 事件 & 弹窗
DOM文档接口
1 | - document.write(" ") //直接页面输出 也可以写标签 |
事件
1 | - onclick 单击事件 |
弹窗
1 | - alert("") 直接输出 |
函数
普通函数:
- 没用特殊要求时,可以用普通参数
带参函数:
- 具体值不定时,使用带参函数
形参: 函数体内的参数,如果实参传入少于形参,多出来的形参值为undefined
- 例:
1
2
3
4
5
6
7function name(形参1, 形参2, 形参3){
console.log(形参1 +","+ 形参2 +","+ 形参3);
}
name(实参1, 实参2)
//输出
实参1,实参2,undefined
- 例:
实参: 调用时传入的参数, 当实参多于形参,多的部分会自动去掉,跟没识别差不多
传参: 将实参对位传递给形参的过程
- 具体值不定时,使用带参函数
语法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function name(参数){
函数体;
}
- 参数也可以是 其他类型 只要有值
//expmale:
function name(a,b){
函数体
}
//use
name( 1 + 1, prompt("???"))
//传入时注意参数类型是否满足函数体执行