1.Javascript的引入方式
- 内部脚本:将 JS代码定义在HTML页面中
<script>
alert("hello js1");
</script>
- 外部脚本:将 JS代码定义在外部 JS文件中,然后引入到 HTML页面中
<script src="../js/demo.js"></script>
1.在 HTML 中,JavaScript 代码必须位于
<script>
与</script>
标签之间
2.一般把脚本置于 body 元素的底部,可改善显示速度
3.因为浏览器在加载页面的时候会从上往下进行加载并解析。 我们应该让用户看到页面内容,然后再展示动态的效果。
函数预解析—变量提升和函数提升
// 相当于顺序执行了以下操作----------------------------
// 变量提升
var num;
// 函数提升 , 但不会调用 ,不调用不执行
function demo() {
// 当前作用域(即函数demo()里面) 变量提升
var num; 执行3. 当前作用域内定义一个num
// 当前作用域(即函数demo()里面)函数提升 不调用不执行
function demoSon() {
// 未定义直接赋值,此时作用域链指向demo()中的num
num = 3;
}
console.log(num); 执行4、打印num 作用域链指向执行3的num(当前作用域函数demo内)
定义未赋值 所以结果为underfined
num = 2 执行5. 给函数demo里面的num赋值 打印在前,赋值在后
demoSon(); 执行6. 调用demoSon()后demo中的num 值变为3; 全局变量num不做更改
}
//提升变量但是变量赋值不会提升
num = 1; 执行1. 给num 赋值为1
demo(); 执行2. 调用demo(
2.简单类型与复杂类型
- 简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型
值类型:简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型
string ,number,boolean,undefined,null
引用类型:复杂数据类型,在存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型
通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date等
课件 后续补…
2.Javascript的基础语法
0.书写语法
-
区分大小写:与 Java 一样,变量名、函数名以及其他一切东西都是区分大小写的
-
每行结尾的分号可有可无
如果一行上写多个语句时,必须加分号用来区分多个语句。
-
注释
- 单行注释:// 注释内容
- 多行注释:/* 注释内容 */
注意:JavaScript 没有文档注释
-
大括号表示代码块
1.输出语句
- 使用 window.alert() 写入警告框 ----------------------window可以省略
- 使用 document.write() 写入 HTML 输出
- 使用 console.log() 写入浏览器控制台
2.变量
var
JavaScript 中用 var 关键字(variable 的缩写)来声明变量。格式 var 变量名 = 数据值;
。而在JavaScript 是一门弱类型语言,变量可以存放不同类型的值;如下在定义变量时赋值为数字数据,还可以将变量的值改为字符串类型的数
var test = 20;
test = "张三";
JavaScript 中 var
关键字有点特殊,有以下地方和其他语言不一样
- 作用域:全局变量
{
var age = 20;
}
alert(age); // 在代码块中定义的age 变量,在代码块外边还可以使用
- 变量可以重复定义
{
var age = 20;
var age = 30;//JavaScript 会用 30 将之前 age 变量的 20 替换掉
}
alert(age); //打印的结果是 30
let
只在 let
关键字所在的代码块内有效,且不允许重复声明
3.数据类型
JavaScript 中提供了两类数据类型:原始类型 和 引用类型。
1.使用 typeof 运算符可以获取数据类型
2.alert(typeof age);
以弹框的形式将 age 变量的数据类型输出
3.原始数据类型:
- 1.number:数字(整数、小数、NaN(Not a Number))
注意: NaN是一个特殊的number类型的值
- 2.string:字符、字符串,单双引皆可
js 中 双引号和单引号都表示字符串类型的数据
- 3.boolean:布尔。true,false
- 4.null:对象为空 ----object
- 5.undefined:当声明的变量未初始化时,该变量的默认值是 undefined
4.运算符
1. = =和===区别
==:
- 判断类型是否一样,如果不一样,则进行类型转换
- 再去比较其值
===:js 中的全等于
- 判断类型是否一样,如果不一样,直接返回false
- 再去比较其值
2.类型转换
- 其他类型转为number
- string 转换为 number 类型:按照字符串的字面值,转为数字。如果字面值不是数字,则转为NaN
将 string 转换为 number 有两种方式
var str = "20";
alert(parseInt(str) + 1);
2.其他类型转为boolean
- number 类型转换为 boolean 类型:0和NaN转为false,其他的数字转为true
- string 类型转换为 boolean 类型:空字符串转为false,其他的字符串转为true
- null类型转换为 boolean 类型是 false
- undefined 转换为 boolean 类型是 false
5.流程控制语句
6.函数
1.声明函数 和 调用函数
2.函数调用需要加()
3.函数不会自己执行 ,需要调用才会执行。
1.定义格式
- 方式1
function 函数名(参数1,参数2…){
要执行的代码
} - 方式2
var 函数名 = function (参数列表){
要执行的代码
}
形式参数不需要类型。因为JavaScript是弱类型语言
2.函数参数
3.函数返回值
- 在使用 return 语句时,函数会停止执行,并返回指定的值
- 如果函数没有 return ,返回的值是 undefined
- return 只能返回一个值。如果用逗号隔开多个值,以最后一个为准。
4.break ,continue ,return的区别
- break :结束当前的循环体(如 for、while)
- continue :跳出本次循环,继续执行下次循环(如 for、while)
- return :不仅可以退出循环,还能够返回 return 语句中的值,同时还可以结束当前的函数体内的代码
5.arguments的使用
当我们不确定有多少个参数传递的时候,可以用 arguments 来获取。在 JavaScript 中,arguments 实际上它是当前函数的一个内置对象。所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有实参。
arguments
展示形式是一个伪数组,因此可以进行遍历。伪数组具有以下特点:
- 具有 length 属性
- 按索引方式储存数据
- 不具有数组的 push , pop 等方法
function maxValue(){
var max=arguments[0];
for (let i = 0; i < arguments.length; i++) {
if(max<arguments[i]){
max = arguments[i];
}
}
return max;
}
var max1 = maxValue(5,2,99,101,67,77);
alert(max1);
6.函数的两种声明方式
- 自定义函数方式(命名函数)
// 声明定义方式
function fn() {...}
// 调用
fn();
- 因为有名字,所以也被称为命名函数
- 调用函数的代码既可以放到声明函数的前面,也可以放在声明函数的后面
- 函数表达式方式(匿名函数)
// 这是函数表达式写法,匿名函数后面跟分号结束
var fn = function(){...};
// 调用的方式,函数调用必须写到函数体下面
fn();
- 因为函数没有名字,所以也被称为匿名函数
- 这个fn 里面存储的是一个函数
- 函数表达式方式原理跟声明变量方式是一致的
函数调用的代码必须写到函数体后面
3.Javascript常用对象
1.Array对象
JavaScript Array对象用于定义数组
- 方式一
var 变量名 = new Array(元素列表); - 方式二
var 变量名 = [元素列表];
特点:
JavaScript 中的数组相当于 Java 中集合。数组的长度是可以变化的,而 JavaScript 是弱类型,所以可以存储任意的类型的数据。
// 变长
var arr3 = [1,2,3];
arr3[10] = 10;
alert(arr3[10]); // 10
alert(arr3[9]); //undefined
又给索引是 10 的位置添加了数据 10,那么
索引3
到索引9
位置的元素是什么呢?在 JavaScript 中没有赋值的话,默认就是undefined
。
属性
方法
- 检测是否为数组
instanceof 运算符,可以判断一个对象是否属于某种类型
Array.isArray()用于判断一个对象是否为数组,isArray() 是 HTML5 中提供的方法
var arr = [1, 23];
var obj = {};
console.log(arr instanceof Array); // true
console.log(obj instanceof Array); // false
console.log(Array.isArray(arr)); // true
console.log(Array.isArray(obj)); // false
- 添加删除数组元素的方法
- 数组排序
var arr=[1,2,3,54,765];
arr.sort(function (a, b){
return b-a; //b-a降序
// a-b升序
})
-
数组排序
-
数组转换为字符串
2.String对象
1.创建方式
- 方式1:
var 变量名 = new String(s); - 方式2:
var str = ‘andy’;
2.属性
3.方法
String对象还有一个函数 trim()
,该方法在文档中没有体现,但是所有的浏览器都支持;它是用来去掉字符串两端的空格
- 基本包装类型:按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但上面代码却可以执行,这是因为 js 会把基本数据类型包装为复杂数据类型,其执行过程如下 :
// 1. 生成临时变量,把简单类型包装为复杂数据类型
var temp = new String('andy');
// 2. 赋值给我们声明的字符变量
str = temp;
// 3. 销毁临时变量
temp = null;
字符串的不可变
,指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间`
for (var i = 0; i < 100000; i++) {
str += i;
}
console.log(str); // 这个结果需要花费大量时间来显示,因为需要不断的开辟新的空间
-
根据字符返回位置:字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串。
-
根据位置返回字符(重点)
-
字符串操作方法(重点)
-
replace()方法
replace(被替换的字符串, 要替换为的字符串);
- split()方法
var str = 'a,b,c,d';
console.log(str.split(',')); // 返回的是一个数组 [a, b, c, d]
- toUpperCase() //转换大写 -------toLowerCase() //转换小写
3.Math对象
Math.PI // 圆周率
Math.floor() // 向下取整
Math.ceil() // 向上取整
Math.round() // 四舍五入版 就近取整 注意 -3.5 结果是 -3
Math.abs() // 绝对值
Math.max()/Math.min() // 求最大和最小值
注意:上面的方法必须带括号
- random()方法
random() 方法可以随机返回一个小数,其取值范围是 [0,1),左闭右开 0 <= x < 1
4.Date对象
var now = new Date();
console.log(now);
如果Date()不写参数,就返回当前时间
如果Date()里面写参数,就返回括号里面输入的时间
如果括号里面有时间,就返回参数里面的时间。例如日期格式字符串为‘2019-5-1’,可以写成new Date('2019-5-1') 或 者 new Date('2019/5/1')
-
日期格式化:
-
获取日期的总的毫秒形式
var date=new Date();
date.valueOf();
date.getTime()
3.自定义对象
var 对象名称 = {
属性名称1:属性值1,
属性名称2:属性值2,
...,
函数名称:function (形参列表){},
...
};
1. 利用字面量创建对象
{ } 里面采取键值对的形式表示
- 键:相当于属性名
- 值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等)
var star = {
name : 'pink',
age : 18,
sex : '男',
sayHi : function(){
alert('大家好啊~');
}
};
调用方式 :
1. star.name 调用属性
2. star['name'] 调用属性 第二种方式
3. star.sayHi(); // 调用 sayHi 方法,注意,一定不要忘记带后面的括号 -调用方法
2. 利用 new Object 创建对象
- Object() :第一个字母大写
- new Object() :需要 new 关键字
- 使用的格式:对象.属性 = 值;
var Mr=new Object();
Mr.name='鸣人';
Mr.sex='男';
Mr.age=19;
Mr.Skill=function (){
alert('影分身术');
}
alert(Mr.name);
alert(Mr.Skill());
3. 利用构造函数创建对象
- 构造函数 :是一种特殊的函数,
主要用来初始化对象,即为对象成员变量赋初始值
,它总与 new 运算符一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。 - 在 js 中,使用构造函数要时要注意以下两点:
1.构造函数用于创建某一类对象,其首字母要大写
2.构造函数要和 new 一起使用才有意义
创建
function Person (name , age, value){
this.name=name,
this.age=age,
this.sex=value,
this.sayHi=function (){
alert('我的名字叫:' + this.name + ',年龄:' + this.age + ',性别:' + sex);
}
}
使用
var big=new Person('小明',12,'男');
big.sayHi();
alert(big.name);
使用注意事项:
- 构造函数约定首字母大写。
- 函数内的属性和方法前面需要添加 this ,表示当前对象的属性和方法。
- 构造函数中不需要 return 返回结果。
- 当我们创建对象的时候,必须用 new 来调用构造函数。
new 在执行时会做四件事情:
- 在内存中创建一个新的空对象。
- 让 this 指向这个新的对象。
- 执行构造函数里面的代码,给这个新对象添加属性和方法。
- 返回这个新对象(所以构造函数里面不需要return)。\
4.遍历对象属性
for…in 语句用于对数组
或者对象
的属性进行循环操作。
for (变量 in 对象名字) {
// 在此执行代码
}
for (var k in obj) {
console.log(k); // 这里的 k 是属性名
console.log(obj[k]); // 这里的 obj[k] 是属性值 这里不能用.的形式 只能用[]
}
4.BOM
BOM
:Browser Object Model 浏览器对象模型。也就是 JavaScript 将浏览器的各个组成部分封装为对象。
BOM
中包含了如下对象:
- Window:浏览器窗口对象
- Navigator:浏览器对象
- Screen:屏幕对象
- History:历史记录对象
- Location:地址栏对象
BOM 中的Navigator
对象和Screen
对象基本不会使用,所以我们的课堂只对Window
、History
、Location
对象进行讲解。
1.Window对象
该对象不需要创建直接使用 window
,其中 window.
可以省略。比如我们之前使用的 alert()
函数,其实就是 window
对象的函数,在调用是可以写成如下两种。
1.属性
window
对象提供了用于获取其他 BOM 组成对象的属性
2.函数
setTimeout(function,毫秒值)` : 在一定的时间间隔后执行一个function,只执行一次
setInterval(function,毫秒值)
:在一定的时间间隔后执行一个function,循环执行
setTimeout(function (){
alert("hehe");
},3000);
setInterval(function (){
alert("hehe");
},2000);
2.History对象
History 对象是 JavaScript 对历史记录进行封装的对象。
-
History 对象的获取
使用 window.history获取,其中window. 可以省略
-
History 对象的函数
3.获取Location对象
Location对象提供了很对属性。以后常用的只有一个属性 href
alert("要跳转了");
location.href = "https://www.baidu.com";
5.DOM
DOM:Document Object Model 文档对象模型。也就是 JavaScript 将 HTML 文档的各个组成部分封装为对象。
DOM 其实我们并不陌生,之前在学习 XML 就接触过,只不过 XML 文档中的标签需要我们写代码解析,而 HTML 文档是浏览器解析。封装的对象分为
- Document:整个文档对象
- Element:元素对象
- Attribute:属性对象
- Text:文本对象
- Comment:注释对象
如下图,左边是 HTML 文档内容,右边是 DOM 树
作用:
JavaScript 通过 DOM, 就能够对 HTML进行操作了
- 改变 HTML 元素的内容
- 改变 HTML 元素的样式(CSS)
- 对 HTML DOM 事件作出反应
- 添加和删除 HTML 元素
1.获取Element对象
HTML 中的 Element 对象可以通过 Document
对象获取,而 Document
对象是通过 window
对象获取。
Document
对象中提供了以下获取 Element
元素对象的函数
getElementById()
:根据id属性值获取,返回单个Element对象getElementsByTagName()
:根据标签名称获取,返回Element对象数组getElementsByName()
:根据name属性值获取,返回Element对象数组getElementsByClassName()
:根据class属性值获取,返回Element对象数组querySelector
:返回指定选择器中的第一个元素
可以使用 . ,# , 标签名 (H5)querySelectorAll
返回指定选择器中的所有元素 。 如上 (H5)
var divs = document.getElementsByTagName("div");// 返回一个数组,数组中存储的是 div 元素对象
// alert(divs.length); //输出 数组的长度
//遍历数组
for (let i = 0; i < divs.length; i++) {
alert(divs[i]);
}
divs.onClick=function(){
}
其中可以获得body元素和Html元素
document.documentElement
document.body
2.HTML Element对象使用
查阅文档使用
6.DOM各个标签的学习
1.innerText 和 innerHTML的区别
- innerText 不识别html标签 非标准 去除空格和换行 ----只会获得里面的内容。
- innerHTML 识别html标签
W3C标准
保留空格和换行的 ------会获得包含Html的标签。
这两个属性是可读写的 可以获取元素里面的内容
innerText 和 innerHTML的区别
// 1. innerText 不识别html标签 非标准 去除空格和换行
var div = document.querySelector('div');
// div.innerText = '<strong>今天是:</strong> 2019';
// 2. innerHTML 识别html标签 W3C标准 保留空格和换行的
div.innerHTML = '<strong>今天是:</strong> 2019';
// 这两个属性是可读写的 可以获取元素里面的内容
var p = document.querySelector('p');
console.log(p.innerText);
console.log(p.innerHTML);
2.修改表单属性
- 需要使用value属性 不能使用innerHtml
- disable
修改input的值
var butt=document.querySelector('button');
butt.value=‘123456’
6.事件监听
- 方式一:通过 HTML标签中的事件属性进行绑定
<input type=“button” οnclick='on()’>
function on(){
alert(“我被点了”);
}
- 方式二:通过 DOM 元素属性绑定
<input type=“button” id=xxx’>
document.getElementById(“btn”).onclick = function (){
alert(“我被点了”);
}
7.正则表达式
正则对象有两种创建方式:
- 直接量方式:注意不要加引号
var reg = /正则表达式/;
- 创建 RegExp 对象
var reg = new RegExp(“正则表达式”);
函数
test(str)
:判断指定字符串是否符合规则,返回 true或 false
正则表达式是和语言无关的。很多语言都支持正则表达式,Java语言也支持,只不过正则表达式在不同的语言中的使用方式不同,js 中需要使用正则对象来使用正则表达式。
1.正则表达式常用的规则如下:
- ^:表示开始
- $:表示结束
- [ ]:代表某个范围内的单个字符,比如: [0-9] 单个数字字符
- .:代表任意单个字符,除了换行和行结束符
- \w:代表单词字符:字母、数字、下划线(),相当于 [A-Za-z0-9]
- \d:代表数字字符: 相当于 [0-9]
2.量词:
- +:至少一个
- *:零个或多个
- ?:零个或一个
- {x}:x个
- {m,}:至少m个
- {m,n}:至少m个,最多n个
// 规则:单词字符,6~12
//1,创建正则对象,对正则表达式进行封装
var reg = /^\w{6,12}$/;
var str = "abcccc";
//2,判断 str 字符串是否符合 reg 封装的正则表达式的规则
var flag = reg.test(str);
alert(flag);