JavaScript

没学明白呢QAQ

# 一、JavaScript介绍

JavaScript 编程语言 流程控制

Netscape在最初将其脚本语言命名为LiveScript,后来Netscape在与Sun合作之后将其改名为JavaScript。JavaScript最初受Java启发而开始设计的,目的之一就是“看上去像Java”,因此语法上有类似之处,一些名称和命名规范也借自Java。JavaScript与Java名称上的近似,是当时Netscape为了营销考虑与Sun微系统达成协议的结果。Java和JavaScript的关系就像张雨和张雨生的关系,只是名字很像。

​ Java 服务器端的编程语言

​ JavaScript 运行在客户端(浏览器)的编程语言

JavaScript是一种运行在客户端脚本语言
JavaScript的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。

1、JavaScript现在的意义(应用场景)

JavaScript 发展到现在几乎无所不能。

  1. 网页特效
  2. 服务端开发(Node.js)
  3. 命令行工具(Node.js)
  4. 桌面程序(Electron)
  5. App(Cordova)
  6. 控制硬件-物联网(Ruff)
  7. 游戏开发(cocos2d-js)

2、JavaScript和HTML、CSS的区别

  1. HTML:提供网页的结构,提供网页中的内容

  2. CSS: 用来美化网页

  3. JavaScript: 可以用来控制网页内容,给网页增加动态的效果,例如动态创建div,实现页面元素的隐藏。

3、JavaScript的组成

3.1、ECMAScript - JavaScript的核心

定义了JavaScript的语法规范

JavaScript的核心,描述了语言的基本语法和数据类型,ECMAScript是一套标准,定义了一种语言的标准与具体实现无关

3.2、BOM - 浏览器对象模型

一套操作浏览器功能的API

通过BOM可以操作浏览器窗口,比如:弹出框、控制浏览器跳转、获取分辨率等

3.3、DOM - 文档对象模型

一套操作页面元素的API

DOM可以把HTML看做是文档树,通过DOM提供的API可以对树上的节点进行操作

3.4、JavaScript的书写位置

  • 写在行内
1
<input type="button" value="按钮" onclick="alert('Hello World')" />
  • 写在script标签中
1
2
3
4
5
<head>
<script>
alert('Hello World!');
script>
head>
  • 写在外部js文件中,在页面引入
1
<script src="main.js">script>
  • 注意点

    引用外部js文件的script标签中不可以写JavaScript代码

二、变量

1、什么是变量

  • 什么是变量

    变量是计算机内存中存储数据的标识符,根据变量名称可以获取到内存中存储的数据

    变量用于描述计算机中的数据存储空间 。

    房屋是一个存储空间

    用来存放特定的东西

    内存,全称内存储器。用于存放计算机运行过程中的数据。

    计算机为了更好的存储数据,将内存分为不同的内存单元。

  • 为什么要使用变量

    从内存中取出一个存储单元,存储相应的数据。

    为了方便存储数据和取数据,需要明确存储单元识别的方式和使用的用途。

    识别的方式:起名字 age

    使用用途:存放什么内容 18

    使用变量可以方便的获取或者修改内存中的数据

2、如何使用变量

  • var声明变量
1
var age;
  • 变量的赋值
1
2
var age;
age = 18;
  • 同时声明多个变量
1
2
3
var age, name, sex;
age = 10;
name = 'zs';
  • 同时声明多个变量并赋值
1
var age = 10, name = 'zs';

3、变量在内存中的存储

4、变量的命名规则和规范

  • 规则 - 必须遵守的,不遵守会报错

    • 由字母、数字、下划线、$符号组成,不能以数字开头
    • 不能是关键字和保留字,例如:for、while。
    • 区分大小写
  • 规范 - 建议遵守的,不遵守不会报错

    • 变量名必须有意义
    • 遵守驼峰命名法。首字母小写,后面单词的首字母需要大写。例如:userName、userPassword

    下面哪些变量名不合法

    a
    1
    age18
    18age
    name
    $name
    _sex
    &sex
    theworld theWorld

5、交换两个变量中的值(案例)

三、数据类型

数据类型分为,“简单数据类型”和“复杂数据类型”,现在我们先学习“简单的数据类型”

简单数据类型

Number、String、Boolean、Undefined、Null

1、Number类型

  • 数值字面量:数值的固定值的表示法

    110 1024 60.5

    浮点数

    浮点数精度的问题。

浮点数
    var n = 5e-324;   // 科学计数法  5乘以10的-324次方
浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数
   var result = 0.1 + 0.2;    // 结果不是 0.3,而是:0.30000000000000004
   console.log(0.07 * 100);
   不要判断两个浮点数是否相等

