JavaScript学习笔记--进阶之路
了解js特性&事件使用
20200316
1、JavaScript简介
历史:
第一个浏览器 就是文本和图片
网景公司 增强用户的使用体验 急需一门语言 实现用户和网页之间的交互
诞生:为了实现用户和网页的交互而出现
(1) 网景公司的布兰登艾奇开发了js who
(2) 借鉴了 java的数据管理机制和c的函数 how
(3) Js的创建是用来解决浏览器和用户之间互动的问题的(表单提交问题)do
(4) Mocha-->liveScript-->javaScript 历程
1、开发一门新语言
2、使用已经成熟的语言(java<sun> python c ------)
这个时候使用的是java ----- 笨重
95年的时候 布兰登.艾奇 网景公司
javascript 布兰登.艾奇 10天
javascript 完善?
es1 es5和es6 es10
2、JavaScript特点、功能
Js是一门 基于对象的,由事件驱动的,解释性 脚本语言
javascript 核心组成:
1、ECMAscript 核心语法 规定这门语言怎么写或者说怎么用
2、DOM document object model 文档(html) 对象 模型 DOM提供了一些操作html文档的方法 ---- 标签
3、BOM browser object model 浏览器 对象 模型 BOM提供了一些操作浏览器的方法 --- 浏览器
javascript特点:
1、解释性的脚本语言 ------ 浏览器可以直接读写
2、基于事件的 -- 必须是事件触发 才能运行某一个效果
3、基于对象的 -- 万物皆对象 面向对象编程 es5里面没有对象这一个说法 只有类对象 在es6里面才有对象的概念
4、跨平台的 --- 是否有浏览器有关系
5、弱类型语言 -- 定义变量的关键字是唯一的 使用的是var
和编译语言之间的区别:
- java --> 编译器 -->0101010 --> 效果
- JavaScript --> 浏览器(javascript引擎)
- Java和JavaScript之间关系 --> 没有关系
3、JavaScript引入方式
行内:
不需要在开始标签写入javascript 这个关键词 和内部样式是有区别的
注意:引号的嵌套 如果遇到引号的嵌套,需要外层引号和内层引号不能相同
不推荐使用行内引入的js代码 不利于结构和js代码逻辑的分离
onclick:是点击事件 只有点击了才能执行 不点击就不会执行
alert(1):是js自带的弹出框,带有一个确定按钮 只是用来测试使用 不能用于实际的开发
和超连接里面的#号不一样 #属于空链接 alert属于事件弹出框
alert():可以放置任何内容,一般用来测试 如果是中文或者英文 要使用引号引起来,数字或者变量 不需要使用引号
<div onclick="alert(1)">我是被点击才能生效的</div>
内部:
在html代码中写入script标签,
在script双标签之间写入js代码
注意:在HTML文档中可以写入多个script标签,也可以将script标签写入任意位置,只建议放在head和body的结束标签之前,紧紧挨着head和body的结束标签
我们推荐大家将script标签写在body标签的末尾
Html代码的执行顺序是从上到下的,如果遇到script标签,就会先进入script标签,执行js代码,执行完之后再继续向下执行,因此如果在body前面获取元素,就获取不到,因此建议写在body标签的末尾
<script>
alert(1);
</script>
外部:
注意扩展名 是.js
外部js的引入 要使用script双标签 并使用src属性 引入外部js的路径
href和src的区别:都是指的路径 一个是外部样式的路径 一个是外部js的路径
script双标签在页面的位置,可以放在任何位置,但是,只建议放在head和body的结束标签之前,紧紧挨着head和body的结束标签
<script src="./js/index.js"></script>
注意:在使用外部js 的时候,不需要在外部js里面在写入script 双标签
伪协议:
<a href = 'javascript:;'></a>
注:当内部js写在head标签内的时候添加如下代码
window.onload
Window.onload = function(){ js代码 }
//当js必须写在头部时:
window.onload = function() {
var btn = document.getElementById('btn');
console.log(btn);
btn.onclick = function () {
alert('我是被点击的');
}
}
作用:写在大括号中的js代码会等到 页面上的所有标签和外部资源(图片、音频、视频、外部文件)都加载完 再执行
3.1、三种引入方式优先使用哪个?
优先使用外部 (页面和js的开发可以分离,提高开发效率)
对于一些简单的小效果 可以使用内部 尽量不要使用行内
3.2、js如何注释
被注释掉的代码是不执行的
在开发中,没有删除代码着一种说法,只有注释代码
单行注释 //
多行注释 /*注释的代码*/
快捷键 ctrl+/
4、js鼠标等事件
鼠标事件:
onclick 点击事件
ondblclick 双击事件
onmouseover / onmouseenter 鼠标移入元素
onmouseout / onmouseleave 鼠标离开元素
onmousemove 鼠标在元素中移动
onmousedown 鼠标按下
onmouseup 鼠标抬起
oncontextmenu 鼠标右键菜单事件
键盘:
onkeydown 按下
onkeyup 抬起
onkeypress 按下并抬起
表单控件:
onblur 失去焦点
onfocus 获取焦点
oninput 输入
onchange 改变
onsubmit 提交
onreset 重置
页面:
onload 页面加载结束
onscroll 滚动
onresize 改变大小
统一语法:
事件源.事件类型 = 事件处理函数
//=====示例===========onmouseover和onmouseenter的区别=======会有冒泡===
这个事件认为子元素和父元素是不同的元素 因此在移入子元素之后,就理解为移出了父元素,因此从子元素中重新移入父元素也会再触发父元素的移入事件
oDiv.onmouseover = function() {
console.log('父');
}
son.onmouseover = function() {
console.log('子');
}
//onmouseenter中 在父元素中移出移入子元素 父元素的移入事件并不会触发
oDiv.onmouseenter = function(){
console.log('父');
}
son.onmouseenter = function(){
console.log('子');
}
4.1、事件
Js添加事件的方式
元素.事件名 = function(){ 当事件发生的时候浏览器页面要执行的反馈代码 }
事件不要重复添加,如果重复添加,后面的会覆盖前面的
5、js获取元素
get:获取 / set:设置
Element:元素 指的是标签名
By:通过
Id:ID名字
document.getElementById('id名字');
测试语句: console.log();把结果在控制台打印出来
document.getElementById('box').onclick=function(){
alert(1);
}
当使用内部或者外部js的时候,要把功能代码 放在一个函数的代码块里面
getAttribute()
6、js变量
6.1、定义赋值
定义:可以改变的量,存储数据的容器
使用关键字 var 定义 js里面所有的变量都是使用 var 关键字定义 所谓被称为弱类型语言
因为定义所有的变量只使用 var 关键字 ,所以是弱类型语言
变量的创建方式
变量的声明和赋值
声明:var 变量名; //拿来了一个空容器
赋值:变量名 = 变量值; //将数据作为内容存入容器中
变量的声明和赋值合写
var 变量名 = 变量值;
变量的连续声明
var 变量名1 = 变量值,变量名2 = 变量值,变量名3 = 变量值....
变量的连等
var a = b = c = 10; //a b c都是10
---------------------------------------------------------------------
var num = 10;
var: 申明变量的关键字
num: 变量名
= : 不是等于的意思,是赋值
10: 变量值
js里面的值的类型 是由等号右面的值决定的
6.2、命名规则
名字见名知义具有语义化,遵循驼峰标识(从第二个单词开始,首字母大写) userName passWord
变量名只能以 字母 、_ 、$ 、开头
不能使用关键字和保留字 保留字就是候选关键字
变量名不要相同(后面的会覆盖前面)
变量命名只能使用字母,数字,_,$四种字符,除此之外,都不能使用
$_abc123 除了这四种之外其他都是特殊字符,不能使用
分号:
告诉浏览器,这一行代码结束了
最好是带上分号,好习惯
引号:
单引号和双引号
单引号和双引号都是成对出现的,不能交叉使用 要嵌套使用
单引号里面一定要使用双引号 双引号里面一定要使用单引号
7、事件的三部曲
谁发生了事件
发生了什么事件
发生了什么事情
------------------------------------------------------------------------
//1、 btn发生了事件 获取btn
var btn = document.getElementById('btn');
// 2、发生了什么事件 onclick
btn.onclick = function(){
// 3、把‘我成功被点击了’打印到控制台
console.log('我成功被点击了211111');
}
alert()和console.log():两个测试语句的括号里面,除了变量名和纯数字以为,其他的都要加引号
8、JavaScript操作属性(内容、标签、样式)
操作表单元素:
表单元素.value;//获取表单内容
表单元素.value = '新的值'; //设置表单内容
txt.value = null;
9、操作闭合标签(双标签)内容
innerHTML
标签.innerHTML //获取内容
标签.innerHTML = '新内容' //设置内容
innerHTML会覆盖原来的内容
innerText
获取内容的
标签.innerText //获取内容
标签.innerText= '新内容' //设置内容
innerText会覆盖原来的内容
区别:
innerHTML是可以识别标签,并正常输出的 但是 innerText是不可以识别标签的,会把标签当作文本正常打印
9-案例
<body>
<div id="box">春眠不觉晓 处处蚊子咬</div>
<script>
var box = document.getElementById('box');
// console.log(box);
// console.log(box.innerHTML); // 获取标签内容
//box.innerHTML = '我是新内容'; // 设置新内容覆盖原内容
// 原来的内容和新的内容全部保留住
// box.innerHTML = box.innerHTML+'我是新内容';
// box.innerHTML += '我是新内容233333'; //简写
---------------------------------------------------------------
// console.log(box.innerText);
// box.innerText = '123';
// box.innerText = box.innerText + '789';
// box.innerText += '789';
// 区别:
// box.innerHTML = '<h1>我是可以识别标签的</h1>';
box.innerText = '<h1>我是可以识别标签的</h1>';
</script>
</body>
10、操作元素属性
元素的属性有哪些 ?
html属性:
id class title
原有属性 id class title 自定义属性 : 自己起名字
标签.属性名 //获取属性
标签.属性名 = '新属性值' //设置属性
这种方式对自定义属性是获取不到的
在操作类名的时候需要注意 不能直接写class(因为class是一个关键字),而应该写 元素.className 元素.className = '类名'
这种形式操作html属性 只能操作标签自带的属性,如果元素不自带的属性不能操作
10-案例
<style>
.active{
width: 100px;
height: 100px;
background: red;
}
</style>
<body>
<!-- 操作元素属性 -->
<div id="box" class="div" title="我就是我"></div>
<script>
var box = document.getElementById('box');
// console.log(box);
// console.log(box.id,box.title);
// box.id = 'box1';
// box.title = '我不是我 我也不知道是谁';
// class的获取设置以及使用
// console.log(box.class); 无法获取class值
console.log(box.className); //使用className获取
box.className = 'active';
</script>
</body>
11、操作元素样式
行间样式和非行间样式
js操作的样式,不管是添加样式,还是覆盖样式 或者是修改样式 最终显示的位置都是行间样式
获取属性:标签.style.样式名;
oDiv.style.width; 获得了oDiv的宽度
设置属性:标签.style.样式名 = '样式值';
oDiv.style.width = ‘300px’; 设置了oDiv的宽度
## 注意:js里面是没有 `-`,当使用样式里面的复合词的时候,要把`-`去掉,然后从第二个单词开始,首字母要大写 如font-size --> fontSize
cssText
添加样式的时候,1、保证样式在同一行 2、字符串拼接
会完全覆盖原来的样式 box.style.cssText += 'width: 100px;height: 100px;border:2px solid blue';
兼容:
打印值的时候,在`IE`浏览器里面 样式名和样式值 都是大写,并且数无序的
`IE`浏览器并不会读写cssText,必须在样式前面加 `;`
11-案例
<body>
<div id="box" style="width: 200px; height: 200px;"> 我是为你</div>
<script>
// 获取元素
var box = document.getElementById('box');
// console.log(box);
// 标签.style.样式名 = ‘样式值’;
box.style.width = '100px';
box.style.height = '100px';
//box.style.background = 'blue'; // 英文 十六进制
// box.style.background-color = 'red'; // 错误的
box.style.backgroundColor = 'red'; //js中采用驼峰命名,不能使用 - 连接
box.style.fontSize = '20px';
</script>
</body>
注:相同属性后写的覆盖之前的,没有的会添加
当你的属性值赋值给一个变量的时候,如果使用这个变量,那么 `.` 的形式就不能使用了
解决方案:我们使用`[]`形式实现属性的获取以及设置
只要是从键盘输入的,都是字符串,也就是用引号引起来
如果直接使用的是属性名 那就用`.` ,如果属性名 赋值给了一个变量,并且你想使用这个变量来改变属性,那就使用`[]`.
-------------------------------------------
cssText
<body>
<div id="box"></div>
<script>
1、 var box = document.getElementById('box');
// box.style.cssText = 'width: 100px;'+
// 'height: 100px;'+
// 'background: pink;';
// 标准浏览器的
2、 box.style.cssText = 'width: 100px;height: 100px;background: pink;';
box.style.cssText += 'width: 100px;height: 100px;border:2px solid blue';
console.log( box.style.cssText)
// IE兼容解决:非标准浏览器的 指的是ie 5 6 7 8
box.style.cssText += ';width: 100px;height: 100px;border:2px solid blue';
</script>
</body>
注:cssText 书写折行时需添加''+'' 形式将属性连接 如1
一行书写时如2
数据类型&操作符
20200317
1、数据类型的分类
1)基本数据类型(用来存储单一数据)
数值类型 Number
字符串类型 String
布尔型 Boolean (true/false)
空值 null undefined
2)复杂数据类型(可以用来存储多种数据类型)
对象 Object
函数 function(){}
数组 Array()
2、typeof操作符
为什么需要知道数据类型?
为了保证正常的运算,需要使用运算符把数据链接起来,形成表达式
数据的类型是有值决定
用来确定定义的数据是哪种数据类型
空格 typeof 变量名 我们一般用来判断基本数据类型
括号 typeof (变量名) 我们一般用来判断复杂的数据类型
instanceof运算符 用来确定当前的实列化是不是当前的对象创建的
2-案例
var d = 10;
console.log(typeof d) 控制台返回number数值型
console.log(typeof(d)) 两种写法
3、基本数据类型--Number类型-数值类型
整数和小数
如果是小数,并且第一位是 0 ,可以省略,并不影响打印
如果是小数,并且最后一位是 0 ,0会被自动省略
负值
整数或者小数的负数
进制
二进制 0101
八进制(0-7) 如果超出这个范围 自动转化成十进制
十进制 (0-9)
十六进制(0-9 a-f)以0x开头 x可以大写也可以小写
小数相加
小数计算的方式是按照 `IEEE 754` 64位方式进行计算的 进度缺失;
解决方式:扩大100倍 结果缩小100倍
NaN
当进行一个不正常的运算的时候 会产生NaN
不是一个数字的数字 类型number
作用:只是告诉开发者,你的表达式运算出现了不正常的运算
3-案例
//进度缺失 0.1 0.2特殊
var a = 0.1;
var b = 0.2;
console.log(a + b);//0.30000000000000004
解决:扩大一百倍
console.log((0.1*100 + 0.2*100) / 100); // 透明度计算会遇到
var c = 0.2;
var d = 0.3;
console.log(c + d);//0.5
var e = 3;
var f = 'aa';
console.log(e / f); //返回NaN 告知程序员数据运算类型不统一
console.log(typeof(e / f)); //返回 number 类型
4、String类型
定义的
使用单引号和双引号引起来的 都是字符串
字符串是可以拼接的
键盘输入的
键盘输入的一定是字符串
长度
字符串是有长度的 并且是有下标的
长度就是字符串的字母个数,所有的下标都是从`0`开始 最后一个下标值是 长度length - 1;
字符串.length(长度)
读写
字符串只能读 不能写 而且必须通过下标
下标
下标从0开始
charAt 字符串的一个方法 可以获取到字符串中指定下标的字符
语法:字符串.charAt(指定的下标); 获取到字符串中指定下标的字符
var str1 = 'abc'; console.log(str1.charAt(0)); //a
substring() 方法用于提取字符串中介于两个指定下标之间的字符
语法:字符串.substring(start,stop);
var str="Hello world!"; str.substring(3,7);//lo w
4-案例
var str = 'dyh';
var str1 = 'hnnu';
var nu = 10;
console.log(typeof str,typeof str1,typeof nu); //返回 string string number
console.log(str + str1); //字符串拼接 dyhhnnu
console.log(10 + str); //隐式转化 10dyh
console.log(str[0]); //d 这种方式是从数组演变过了的
console.log(str.charAt(0)); //字符串使用这种方式取
console.log(str.length); //返回 3
5、Boolean类型
当true和 false参与运算的时候,会根据隐式转换的原则 true 变为 1 false变为 0
true 1 真
false 0 假
console.log(true + false); //返回 1
6、null与undefined
var a = null;
null 空值 是一个空对象,是为了将来存储一个对象,提前在内存分配一块空间,是为对象进入准备的
var b;
undefined 未定义 没有值 定义的变量没有赋值 结果就是undefined
----------------------------------------------------------------------
Undefined和null的区别
基本类型数据存储在栈区 栈区的特点就是有顺序,因此可以查找里面的数据
复杂类型数据存储在堆区 堆区的特点就是没顺序,因此就不能查找里面的数据
Undefined是变量声明未赋值
Null是空指针,就是null是一个指针,但是使用这个指针查找堆区,并没有任何数据能够对应
7、复杂数据类型
7.1、Object对象
关键字创建
使用关键字 new new 的作用 实列化(声明创建一个对象)一个对象
内置函数:js定义好的函数 可以直接拿过来用的 就是内置函数
var person1 = new Object(); //内置函数
person1.name = '小宝贝';
console.log(person1.name);
console.log(person1['name']);
表达式创建
1、 var obj = {}
2、 var pt = new Object();
var person = {
name:'小花',
age:18,
height:'300kg',
}
console.log(person.name);
console.log(person['name']);
对象:万物皆对象 对象包含 属性和方法 是以键值对形似存在 有键名和键值
对象:一个名词
属性:形容词
方法:动词
----------------------------------
一个人:对象
属性: 外貌 身高 胖瘦
方法:跑步 走路 跳 踢 吃饭 看书
表达式定义一个对象 键值对 有键名和键值
var person = {
name:'小花',
age:18,
height:'300kg',
}
// console.log(person.name);
console.log(person['name']);
使用关键字 new new 的作用 就是实列化一个对象
内置函数:js定义好的函数 可以直接拿过来用的 就是内置函数
var person1 = new Object(); //内置函数
person1.name = '宝贝';
console.log(person1.name);
console.log(person1['name']);
7.2、function函数
关键字创建
function 函数名(参数){功能性的代码块}
调用
函数名();
表达式创建
var 变量名 = function(参数){功能性的代码块}
调用
变量名();
特点:
不调用不执行
函数是有参数的
返回值的
函数名不能重复
======================函数的使用范围=======================
封装:声明一个函数,去实现某种功能 制作工具
作为事件处理函数 : 元素.事件 = function(){ 事件触发的时候执行的代码 }
对象中的方法 :obj = { 'eat':function(){} }
代码复用 使用工具
======================函数中的参数=========================
函数分为两类
不需要参数的
需要参数的
函数的参数分两类
形式参数(形参)
在函数声明的小括号中写入的参数就是形参
形参命名遵循变量命名规则
函数中写入形参相当于在函数中声明变量
实际参数(实参)
在函数调用的小括号中写入的参数就是实参
实参可以是任意类型的数据
函数中写入实参相当于给形参声明的变量赋值
形参和实参的个数可以是任意多个,如果是多个参数的情况,就按照顺序依次将实参赋值给每一个形参
形参和实参的关系
形参个数多于实参:
如果形参个数多于实参,就会按照顺序依次将实参赋值给形参,多余的形参值为undefined
形参个数少于实参
如果形参个数少于实参,也会按顺序依次将实参赋值给形参,多余的实参就舍弃不要了
arguments
arguments是函数的实参集合,这个实参集合是一个伪数组,当前函数中传入的所有实参,都是这个伪数组中的数组项
一般用在形参个数不确定的时候
## 使用关键字的方式声明函数,在调用的时候 可以在函数体的上面调用,也可以在函数体的下面调用,但是表达式声明的函数,只能在函数体的下面调用
num(1);//可以调用
function num(a){
console.log(a);
}
num(2);//也可以调用
//nux(); //无法调用
var nux = function(){
console.log('222');
}
nux();//可以正常调用
//自定义构造函数
function nuw(){
console.log('自定义构造函数');
}
var per = new nuw(); //正常调用
7.2.1、实参集合arguments使用
//封装一个计算任意个数字和的函数 arguments 实参集合
var a = function(){
//在函数中直接使用arguments即可
console.log(arguments);
//计算所有数字的和 循环arguments 将所有数组项依次累加即可
var he = 0//用来记录累加的和
for(var i=0; i<arguments.length; i++){
he += arguments[i]//就是每一个实参
}
console.log(he);
}
a(1,2,3,4,5,6,7,8,'abc',9); //返回 36abc9
7.3、Array数组
关键字创建
var arr = new Array();
给数组添加内容 数组[下标] = 内容
特点:数组是有下标(从0开始)的 数组是有长度的 (length) arr.length
表达式创建
var arr = [];
var arr1 = [1,2,3,4,5,6,7,8,9];
console.log(arr1.length); // 9
console.log(arr1[5]);//6
var arr = [];
for(var i=1;i<10;i++){
arr.push(i); //向数值中赋值 优于下
//arr[i] += i;
}
document.write(arr.toString()); //将数组转化成字符输出
关键字
var arr = new Array();
var arr = [1,2,3,true,'1',function(){},object(),[]];
arr[0] = '1'; //赋值
arr[1] = '10';
arr[2] = '100';
arr[3] = '1000';
console.log(arr[3]);
console.log(arr.length); // 4
表达式
var arr1 = [1,2,3,4,5,6,7,8,9];
console.log(arr1.length); // 9
console.log(arr1[5]); //6
数据类型转换
20200318
1、内置函数
就是js已经定义好的 可以直接拿过来用
注:首字母大写
Number 数值
String 字符串
Boolean 布尔
Object 对象
Function 函数
Array 数组
Date 时间
Error 错误
RegExp 正则表达式
2、数据类型强制转换
2.1、其他类型转 Number 类型
把其他的类型转换为数值类型 语法: Number(转换的对象)
Number能转换boolean null
字符串能转换纯数字或者'',不能转换的结果 返回NaN
纯数字
console.log(Number('123')); // 123
字符串
数字字符串
console.log(Number('123')); // 123
英文字符串
console.log(Number('abc')); // NaN
空字符串
console.log(Number('')); // 0
NaN
console.log(Number(NaN)); // NaN
null
console.log(Number(null)); // 0
12px+2
console.log(Number(12px+2)); //NaN
2.2、parseInt 与 parseFloat
转换方式:如果数据转换为数字之后,不是正常数字,值也是NaN
parseInt 可以将其他类型数据转换为数字类型(数字类型的整型),能转化就转化 不能转化 则停止
第二个参数 parseInt(转化的对象,进制)
console.log(parseInt('12px'));//12
console.log(parseInt('px12'));//NaN 不转换
console.log(parseInt('12.5'));//12
console.log(parseInt('0x123',16));//291 转换成16进制
parseFloat 可以将其他类型数据转换为数字类型(数字类型的浮点型型)
console.log(parseFloat('px12'));//NaN 不转换
console.log(parseFloat('12px'));//12
console.log(parseFloat('12'));//12
console.log(parseFloat('12.50'));//12.5
2.3、isNaN
是不是 不是 数字 是用来判断是否是数字的 当是数字的数字的时候 返回false 不是数字的时候 返回 true
console.log(isNaN('12'));//false
console.log(isNaN('abc'));//true
3、其他类型转字符串
3.1、toString()
语法:转换的对象.toString();
注:不是万能的,undefined和null不能用
在时间Data()我们需要用到字符串格式的时间 ‘2020-3-17’;我们会使用toString()
转化来的字符串 是可以改变的 灵活性比较高的
var num = 10;
var sum = 'hello';
var aum = false;
var arr = [1,2,3];
console.log(num,num.toString());//10 "10"
console.log(sum,sum.toString());//hello hello
console.log(aum,aum.toString());//false "false"
console.log(arr,arr.toString());//Array(3) "1,2,3"
3.2、String()
语法:String(转换的对象)
注:万能的
强制转化
var num = 10;
var sum = 'hello';
var aum = false;
var arr = [1,2,3];
console.log(num,String(num));//10 "10"
console.log(sum,String(sum));//hello "hello"
console.log(aum,String(aum));//false "false"
console.log(arr,String(arr));//Array(3) "1,2,3"
4、其他类型转布尔值
4.1、Boolean
语法: Boolean(转化的对象)
程序世界的真假
假值: undefined null false 空字符串 NaN 0 除了这六个 其他都为真
console.log(Boolean(1));
console.log(Boolean(100));
console.log(Boolean('abc'));
console.log(Boolean('1000'));
console.log(Boolean([]));
console.log(Boolean({}));
//假
console.log(Boolean(0));
console.log(Boolean(false));
console.log(Boolean(undefined));
console.log(Boolean(null));
console.log(Boolean(''));
console.log(Boolean(NaN));
5、运算符
5.1、算数运算符
加(+)减(-)乘(*)除(/)取余(%)加加(++)减减(--)
加(+)
加法
连接符
取余(%)
取余数 两个数相除 一直到不能整除 余下的数值
加加(++)减减(--)
在自己本身增加 1 或者减 1
当 加加(++)减减(--)在变量名后面的时候,先参与运算,然后在自增或者自减
当 加加(++)减减(--)在变量名前面的时候,先自增或者自减,然后在参与运算
console.log(1+10); // 11
console.log('1' + 10); // 110
console.log(true + 1); // 2
console.log('1' + '2'); // 12
var a = 2;
var b = ++a; //a=a+1-->3-->b=3
console.log(a,b); // 3 3
5.2、赋值运算符
赋值(=)加等于(+=)减等于(-=)乘等于(*=)除等于(/=)等运算
加等于(+=)
var a+=1 等同于 a = a+1;
5.3、比较运算符
是否相等(==)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、不等于(!=)、绝对等于(===)、绝对不等于(!==)
等于(==) 只判断值是否相等 如果值相等 返回真(true)否则返回假(false)
不等于(!=)
全等于(===) 先取判断值是否相等 如果值相等 再去判断类型是否相等 只有值和类型都相等 才返回真(true)否则返回假(false)
不全等于(!==)
5.3、逻辑运算符
逻辑运算符是与 &&,或 ||, 非 !
与 &&
条件同时满足 才继续执行
或 ||
只要满足一个条件就能执行
非 !
取反
if(true && flase){ //flase
console.log(666);
}
if(true || flase){ //true
console.log(666);
}
if(!true){ //flase
console.log(666);
}
5.4、三目运算符
格式
条件?条件成立执行的代码 :条件不成立执行的代码
10 > 5 ? 大于返回真 : 不大于返回假;
6、数据类型的隐式转换
隐式转换:就是js给你自动转换的 不要使用任何方法
当使用字符串比较的时候,其实比较的是 第一位 并且根据的是ASCII表的 值进行比较
// +
console.log('10' + '100'); // 10100
console.log(10 + '100'); // 10100
console.log(100 + true);// 101
console.log(100 + false); // 100
console.log(100 + '10'); // 10010
console.log(100 + undefined); // NaN
console.log(100 + NaN); // NaN
console.log(100 + '');// 100
console.log(100 + 'a10'); // 100a10
console.log(100 + '10a');// 10010a
// -
console.log('10' - '100'); // -90
console.log(10 - '100'); // -90
console.log(100 - true);// 99
console.log(100 - false); // 100
console.log(100 - '10'); // 90
console.log(100 - undefined); // NaN
console.log(100 - NaN); // NaN
console.log(100 - '');// 100
console.log(100 - 'a10'); // NaN
console.log(100 - '10a');// NaN
if('2' > '101'){ // 2 > 101
console.log(666);
}
流程控制语句&判断循环语句
20200320
1、if语句
If(条件){条件成立时执行的代码}
If(条件){条件成立时执行的代码} else{条件不成立的代码}
If(条件){成立执行的代码} else if(条件){当if条件不成立而else if 条件成立时执行的代码}..... else{如果if和else if 条件都不成立的时候执行的代码}
1.1、分支语句 if
##if条件中 不能 交叉 以及 重叠
var num = prompt('请输入成绩');// 带有一个确定按钮和取消按钮的输入框 确定 是true 取消是false
if (num >= 90) {
alert('你是天才');
} else if (num >= 80 && num < 90) {
alert('你很优秀');
} else if (num >= 60 && num < 80) { // 65 70
if(num>60 && num <=65){
console.log(1);
}else if(num>65 && num <=70){
console.log(2);
}else{
console.log(3);
}
1.2、if 单分支语句
语法:if(条件){条件成立执行的语句}
如果条件不成立 则不执行
if(true){
console.log(' 我是条件成立执行的代码块');
}
if(a>0 || b>0){
console.log(' 我是条件成立执行的代码块');
}
1.3、if-else 双分支语句
语法:if(条件){条件成立执行的语句}else{条件不成立执行的语句}
if(false){
console.log(' 我是条件成立执行的代码块111');
}else{
console.log(' 我是条件成立执行的代码块2222');
}
1.4、if-else 多分支语句
语法:if(条件一){条件一成立执行多代码块}else if(条件二){条件二成立执行的代码块}else if(条件三){条件三成立执行的代码块}else if(){} ......
注:扩展性的代码
语法:if(条件一){条件一成立执行多代码块}else if(条件二){条件二成立执行的代码块}else if(条件三){条件三成立执行的代码块}else if(){} ...... else{上述条件都不成立执行的代码块}
注:一般性的代码
var num = prompt('请输入成绩');// 带有一个确定按钮和取消按钮的输入框 确定 是true 取消是false
if (num >= 90) {
alert('你是天才');
} else if (num >= 80 && num < 90) {
alert('你很优秀');
} else if (num >= 70 && num < 80) {
alert('你不错');
} else if (num <= 30) {
alert(' 你废了');
}else{ // 50
alert('我没在里面')
}
注意:最后加else 不方便以后扩展
1.5、if-else 嵌套
大条件下面 细分小条件
if(true){
if(true){
console.log(1);
}else{
console.log(2);
}
}else{
if(true){
console.log(1);
}else if(false){
console.log('不成立');
}
}
2、条件对比语句 switch
switch 会比if 单纯 if可以实现的 switch不一定可以实现 但是switch 能实现的 if一定可以实现
如果是牵扯到表达式以及复杂字符或者正则表达式的 都优先使用if
如果是简单的数字,以及运算符号 可以使用switch 也可以使用if
当条件结构清晰 是固定的数值或者字符串的时候 适合用switch 如果条件是某一个范围内的 适合用if
switch实际上是使用要匹配的值和每一个匹配项进行匹配
语法:
switch (要匹配的值) {
case 匹配项1:
条件一成立执行的代码块
break; // 跳出语句 防止穿透
case 匹配项2:
条件二成立执行的代码块
break;
case 匹配项3:
条件三成立执行的代码块
break;
case 匹配项4:
条件四成立执行的代码块
break;
default:
// 上述条件都不成立执行的代码块
break
}
//==================示例======1=============================
var score = 90;
//switch是进行匹配
switch(true){//要匹配的值score==90 匹配项case的值全是true 使用90 和 true进行匹配
case score>=90 : console.log('奖励电动超跑一辆'); break;
case score>=80 : console.log('奖励飞天小饼干一盒'); break;
case score>=70 : console.log('奖励五方桥鸡腿一个'); break;
case score>=60 : console.log('哪凉快哪待着'); break;
case score>=50 : console.log('奖励半死单人揍一顿'); break;
default : console.log('奖励升天双人揍一顿');//在switch的最后一个匹配项末尾可以不加break
}
//返回 奖励电动超跑一辆
//==================示例======2=============================
var a = prompt('输入数字'); //输入2
switch(Number(a)){ //键盘输入都是字符型,需转换数值型
case 1:
alert('11');
break;
case 2:
alert('22');
break;
default:
alert('都不匹配');
break;
}
//返回22
3、获取元素的方式
3.1、id方式获取
通过id获取到的元素,是一个
语法:document.getElementById('ID名');
<div id="box">id标签</div>
var box = document.getElementById('box');
3.2、标签名方式获取
通过标签获取的元素,是一个 类似数组(数组的特点,有长度和下标)的变量 获取到的是一堆
语法:document.getElementsByTagName('标签名');
<div id="box">通过标签</div>
var aDiv = document.getElementsByTagName('div');
aDiv[0] 表示第一个div
3.3、class类目方式获取
通过类名(class)获取的元素,是一个 类似数组(数组的特点,有长度和下标)的变量 获取到的是一堆
语法:document.getElementsByClassName('class类名');
<div class="div">类名</div>
var div = document.getElementsByClassName('div');
div[0] 表示 第一个
3.4、css选择器
语法:父级.querySelector(css选择器); 获取一个
document.querySelector('css选择器' );
语法:父级.querySelectorAll(css选择器); 获取一堆
document.querySelectorAll('css选择器');
选择器就是样式里面的选择器,可以按照样式写法,继承获取. 如:'#box p'
用标签的方式获取 获取的是页面的第一个标签 但是获取的是一个
但但是 他可以继承获取
var p = document.querySelector('.box button p');
获取的是一堆 也可以使用继承的方式获取
var p = document.querySelectorAll('.box button p');
4、循环结构
4.1、for 循环
满足条件的情况下 反复执行
语法:for(var 表达式一;表达式二;表达式三){ 满足条件执行的代码块 }
表达式一;是一个初始值
表达式二;结束值
表达式三;变化值
for循环过程
i = 1 满足条件 i<=10; 执行 console.log(i)
i ++ i = 2;
i = 2 满足条件 i<=10; 执行 console.log(i) ; i = 2
............
当 i = 10; 满足条件 i<=10; 执行 console.log(i) ; i = 10
当 i = 11;不满足条件 i<=10; 结束执行 跳出整个循环
//--------------------------
for(var i = 1; i<10;){
console.log(i);
}
注:防止出现死循环
//--------------------------
//正常写法
var arr = [1,2]; // 数组取元素 必须通过下标 0 - 8
for(var i = 0; i<arr.length; i++){
console.log(arr[i]);
}
//for循环的变异写法
var arr = [1,2,3,4,5];
for(var i=0; len = arr.length,i<len;i++){
console.log(arr[i]);
}
4.2、嵌套for循环
for(;;){
for(;;){}
}
外面的走一次 里面的走多次
4.3、for-in循环
对象没有长度和下标 数组有长度和下标
专业用来循环对象的
语法:for(var 键值 in 要循环的对象名){操作对象的方法}
注:可以循环数组 但是不建议使用 循环数组最好的方式 是 for
var obj = { //对象
name:'dyh',
age:22,
sex:'男'
}
var arr = [1,2,3]; //数组
for(var key in obj){
console.log(key); //获取到 name,age,sex 属性名
console。log(obj.name); //dyh
console。log(obj['name']); //dyh 一样的
console.log(obj[key]); //中括号可以解析变量
// 输出:dyh
// 22
// 男
}
for(var key in arr){
console.log(arr[key]);
// 输出:1
// 2
// 3
}
4.4、while循环
语法:while(条件){条件成立执行的代码块 值变化}
条件满足就执行,不满足一次也不执行
var i = 1,num = 0;
while(i<=10 ){
num+=i;
i++;
console.log(num);
}
4.5、do-while循环
语法:do{条件成立执行的代码块 值变化}while(条件)
在do后面的大括号里面,是不管条件成不成立,先执行一次,然后再去判断条件是否成立,如果成立则继续执行 否则就退出循环
和for比较,while和do{}while,循环的体量并不是很小,实现效果或者执行的时候,偏向于小方向
var a = 5;
do{
a--; //最少执行一次
console.log(a);
}while(a>10)
跳转语句&this&自定义属性
20200321
1、跳转语句
1.1、break
break防止穿透 是直接跳出整个循环 后面的条件即使满足 也不会执行
Break写在哪一个循环中,就会打断哪一个循环,跟其他循环没有关系
for(var i=0;i<10;i++){
if( i === 6){
break; //等于6 结束整个循环
}
console.log(i);
}
1.2、continue
continue是结束当前循环,如果后面的条件满足,会继续执行
for(var i=0;i<10;i++){
if( i === 6){
continue;
}
console.log(i);
}
2、this知识点
函数的this指向看调用不看声明
不同的函数调用所对应的this指向
普通函数调用
函数名() this--->window
事件处理函数调用 (事件处理函数是由浏览器在事件触发的时候自动调用的)
oDiv.onclick = function(){} this--->添加事件的元素
全局中this值为window
对象的方法函数
Var obj = {fn:function(){}} obj.fn()
当对象中某一属性的值是函数的时候,我们就说这个属性是对象的一个方法
对象.方法名() this--->调用方法的对象
总结
方法函数:对象.方法() this--->调用方法的对象
普通函数:window.函数名() this--->window
事件处理函数: oDiv.onclick = function(){} oDiv.onclick() this--->添加事件的元素
全局中的this就是window
2.1、this用法
js中的最高:window -- document
this指本元素,其实就是触发事件的元素(对象)以及函数
当你使用了this 的时候,不管你的this在哪,只要不触发调用this的对象或者事件,你永远都不知道this到底指向的是谁
因为在事件中,我们是可以通过方法改变this的指向的
指向:
window:当在页面中直接使用console.log(this),this指向的是window
在事件里面,当触发事件时,this指向的是事件那个 `.`前面的元素
函数里面this指向的也是window
====================================
var f = function () {
console.log(this.x);
}
var x = 1;
var obj = {
f: f,
x: 2,
};
// 单独执行
f() // 1 普通函数调用 this--> window
// obj 环境执行
obj.f() // 2 this--> 事件(obj)
3、自定义属性-下标
设置自定义属性:元素.自定义属性名 = 自定义属性值
获取自定义属性:元素.自定义属性名
属性:是标签自带的属性 是原有属性 我们自己起名字定义的 是非原有属性
ID class value title 原有属性 abc = 'abc',非原有属性
//=============自定义属性===================
var box = document.getElementsByTagName('div');
for (var i = 0; i < box.length; i++) {
box[i].tag = true; //
box[i].onclick = function () {
if (this.tag) {
this.style.backgroundColor = 'blue';
this.tag = false;
// console.log(this);
} else {
this.style.backgroundColor = 'red';
this.tag = true;
}
}
}
//==============自定义下标==================
//长度和下标 把下标取出来,然后当做识别标签的索引
var div = document.getElementsByTagName('div');
for (var i = 0; i < div.length; i++) {
div[i].index = i; // 自定义索引 就是把下标拿出来 给相对应的标签做一个标记
div[i].onclick = function () {
if (this.tag) {
this.style.backgroundColor = 'blue';
tag = false;
} else {
this.style.backgroundColor = 'red';
tag = true;
}
}
}
//================================
1、开关
- var tag = true
2、自定义属性
- ali[i].tag = true;
3、自定义下标
- ali[i].index = i;
作用域&预解析&返回值
20200325
1、作用域
Js作用域分两类
全局作用域:script标签包裹的内容的区域就是全局作用域,就是全局变量能起作用的范围
var a = 10;//a变量就声明在了全局作用域,就是一个全局变量
局部作用域:函数大括号内部的区域就是局部作用域,就是局部变量起作用的范围
var fn = function(){
var b = 20//变量b声明在局部作用域中,就是一个局部变量
}
定义:它是指对某一变量和函数具有访问权限的代码空间;
在js中只有函数可以划分作用域,因此每一个函数的大括号内部都是一个局部作用域
因此我们也称局部作用域为函数作用域
不同作用域中变量和函数的访问权限
局部作用域中声明的变量和函数只能在局部作用域中访问
大伯和父亲及大姑各自家庭中的私有物品只能在自家使用
全局作用域中声明的变量和函数可以在全局中的任意位置访问
爷爷奶奶家的东西由于是大家庭的财产,所以大家都可以支配
两个同级的局部作用域之间不能互相访问对方内部的变量
父亲,大伯和大姑之间不能互相用对方的财产
全局作用域不能访问局部作用域的变量
爷爷奶奶家不能使用大伯,大姑和父亲小家庭的财产
由以上几条我们推理出了一个概念
子级作用域可以访问父级作用域的变量和函数
父级作用域不能访问子级作用域的变量和函数
同级作用域之间不能互相访问变量和函数
//==================示例==1============================
function fn(){ //fn函数声明在全局作用域中,可以在全局中的任意位置被访问到
var a = 10;//不同作用域中可以声明同名变量,因为互相之间不影响
//a变量是fn函数的作用域中声明的函数,可以在整个fn函数内部被访问到
function fun(){
var c = 20; //c是fun函数中声明的变量,可以在整个fun函数中被访问到
console.log(a);//fun函数在fn函数内部,因此可以访问到a变量 10
console.log(c);//20 可以访问
console.log(fn);//fun函数处于全局作用域内部,因此可以访问到全局函数fn
}
fun()
}
fn()
//==================示例==2============================
function a(){
var c = 20;
console.log(d);
}
function b(){
var d = 30;
a();
console.log(c);
}
console.log(d);//报错
//局部作用域中声明的变量互相之间不能访问 因此上面两个函数中打印对方的变量都会失败
//b函数中调用a函数是可行的
//因为a函数声明在全局作用域中,b函数也处于全局作用域中,因此可以访问全局作用域中的变量
2、作用域链
定义:作用域链是JavaScript内部中一种变量、函数查找机制,它决定了变量和函数的作用范围,向上查找的方式。
在一个作用域中访问函数或变量的时候,
会先在当前作用域查找这个变量或函数,如果找到,就直接使用
如果没找到,就想上一级作用域查找,如果有,就直接使用
如果还没有,就继续向上查找,一直找到全局作用域,如果有,就使用,如果没有,就报错
//==================示例==1============================
var fun = function(){
function a (){
var a = 10;
console.log(a);//在a函数中访问a变量 10
}
a();//调用函数 函数名()
console.log(a);//在fun函数中访问a变量 fun中的 a函数
//如果只写函数名 表示整个函数数据
}
fun();//---->结果是什么
3、函数和变量声明的预解析
在js代码开始解析执行之前,浏览器会先对js代码进行一次预解析
预解析的作用:
将所有变量和函数的声明提升到当前作用域的最顶端,之后再开始按顺序执行代码
变量声明:var 变量名
函数声明: function 函数名(){}
//===============示例===1=================================
function fn(a) {
var s = a;
s.name = '优就业';
s.age = 12;
};
var json = {
name: '小u'
};
fn(json);
console.log(json);
/*预解析
function fn(a) {
var s;
var a; //a = json对象 函数参数传入
s = a; //s = json对象
s.name = '豪豪豪'; //全局的json变量 和局部的a形参 及 局部的s变量 拥有的值都是json对象的指针,因此三个变量操作的都是同一个对象
s.age = 12;
};
var json = {
name: '小豪'
};
fn(json); //豪豪豪
console.log(json); //豪豪豪
*/
//===============示例===2=================================
var a = 4;
function fn(a) {
console.log(a);
a = 5;
};
fn(a);
console.log(a);
/*预解析
var a; //变量声明 undefined
function fn(a) { //声明函数
var a; //形参相当于声明了一个变量,实参赋值为,a = 4
console.log(a); //4
a = 5; /使用的变量a是函数fn作用域中的a变量, 这句代码是将fn函数中的a变量赋值为5 全局的a变量没有变化,还是4
};
a = 4; //全局变量赋值
fn(a); //将全局变量4 传入函数fn()
console.log(a); //4 打印全局变量
*/
//===============示例===3=================================
fn();
var a = 4;
function fn(b) {
console.log(a);
a = 3;
console.log(a);
};
console.log(a);
/*预解析
var a; //声明 undefined
function fn(b) {
var b; //undefined
//如果当前作用域声明了一个变量,我们就说当前作用域有这个变量
console.log(a); //undefined
a = 3; //要设置a变量的值,就要在当前作用域先查找,发现没有a变量,就要像父级作用域查找,全局作用域中有a变量,就可以拿来使用,这里将全局a赋值为3
console.log(a); //3
};
fn();
a = 4; //赋值
console.log(a); //4
*/
//===============示例===4=================================
function fn
本文来自博客园,作者:JackieDYH,转载请注明原文链接:https://www.cnblogs.com/JackieDYH/p/17633998.html