数值判断

  • NaN:not a number

    • NaN 与任何值都不相等,包括他本身

      在控制台中使用 6*‘abc’ 可以输出NaN

  • isNaN: is not a number

    是数字返回为false.

    不是数字返回true.

2、String类型

字符串

​ ‘abc’ “abc”

‘程序猿’,’程序媛’, “黑马程序猿”

思考:如何打印以下字符串。
我是一个”正直”的人
我很喜欢”黑马’程序猿’”
测试字符串中的字符个数:

1
console.log(msg.length);

2.2.1 转义符

2.2.2 字符串长度

length属性用来获取字符串的长度

1
2
var str = '黑马程序猿 Hello World';
console.log(str.length);

2.2.3 字符串拼接

字符串拼接使用 + 连接

1
2
3
4
5
console.log(11 + 11);
console.log('hello' + ' world');
console.log('100' + '100');
console.log('11' + 11);
console.log('male:' + true);
  1. 两边只要有一个是字符串,那么+就是字符串拼接功能
  2. 两边如果都是数字,那么就是算术功能。

3、Boolean类型

  • Boolean字面量: true和false,区分大小写
  • 计算机内部存储:true为1,false为0

4、Undefined和Null

  1. undefined表示一个声明了没有赋值的变量,变量只声明的时候值默认是undefined
  2. null表示一个空,变量的值如果想为null,必须手动设置

5、获取变量的类型

typeof

1
2
var age = 18;
console.log(typeof age); // 'number'

四、注释

4.1 单行注释

用来描述下面一个或多行代码的作用

1
2
// 这是一个变量
var name = 'hm';

4.2 多行注释

用来注释多条代码

1
2
3
4
5
/*
var age = 18;
var name = 'zs';
console.log(name, age);
*/

五、操作符

5.1 算术运算符

+ - * / %

5.2 一元运算符

一元运算符:只有一个操作数的运算符

5 + 6 两个操作数的运算符 二元运算符

++ 自身加1

-- 自身减1

前置++

1
2
var num1 = 5;
++ num1;

后置++

1
2
var num1 = 5;
num1 ++;

思考题:

1
2
3
var a = 1;
var b = ++a + ++a;
console.log(b);
1
2
3
var a = 1;
var b = a++ + a++;
console.log(b);

5.3 逻辑运算符(布尔运算符)

&& 与 两个操作数同时为true,结果为true,否则都是false
|| 或 两个操作数有一个为true,结果为true,否则为false
!  非  取反

5.4 关系运算符(比较运算符)

<  >  >=  <= =="!=" !="=
1
2
3
4
5
==与===的区别:==只进行值得比较,===类型和值同时相等,则相等

var result = '55' == 55; // true
var result = '55' === 55; // false 值相等,类型不相等
var result = 55 === 55; // true

5.5 赋值运算符

= += -= *= /= %=

例如:
var num = 0;
num += 5;   //相当于  num = num + 5;

5.6 运算符的优先级

优先级从高到底
    1. ()  优先级最高
    2. 一元运算符  ++   --   !
    3. 算数运算符  先*  /  %   后 +   -
    4. 关系运算符  >   >=   <   <= 5.="" 相等运算符="=" !="===" 6.="" 逻辑运算符="" 先&&="" 后||="" 7.="" 赋值运算符<="" code="">
1
2
3
4 >= 6) || ('人' != '阿凡达') && (!(12 * 2 == 144)) && true
false||true
由于|| 和&& 运算级别最低,因为在该表达式中没有赋值,所以可以加上小括号。

六、流程控制

程序的三种基本结构

顺序结构

从上到下执行的代码就是顺序结构

程序默认就是由上到下顺序执行的

分支结构

根据不同的情况,执行对应代码

循环结构

循环结构:重复做一件事情

6.1 分支结构

if语句

语法结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (/* 条件表达式 */) {
// 执行语句
}

if (/* 条件表达式 */){
// 成立执行语句
} else {
// 否则执行语句
}

if (/* 条件1 */){
// 成立执行语句
} else if (/* 条件2 */){
// 成立执行语句
} else if (/* 条件3 */){
// 成立执行语句
} else {
// 最后默认执行语句
}

案例:1、求两个数的最大数
2、判断一个数是偶数还是奇数
3、分数转换,把百分制转换成ABCDE <60 90="" 100="" e="" 60-70="" d="" 70-80="" c="" 80-90="" b="" -="" a<="" p="">

6.2 循环结构

在javascript中,循环语句有三种,while、do..while、for循环。

while语句

基本语法:

1
2
3
4
5
// 当循环条件为true时,执行循环体,
// 当循环条件为false时,结束循环。
while (循环条件) {
//循环体
}

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
// 计算1-100之间所有数的和
// 初始化变量
var i = 1;
var sum = 0;
// 判断条件
while (i <= 100) {
// 循环体
sum += i;
// 自增
i++;
}
console.log(sum);

案例:打印100以内所有偶数的和(作业1)

do…while语句

do..while循环和while循环非常像,二者经常可以相互替代,但是do..while的特点是不管条件成不成立,都会执行一次。

基础语法:

1
2
3
do {
// 循环体;
} while (循环条件);

代码示例:

1
2
3
4
5
6
7
// 初始化变量
var i = 1;
var sum = 0;
do {
sum += i;//循环体
i++;//自增
} while (i <= 100);//循环条件

for语句

for循环语法:

1
2
3
4
// for循环的表达式之间用的是;号分隔的,千万不要写成,
for (初始化表达式1; 判断表达式2; 自增表达式3) {
// 循环体4
}

执行顺序:1243 —- 243 —–243(直到循环条件变成false)

  1. 初始化表达式

  2. 判断表达式

  3. 自增表达式

  4. 循环体

七、数组

为什么要学习数组

之前学习的数据类型,只能存储一个值(比如:Number/String。我们想存储班级中所有学生的姓名,此时该如何存储?

数组的概念

所谓数组,就是将多个元素(通常是同一类型)按一定顺序排列放到一个集合中,那么这个集合我们就称之为数组。

数组的定义

数组是一个有序的列表,可以在数组中存放任意的数据,并且数组的长度可以动态的调整。

通过数组字面量创建数组

1
2
3
4
5
6
7
8
9
10
11
// 创建一个空数组
var arr1 = [];
// 创建一个包含3个数值的数组,多个数组项以逗号隔开
var arr2 = [1, 3, 4];
// 创建一个包含2个字符串的数组
var arr3 = ['a', 'c'];

// 可以通过数组的length属性获取数组的长度
console.log(arr3.length);
// 可以设置length属性改变数组中元素的个数
arr3.length = 0;

获取数组元素

数组的取值

1
2
3
4
5
6
// 格式:数组名[下标]   下标又称索引
// 功能:获取数组对应下标的那个值,如果下标不存在,则返回undefined。
var arr = ['red',, 'green', 'blue'];
arr[0]; // red
arr[2]; // blue
arr[3]; // 这个数组的最大下标为2,因此返回undefined

遍历数组

遍历:遍及所有,对数组的每一个元素都访问一次就叫遍历。

数组遍历的基本语法:

1
2
3
for(var i = 0; i < arr.length; i++) {
// 数组遍历的固定结构
}

数组中新增元素

数组的赋值

1
2
3
4
5
6
7
// 格式:数组名[下标/索引] = 值;
// 如果下标有对应的值,会把原来的值覆盖,如果下标不存在,会给数组新增一个元素。
var arr = ["red", "green", "blue"];
// 把red替换成了yellow
arr[0] = "yellow";
// 给数组新增加了一个pink的值
arr[3] = "pink";

八、函数

一、为什么要有函数

如果要在多个地方求1-100之间所有数的和,应该怎么做?

二、什么是函数

把一段相对独立的具有特定功能的代码块封装起来,形成一个独立实体,就是函数,起个名字(函数名),在后续开发中可以反复调用

函数的作用就是封装一段代码,将来可以重复使用

2.1 函数的定义

函数声明

1
2
3
function 函数名() {
// 函数体
}

特点:

函数声明的时候,函数体并不会执行,只要当函数被调用的时候才会执行。
函数一般都用来干一件事情,函数名称一般使用动词

2.2 函数的调用

  • 调用函数的语法:
1
函数名();
  • 特点:

    函数体只有在调用的时候才会执行,调用需要()进行调用。
    可以调用多次(重复使用)

    代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 声明函数
function sayHi() {
console.log("吃了没?");
}
// 调用函数
sayHi();

// 求1-100之间所有数的和
function getSum() {
var sum = 0;
for (var i = 0; i < 100; i++) {
sum += i;
}
console.log(sum);
}
// 调用
getSum();

2.3 函数的参数

为什么要有参数

1
2
3
4
5
6
7
8
9
10
function getSum() {
var sum = 0;
for (var i = 1; i <= 100; i++) {
sum += i;
}
console.log();
}

// 虽然上面代码可以重复调用,但是只能计算1-100之间的值
// 如果想要计算n-m之间所有数的和,应该怎么办呢?

语法:

1
2
3
4
5
6
7
8
9
10
// 函数内部是一个封闭的环境,可以通过参数的方式,把外部的值传递给函数内部
// 带参数的函数声明
function 函数名(形参1, 形参2, 形参3...) {
// 函数体
}

// 带参数的函数调用
函数名(实参1, 实参2, 实参3);
形参1 = 实参1
形参2 = 实参2

形参和实参

  1. 形式参数:在声明一个函数的时候,为了函数的功能更加灵活,有些值是固定不了的,对于这些固定不了的值。我们可以给函数设置参数。这个参数没有具体的值,仅仅起到一个占位置的作用,我们通常称之为形式参数,也叫形参。

  2. 实际参数:如果函数在声明时,设置了形参,那么在函数调用的时候就需要传入对应的参数,我们把传入的参数叫做实际参数,也叫实参。

1
2
3
4
5
var x = 5, y = 6;
fn(x,y);
function fn(a, b) {
console.log(a + b);
}

案例

求n-m之间所有数的和(作业1)

n=100

m=200

function getSum(n,m){

}

2.4 函数的返回值

函数执行完的时候,并不是所有时候都要把结果打印。我们期望函数给我一些反馈(比如计算的结果返回进行后续的运算),这个时候可以让函数返回一些东西。也就是返回值。函数通过return返回一个返回值

返回值语法:

1
2
3
4
5
6
7
8
//声明一个带返回值的函数
function 函数名(形参1, 形参2, 形参3...) {
//函数体
return 返回值;
}

//可以通过变量来接收这个返回值
var 变量 = 函数名(实参1, 实参2, 实参3...);

函数的调用结果就是返回值,因此我们可以直接对函数调用结果进行操作。

案例

  • 求组数中的最大值
  • 求组数中的最小值(作业2)

返回值详解:

如果函数没有显示的使用 return语句 ,那么函数有默认的返回值:undefined
如果函数使用 return语句,那么跟再return后面的值,就成了函数的返回值
如果函数使用 return语句,但是return后面没有任何值,那么函数的返回值也是:undefined
函数使用return语句后,这个函数会在执行完 return 语句之后停止并立即退出,也就是说return后面的所有其他代码都不会再执行。

九、什么是对象

现实生活中:万物皆对象,对象是一个具体的事物,一个具体的事物就会有行为和特征。
举例: 一部车,一个手机
车是一类事物,门口停的那辆车才是对象
    特征:红色、四个轮子
    行为:驾驶、刹车

1、JavaScript中的对象

JavaScript中的对象其实就是生活中对象的一个抽象
JavaScript的对象是无序属性的集合。
    其属性可以包含基本值、对象或函数。对象就是一组没有顺序的值。我们可以把JavaScript中的对象想象成键值对,其中值可以是数据和函数。
对象的行为和特征
    特征---属性
    行为---方法
  • 事物的特征在对象中用属性来表示。
  • 事物的行为在对象中用方法来表示。

2、为什么要有对象

1
2
3
4
5
6
7
function printPerson(name, age, sex....) {
}
// 函数的参数如果特别多的话,可以使用对象简化
function printPerson(person) {
console.log(person.name);
……
}

3、 对象创建

1
2
3
4
5
6
7
8
var o = {
name: 'zs,
age: 18,
sex: true,
sayHi: function () {
console.log(this.name);
}
};

通过构造函数来创建对象。(第一个单词的第一个字母大写,后续的每一个单词的第一个字母都大写)

1
2
3
4
5
6
7
8
9
10
11
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayHi = function(){
console.log('Hello,everyBody');
}
}
var p1 = new Person('张三', 22, 'actor');
var p2 = new Person('李四',20, 'student');
p1.sayHi();

4、属性和方法

如果一个变量属于一个对象所有,那么该变量就可以称之为该对象的一个属性,属性一般是名词,用来描述事物的特征
如果一个函数属于一个对象所有,那么该函数就可以称之为该对象的一个方法,方法是动词,描述事物的行为和功能

5、new关键字

构造函数 ,是一种特殊的函数。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

  1. 构造函数用于创建一类对象,首字母要大写。
  2. 构造函数要和new一起使用才有意义。

new在执行时会做四件事情

new会在内存中创建一个新的空对象
new 会让this指向这个新的对象
执行构造函数  目的:给这个新对象加属性和方法
new会返回这个新对象

3.6 this详解

JavaScript中的this指向问题,有时候会让人难以捉摸,随着学习的深入,我们可以逐渐了解
现在我们需要掌握函数内部的this几个特点
    1. 函数在定义的时候this是不确定的,只有在调用的时候才可以确定
    2. 一般函数直接执行,内部this指向全局window
    3. 函数作为一个对象的方法,被该对象所调用,那么this指向的是该对象
    4. 构造函数中的this其实是一个隐式对象,类似一个初始化的模型,所有方法和属性都挂载到了这个隐式对象身上,后续通过new关键字来调用,从而实现实例化

十、什么是DOM

1、DOM的概念

文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标记语言的标准编程接口。它是一种与平台和语言无关的应用程序接口(API),它可以动态地访问程序和脚本,更新其内容、结构和www文档的风格(目前,HTML和XML文档是通过说明部分定义的)。文档可以进一步被处理,处理的结果可以加入到当前的页面。DOM是一种基于树的API文档,它要求在处理过程中整个文档都表示在存储器中。

DOM又称为文档树模型

  • 文档:一个网页可以称为文档
  • 节点:网页中的所有内容都是节点(标签、属性、文本、注释等)
  • 元素:网页中的标签
  • 属性:标签的属性

2、DOM经常进行的操作

  • 获取元素
  • 对元素进行操作(设置其属性或调用其方法)
  • 动态创建元素
  • 事件(什么时机做相应的操作)

3、获取页面元素

3.1 为什么要获取页面元素

例如:我们想要操作页面上的某部分(显示/隐藏,动画),需要先获取到该部分对应的元素,才进行后续操作

3.2 根据id获取元素

1
var div = document.getElementById('main');

3.3 根据标签名获取元素

1
var divs = document.getElementsByTagName('div');

返回的是一个集合,不是数组,可以认为是伪数组。

我们获取了元素后,可以对其进行操作,但是我们往往都是在触发了某个事件的时候才会对元素进行操作。

什么是事件呢?

十一、事件

1、什么是事件

当什么时候做什么事情 ,

触发-响应

2、事件三要素

  • 事件源:触发(被)事件的元素
  • 事件名称: click 点击事件
  • 事件处理程序:事件触发后要执行的代码(函数形式)

3、事件的基本使用

1
2
3
4
var box = document.getElementById('box');
box.onclick = function() {
console.log('代码会在box被点击后执行');
};

4、案例

  • 点击按钮切换图片

十二、属性操作

1、属性基本操作

1
2
3
4
5
6
var link = document.getElementById('link');
console.log(link.href);
console.log(link.title);

var pic = document.getElementById('pic');
console.log(pic.src);

案例:点击按钮显示隐藏div(作业)

现在已经实现了div的隐藏,下面可以div的展示,注意按钮上的文字要变成 “显示”

2、innerHTML和innerText

innerHTML  innerText
获取开始标签和结束标签之间的内容
innerHTML  获取内容的时候,如果内容中有标签,会把标签也获取到,原封不动把内容获取到
innerText  获取内容的时候,如果内容中有标签,会把标签过滤掉

十三、BOM

1、BOM的概念

BOM(Browser Object Model) 是指浏览器对象模型,浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。BOM由多个对象组成,其中代表浏览器窗口的Window对象是BOM的顶层对象,其他对象都是该对象的子对象。

我们在浏览器中的一些操作都可以使用BOM的方式进行编程处理,

比如:刷新浏览器、后退、前进、在浏览器中输入地址等

2、BOM的顶级对象window

window是浏览器的顶级对象,当调用window下的属性和方法时,可以省略window。

3、对话框

  • alert()
  • prompt()
  • confirm()

4、页面加载事件

onload

1
2
3
4
window.onload = function () {
// 当页面加载完成执行
// 当页面完全加载所有内容(包括图像、脚本文件、CSS 文件等)执行
}

5、定时器

setTimeout()和clearTimeout()

在指定的毫秒数到达之后执行指定的函数,只执行一次

1
2
3
4
5
6
7
// 创建一个定时器,1000毫秒后执行,返回定时器的标示
var timerId = setTimeout(function () {
console.log('Hello World');
}, 1000);

// 取消定时器的执行
clearTimeout(timerId);

6、 删除提示案例

7、setInterval()和clearInterval()

定时调用的函数,可以按照给定的时间(单位毫秒)周期调用函数

1
2
3
4
5
6
7
// 创建一个定时器,每隔1秒调用一次
var timerId = setInterval(function () {
console.log('你好');
}, 1000);

// 取消定时器的执行
clearInterval(timerId);

8、location对象

location可以获取或者设置浏览器地址栏的地址

1
2
3
4
5
6
"button" name="" value="单击跳转" id="btn">

0%