JavaScript学习

1、什么是JavaScript

1.1、概述
  • 地位:JavaScript是一门世界上最流行的脚本语言

  • Java、JavaScript的关系:JavaScript虽然是为了借助Java的名声而命名,其本身的设计理念就也就是对标Java而进行改造的。(只不过当初的原作者并不喜欢Java这个语言,所以才在一开始的时候并没有体现出太多Java的特性),而在后来对JavaScript地不断演进过程中,越来越多Java的特性被用于到JavaScript当中,其中有很多语法也很相似。

  • 研发时间:10天~

一个合格的后端人员,必须要精通 JavaScript

1.2、历史

https://blog.csdn.net/kese7952/article/details/79357868

ECMAScript它可以理解为是JavaScript的一个标准

最新版本已经到es6版本~

但是大部分浏览器还只停留在支持 es5 代码上!

开发环境—线上环境,版本不一致(需要将IDEA的开发环境的标准设置到:ES5标准)

2、快速入门

2.1、引入 JavaScript

1、内部标签

<script>
    //......
</script>

2、外部引入:

abs.js的内容:

// 省略

test.html引入abs.js文件:

<script src="abc.js"></script>

3、测试代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <!--script标签内,写Javascript代码-->
    <!--<script>-->
        <!--alert('hello,world');-->
    <!--</script>-->


    <!--外部引入-->
    <!--注意:script标签必须成对出现-->
    <script src="js/qj.js"></script>


    <!--不用显示定义type,也默认就是 javascript-->
    <script type="text/javascript">

    </script>


</head>
<body>

<!--这里也可以存放script标签-->
</body>
</html>
2.2、基本语法入门
  • 测试代码:(定义变量和条件控制!)
<!--JavaScript严格区分大小写!-->
<script>
    // 1. 定义变量    变量类型  变量名  = 变量值;(体现了动态语言定义变量的简单性)
    var score = 71;
    // alert(num);
    // 2. 条件控制
    if (score>60 && score<70){
        alert("60~70")
    }else if(score>70 && score<80){
        alert("70~80")
    }else{
        alert("other")
    }
</script>
  • 浏览器必备调试须知:(以Chrome浏览器为例!)
    在这里插入图片描述

1、Elements :这里面呈现的是完整页面被渲染后的html文档(其中只包括html文件)还有**Style样式(**对应CSS的修饰效果,我们可以直接在这上面修改后理解查看页面效果,相当于实时预览的效果!)。由于JavaScript文件会对CSS和HTML文档进行动态修改,所以这里所展示的HTML文档并不是最初的HTML中的内容!

2、Console:控制台。这里就是可以随时测试调整JavaScript代码的地方。它所表现的功能就是类似于一个Python的Django框架的终端一样的功能,可以在这里对该网页所拥有的JS代码进行调用和调试,同时,也会打印出在JS代码中所写的功能语句,作为提示参考使用!
        问题: 如果在Console里利用JS代码对网页中的元素进行动态修改,那网页还会被重新渲染吗?(因为网页在最初加载的时候就已经被渲染了一次了!回答:会!)

3、Source:这个是这个html网页的工程文件,其中所有加载的文件都被分门别类的隔离了开来,与开发环境中的文件体系很是相似,在这里,可以看到网页真正的源码文件,例如:CSS,JavaScript,以及html和图片,音频等等在内…

4、Network:网络传输情况查看,通过这里面可以看到有哪些网络请求在页面上进行传送,可以捕捉到POST或者GET的发送信息,也可以捕获Ajax异步请求等等所有有网络交互的信息都会在这里面展示出来。(其中:还可以通过设置网络传输速度来控制网页的传输速度,一般都是往慢的调整,看网页的加载情况以及对应的网络包等等来分析~)

5、Application:该面板主要是记录网站加载的所有资源信息,包括存储数据(Local Storage、Session Storage、IndexedDB、Web SQL、Cookies)、缓存数据、字体、图片、脚本、样式表等。

6、注意:js代码生效后,在html页面所使用的js代码生成的变量在console控制台中也能进行打印输出!

2.3、数据类型

数值,文本,图形,音频,视频…

  • 变量
var 王者荣耀=“倔强青铜”;
  • number(js不区分小数和整数,类型都是Number)
123 //整数123
123.1 // 浮点数123.1
1.123e3 //科学计数法
-99    //复数
NaN    // not  a  number
Infinity //表示无限大
  • 字符串(String)
'abc'
"abc"
  • 布尔值(Boolean)
true
false
  • 逻辑运算
&& 两个都为真,结果为真
|| 一个为真,结果为真
! 真即假,假即真
  • 比较运算符 (重要)
= 	赋值
== 	等于(类型不一样,值一样,也会判断为true)
=== 绝对等于(类型一样,值一样,结果为true)

注意:这是JS的一个缺陷,坚持不要使用"=="号进行比较判定!
须知:

1. NaN === NaN, 这个与所有的数值都不相等,包括自己
2. NaN只能通过isNaN(NaN)来判断这个数是否是NaN
  • 浮点数问题:
console.log((1/3)===(1-2/3))   结果为:false

注意:尽量避免使用浮点数进行运算,存在计算机无法表示的精度问题,可以使用如下方法:

Math.abs(1/3-(1-2/3)) < 0.0000001
  • null 和 undefined

    • null 空
    • undefined 未定义
  • 数组
    Java的数值必须是相同类型的对象,但在JS中不需要这样!

//保证代码的可读性,尽量使用[]
var arr = [1,2,3,4,5,'hello',null,true]

new Array(1,12,3,4,4,5,'hello')

注意:JS的代码很难写到报错的程度,比如:在数组中用下标索引取值,如果越界了,则会报出:

undefined
  • 对象注意:对象是大括号{},数组是中括号[]

每个属性之间使用逗号隔开,最后一个属性不需要添加逗号!

// Person person = new Person(1,2,3,4,5)  java的写法!
// JS的写法:
var person = {
	name: "xiaobo",
	age: 3,
	tags: ['js','python','java','shell','...']
}

取对象的值

person.name
> "xiaobo"
person.age
> 3
  • Javascript 的全局变量和局部变量的问题!
    1. 全局变量前可以不加任何修饰
    2. 全局变量一定是在函数作用范围外进行定义的
    3. 全局变量是绑定在window对象上的属性,也可以通过window.xxx来进行定义
2.4、严格检查格式
  • 前提:需要在IDEA中设置支持ES6模式才生效!
    在这里插入图片描述

  • 示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <!--
    前提:IEDA 需要设置支持ES6语法
    'use strict'; 严格检查模式,预防JavaScript的随意性导致产生的一些问题
    必须写在JavaScript的第一行!
    局部变量建议都使用 let 去定义~
    -->
    <script>
        'use strict';
        // 全局变量
        let i = 1;
        // ES6   let
        
    </script>

</head>
<body>

</body>
</html>
  • 关于let和var的一些区别: ES6 新增了let命令,用来声明局部变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束。

3、数据类型

3.1、字符串

1、正常字符串我们使用单引号,或者双引号包裹
2、注意转义字符串 \

\' 
\n
\t
\u4e2d  \u#### Unicode字符(展示出来的就是汉字:中)
\x41          Ascll字符(展示出来对应的Ascll字符)

3、多行字符串编写

//tab 上面 esc键下面
var msg = 
    `hello
world
你好ya
你好`

4、模板字符串

//tab 上面 esc键下面
let name = "qinjiang";
let age = 3;

let msg = `你好呀,${name}`

5、字符串长度

str.length

6、字符串的可变性与不可变性:
在这里插入图片描述

  • 注意:我们看到student字符串的确能被改变,而且没有报错,但是改变的效果一点儿都没有体现出来。

7、大小写转换

//注意,这里是方法,不是属性了
student.toUpperCase()  // 将字符串转换为大写
student.toLowerCase()  // 将字符串转换为小写

8、查询字符所在字符串的索引位置

student.indexOf('t')

9、substring

student.substring(1) // 从字符串的第一个截取到最后一个字符
student.substring(1,3) // [1,3] 含头不含尾
3.2、数组

注意:JavaScript中,Array可以包含任意的数据类型!
示例:

var arr = [1,2,3,4,5,6]; //通过下标取值和赋值
arr[0]
arr[0] = 1

1、长度:

arr.length

注意:假如给arr.length赋值,数组大小就会发生表换,如果赋值的数值过小,数组元素就会丢失!

2、indexOf,通过元素获得下标索引

arr.indexOf(2)
> 1

3、slice() 截取Array的一部分,返回一个新的数组,类似于String中的substring

4、push(),pop() 尾部

push: 压入到尾部
pop:弹出尾部的一个元素

5、unshift(),shift()头部

unshift: 压入到头部
shift: 弹出头部的一个元素

6、排序:sort()

(3) ["B", "C", "A"]
arr.sort()
(3) ["A", "B", "C"]

7、元素反转reverse()

(3) ["A", "B", "C"]
arr.reverse()
(3) ["C", "B", "A"]

8、concat()

(3) ["C", "B", "A"]
arr.concat([1,2,3])
(6) ["C", "B", "A", 1, 2, 3]
arr
(3) ["C", "B", "A"]

注意:concat() 并没有修改数组,只是会返回一个新的数组!

9、连接符 join : 打印拼接数组,使用特定的字符串连接,调用后返回一个生成的字符串!

(3) ["C", "B", "A"]
arr.join('-')
"C-B-A"

10、多维数组

arr = [[1,2],[3,4],["5","6"]];
arr[1][1]
4

11、由于JS数组索引越界不报错,所以利用另一种方式来查看该索引的结果是否越界:
Js中数组的hasOwnProperty()中,如果传入数组中已经存在的索引,就可以返回true。(这本是js中对象用来检查本身的键的函数!)

数组:存储数据 (如何存,如和取,方法都可以自己实现!)

3.3、对象

概念:对象包含了若干个键值对

var 对象名 = {
	属性名: 属性值,
    属性名: 属性值,
    属性名: 属性值
}

//定义了一个person对象,它有四个属性!
var person = {
    name: "kuangshen",
    age: 3,
    email: "24736743@qq.com",
    score: 0
}

注意:Js中对象, {……} 表示一个对象, 键值对描述属性 xxxx:xxxx,多个属性之间使用逗号隔开,最后一个属性不加逗号!
特别地:Javascript中所有的键都是字符串,值是任意类型的对象!

1、对象赋值

person.name = "xiaobo"
"xiaobo"
person.name
"xiaobo"

2、使用一个不存在的对象属性,不会报错!会返回undefined

person.haha
undefined

3、动态地删减属性,通过delete删除对象的属性

delete person.name
true
person

4、动态的添加,直接给新的属性添加值即可

person.haha = "haha"
"haha"
person

5、判断属性值是否在这个对象中! xxx in xxx

'age' in person
true
//继承
'toString' in person
true

6、判断一个属性是否是这个对象自身拥有的 hasOwnProperty()

person.hasOwnProperty('toString')
false
person.hasOwnProperty('age')
true
3.4、流程控制

1、if 判断

var age = 3;
if (age>3){ //第一个判断
    alert("haha");
}else if(age<5) {  //第二个判断
   alert("kuwa~");
}else { //否则,,
    alert("kuwa~");
}

2、while 循环,避免程序陷入死循环

while(age<100){
    age = age + 1;
    console.log(age)
}

do{
    age = age + 1;
    console.log(age)
}while(age<100)

3、for循环

for (let i=0;i<100;i++){
	console.log(i);
}

4、forEach 循环

ES 5.1 引入

var age = [12,3,12,3,12,3,12,31,23,123]
// 函数
age.forEach(function (value){
	console.log(value)
})

5、for … in

// for(var index in object){}
// 示例中的num相当于是age中每个元素的索引!
for(var num in age){
	if(age.hasOwnProperty(num)){
		console.log("存在")
		console.log(age[num])
	}
}
3.5、Map和Set

ES 6的新特性~

Map:字典(键值映射)

//ES6  Map
//学生的成绩,学生的名字
// var names = ["tom","jack","haha"];
// var scores = [100,90,80];

var map = new Map([['tom',100],['jack',90],['haha',80]]);
var name = map.get('tom'); 	//通过key获得value!
map.set('admin',123456);  	//新增或修改!
map.delete("tom"); 			//删除!

Set:无序不重复的集合

var set = new Set();
set.add(2); //添加!
set.delete(1);  //删除!
console.log(set.has(3));  //是否包含某个元素!
3.6、iterator

es6 新特性

  • 问题:iterator 有什么用? 为何要使用这个?
  • 回答:(参考博客:JavaScript浅谈之迭代器(Iterator) 和for-of循环)
    • for-of是最简单,最直接的遍历数组元素的语法
    • 成功的避开了for-in循环的所有缺陷
    • 与forEach不同的是,它可以正确的相应break,continue和return语句

作业:使用iterator 来遍历迭代我们的Map,Set !

1、遍历数组

//通过for of /  for  in 下标
var arr = [3,4,5]
for (var x of arr){
    console.log(x)
}

2、遍历map

var map = new Map([["tom",100],["jack",90],["haha",80]])
for(let x of map){
	console.log(x)
}

3、遍历set

var set = new Set([5,6,7]);
for (let x of set) {
    console.log(x)
}

4、函数

4.1、定义函数

定义方式一

  • 绝对值函数:
    function abs(x){
        if(x>=0){
            return x;
        }else{
            return -x;
        }
    }
    

一旦执行到 return 代表函数结束,返回结果!
如果没有执行 return ,函数执行完也会返回结果,结果就是 undefined

定义方式二:

var abs = function(x){
	if(x > 0){
		return x;
	}else{
		return -x;
	}
}

注意:这里的function(x){…} 是一个匿名函数,但是可以把这个结果赋值给abs,通过abs就可以调用这个匿名函数,相当于给它命名了!

调用函数

abs(10) // 10
abs(-10)// 10
  • 参数问题:JavaScript 可以传任意个参数,也可以不传递参数~

  • 参数进来是否存在的问题?

  • 假设不存在参数,如果规避?

  • 对传递进来的参数进行类型检查!

    var abs = function(x){
        //手动抛出异常来判断
        if (typeof x!== 'number') {
            throw 'Not a Number';
        }
        if(x>=0){
            return x;
        }else{
            return -x;
        }
    }
    

arguments

arguments 是一个JS免费赠送的关键字:代表传递进来的所有参数,是一个数组!

var abs = function(x){

    console.log("x=>"+x);

    for (var i = 0; i<arguments.length;i++){
        console.log(arguments[i]);
    }

    if(x>=0){
        return x;
    }else{
        return -x;
    }
}

问题:arguments 包含所有的参数,我们有时候想使用多余的参数来进行附加操作。需要排除已有参数~(ES6中引入的…rest,解决了此问题!)

rest
以前:

if (arguments.length > 2){
	for(var i=2;i<arguments.length;i++){
		//.....
	}
}

ES6 引入新特性,获取出了已经定义的参数之外的所有参数~

function aaa(a,b,...rest){
	console.log("a=>"+a);
	console.log("b=>"+b);
	console.log(rest);
}

注意:rest 参数只能写在最后面,必须用…标识。javascript 的可变长参数只能用 “…rest”,而不能用其他标识符来表示!

4.2、变量的作用域

在javascript中,var 定义变量实际是有"作用域"的。

假设在函数体中声明变量,则在函数体外不可以使用该变量~(非要想实现的话,后面可以研究一下“闭包”)

function qj() {
    var x = 1;
    x = x + 1;
}

x = x + 2; //Uncaught ReferenceError: x is not defined

如果两个函数使用了相同的变量名,只要在函数内部,就不会产生冲突

function xb() {
    var x = 1;
    x = x + 1;
}

function xb2() {
    var x = 'A';
    x = x + 1;
}

注意:在嵌套函数中,内部函数可以访问到外部函数的成员,反之则不行!

function qj() {
    var x = 1;

    // 内部函数可以访问外部函数的成员,反之则不行
    function qj2() {
        var y = x + 1;  // 2
    }

    var z = y + 1; // Uncaught ReferenceError: y is not defined
}

假设,内部函数变量和外部函数的变量 ,重名!

function qj() {
    var x = 1;

    function qj2() {
        var x = 'A';
        console.log('inner'+x); //innerA
    }
    console.log('outer'+x); //outer1 
    qj2()

}

qj()

假设在Javascript中函数查找变量从自身函数开始~,由“内”向“外”查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量。(就近原则)

提升变量的作用域:

function xb(){
	var x = "x"+y;
	console.log(x);
	var y = "y";
}

这个在JavaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护;

function qj2() {
    var x = 1,
        y = x + 1,
        z,i,a; //undefined

    // 之后随意用
}

全局变量:

// 全局变量
x = 1;

function f() {
	console.log(x);
}
f();
console.log(x);

全局对象 window

var x = 'xxx';
alert(x);
alert(window.x); // 默认所有的全局变量,都会自动绑定在 window对象下;

alert() 这个函数本身也是一个 window 变量:

var x = 'xxx';

window.alert(x);

var old_alert = window.alert;

//old_alert(x);

window.alert = function () {

};
// 发现 alert() 失效了
window.alert(123);

//恢复
window.alert =  old_alert;
window.alert(456);

小结:Javascript 实际上只有一个全局作用域, 任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错 RefrenceError

问题:在标签中定义的 var x; 全局变量和 x ; 全局变量,这两者有何区别?(回答:没有区别,两者是一致的!)

规范
由于我们所有的全局变量都会绑定到我们的window 上。如果不同的js文件,使用了相同的全局变量,就会产生冲突。如何能够减少冲突?

// 唯一全局变量
var KuangApp = {};

// 定义全局变量
KuangApp.name = 'kuangshen';
KuangApp.add = function (a,b) {
    return a + b;
}

方法:把自己的代码全部放入自己定义的唯一空间名字中, 降低全局命名冲突的问题~,JQuery就是这么做的!

局部作用域 let

function aaa(){
	for(var i =0; i<100; i++){
		console.log(i)
	}
	console.log(i+1)// 问题:这个i出了for循环的作用域还可以使用!
}

ES6 let 关键字:解决局部作用域冲突的问题!

function aaa(){
	for(let i=0;i<100;i++){
		console.log(i);
	}
	console.log(i+1); //Uncaught ReferenceError: is is not defined
}

注意:由于 var 在for循环块儿中,可能会与局部作用域范围的定义产生冲突(var 定义的变量已经出了for的循环块儿),所以在ES6中产生了更安全的关键字:let ,用来去定义局部变量!

常量 const

在ES6 之前,怎么定义常量:只要用全部大写字母命名的变量就是常量;建议不要修改这样的值(相当于是一种人为规范,有意识的人才能意识到,计算机本身不做能否修改的约束!)

var PI = "3.14";

console.log(PI);
PI = "213"; // 可以改变这个PI的数值
console.log(PI);

在ES6后,引入了常量的关键字 const

const PI = "3.14"; // 只读常量
console.log(PI);

PI = "123"; //TypeError: Assignment to constant variable.
console.log(PI);
4.3、方法

定义方法:

概念:方法就是把函数放在对象的里面,对象只有两个东西:属性和方法

var kuangshen = {
    name: 'xiaobo',
    bitrh: 2000,
    // 方法
    age: function () {
        // 今年 - 出生的年
        var now = new Date().getFullYear();
        return now-this.bitrh;
    }
}
//属性
kuangshen.name
//方法,一定要带  ()
kuangshen.age() 

this.代表什么? 拆开上面的代码看看~

function getAge() {
    // 今年 - 出生的年
    var now = new Date().getFullYear();
    return now-this.bitrh;
}

var kuangshen = {
    name: 'xiaobo',
    bitrh: 2000,
    age: getAge
}

// kuangshen.age() 	ok		因为:kuangshen 这个对象存在birth这个属性
// getAge()  				NaN   因为:window对象没有birth这个属性!(即使给window绑定了birth属性也没用)

结论:一般来说是无法控制this的指向的,this默认指向调用它的那个对象;

apply

概念:apply 在 js 中可以控制 this 指向!

function getAge() {
    // 今年 - 出生的年
    var now = new Date().getFullYear();
    return now-this.bitrh;
}

var xxx = {
    name: 'xxx',
    bitrh: 2000,
    age: getAge
};

var xiaoming = {
    name: '小明',
    bitrh: 2000,
};

// xxx.age() ok
getAge.apply(xiaoming,[]);// this指向了xiaoming,getAge传递的参数为空!

5、内部对象

标准对象

typeof 123
"number"
typeof '123'
"string"
typeof true
"boolean"
typeof NaN
"number"
typeof []
"object"
typeof {}
"object"
typeof Math.abs
"function"
typeof undefined
"undefined"
5.1、Date

基本使用

var now = new Date(); //Sat Jan 04 2020 10:47:06 GMT+0800 (中国标准时间)
now.getFullYear(); //年
now.getMonth(); // 月   0~11  代表月
now.getDate(); // 日
now.getDay(); // 星期几
now.getHours(); // 时
now.getMinutes(); // 分
now.getSeconds(); // 秒

now.getTime(); // 时间戳 全世界统一 1970 1.1 0:00:00  毫秒数

console.log(new Date(1578106175991)) //时间戳转为时间

转换

now = new Date(1578106175991)
Sat Jan 04 2020 10:49:35 GMT+0800 (中国标准时间)
now.toLocaleString // 注意,调用是一个方式,不是一个属性!
ƒ toLocaleString() { [native code] }
now.toLocaleString()  
"2020/1/4 上午10:49:35"
now.toGMTString()
"Sat, 04 Jan 2020 02:49:35 GMT"

注意:这里还可以利用Date对象的set方法来设置时间:(可以通过这种方式来获得一个指定的日期!)

var x = new Date()
undefined
x
Wed Feb 05 2020 14:55:41 GMT+0800 (中国标准时间)
x.getDate()
5
x.setDate(4)
1580799341376 //此时x的日期已经发生变换。
5.2、JSON

json 是什么?

早期,所有的数据传输都习惯使用 XML 文件!

  • JSON(JavaScript Object Notation ,JS 对象简谱)是一种轻量级的数据交换格式
  • 简洁和清晰的层次结构使得JSON称为理想的数据交换语言。
  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在JavaScript 一切皆对象,任何 js 支持的类型都可以用JSON 表示:Number, String …
格式:

  • 对象都用{}
  • 数组都用[]
  • 所有的键值对都是用 key:value

JSON 字符串和JS对象的转换

var user = {
    name: "qinjiang",
    age: 3,
    sex: '男'
}

//对象转化为json字符串 {"name":"qinjiang","age":3,"sex":"男"}
var jsonUser =  JSON.stringify(user);

//json 字符串转化为对象 参数为 json 字符串
var obj = JSON.parse('{"name":"qinjiang","age":3,"sex":"男"}');

注意:很多人搞不清楚 JSON 对象和 JS 对象的区别:(用以下表示来加以区分)

var obj = {a: 'hello',b:'hellob'};
var json = '{"a": "hello","b":"hellob"}'
5.3 Ajax
  • 原生的 js 写法 xhr 异步请求
  • jQuery 封装好的方法 $("#name").ajax("")
  • axios 请求

6、面向对象编程

原型对象

javascript 、Java、c#。。。。注意:在面向对象这块儿,javascript 有些区别!

我们所熟知的面向对象原理:

  • 类:模板,原型对象
  • 对象:具体的实例

在Javascript 这个需要大家换一下思维方式!

原型指向!(不过这是早期的写法,后来在ES6中,出现了class关键字,就不用这个了!)

var Student = {
    name: "qinjiang",
    age: 3,
    run: function () {
        console.log(this.name + " run....");
    }
};


var xiaoming = {
    name: "xiaoming"
};

//原型对象
xiaoming.__proto__ = Student;


var Bird = {
    fly: function () {
        console.log(this.name + " fly....");
    }
};

// 小明的原型 是 Student
xiaoming.__proto__ = Bird;

xiaoming.fly() // 调用继承的方法!
VM2633:20 xiaoming fly....

class 继承:

class关键字,是在 ES6 引入的。
1、定义一个类,属性,方法

// 定义一个学生的类
class Student{
    constructor(name){
        this.name = name;
    }

    hello(){
        alert('hello')
    }
}

var xiaoming = new Student("xiaoming");
var xiaohong = new Student("xiaohong");
xiaoming.hello()

2、继承

<script>
    //ES6 之后=============
    // 定义一个学生的类
    class Student{
        constructor(name){
            this.name = name;
        }

        hello(){
            alert('hello')
        }
    }

class XiaoStudent extends Student{
    constructor(name,grade){
        super(name);
        this.grade = grade;
    }

    myGrade(){
        alert('我是一名小学生')
    }
}

var xiaoming = new Student("xiaoming");
var xiaohong = new XiaoStudent("xiaohong",1);

</script>

本质:查看对象的原型:(可以发现它的继承链~)
在这里插入图片描述

原型链:(看不懂)
__ proto __ :
在这里插入图片描述

7、操作BOM对象(重点)

浏览器介绍

JavaScript 和 浏览器关系?
JavaScript 诞生就是为了能够让他在浏览器中运行!
BOM:浏览器对象模型!

  • IE 6~11
  • Chrome
  • Safari
  • FireFox

三方:

  • QQ浏览器
  • 360浏览器

window 重要

window 代表:浏览器窗口

window.alert(1)
undefined
window.innerHeight
258
window.innerWidth
919
window.outerHeight
994
window.outerWidth
919
// 大家可以调整浏览器窗口试试...

Navigator (不建议使用)
Navigator ,封装了浏览器的信息

navigator.appName
"Netscape"
navigator.appVersion
"5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
navigator.userAgent
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
navigator.platform
"Win32"

注意:大多数时候,我们不会使用 navigator 对象,因为会被人为修改!不建议使用这些属性来判断和编写代码!

screen

代表屏幕尺寸

screen.width
1920 px
screen.height
1080 px

location(重要)

location 代表当前页面的URL信息(的对象)

host:"www.baidu.com"
href:"https://www.baidu.com/"
protocol:"https:"
reload:ƒ reload() // 刷新网页
// 设置新的地址
location.assign('https://blog.kuangstudy.com/')

document (内容:DOM)

document 代表当前的页面,HTML DOM 文档树

document.title
"百度一下,你就知道"
document.title='晓波说'
"晓波说"

获取具体的文档树节点:

<dl id="app">
    <dt>Java</dt>
    <dd>JavaSE</dd>
    <dd>JavaEE</dd>
</dl>

<script>
    var dl = document.getElementById('app');
</script>

获取 cookie :

document.cookie
"__guid=111872281.88375976493059340.1578110638877.133; monitor_count=1"

劫持 cookie 原理:
比如:你通过访问 www.taobao.com 获取了一个cookie保存在了本地,然后你去访问其他的网页,这种网页里的js文件可能如下:

<script src="aa.js"></script>
<!--恶意人员;获取你的cookie上传到他的服务器 -->

服务器端设置cookie:httpOnly。如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性。(同时,服务器的Java代码可以通过别的方式来调取访问用户的cookie信息,这样一来,应该只能调取跟这个网站有关的cookie了,而不是恶意获取所有网站的cookie信息!)

history(不建议使用)

history 代表浏览器的历史记录

history.back() //后退
history.forward() //前进

8、操作DOM对象(重点)

核心:

浏览器网页就是一个 Dom 树形结构!

对Dom节点的操作一般如下:

  • 更新:更新 Dom 节点
  • 遍历dom节点:得到Dom节点
  • 删除:删除一个 Dom节点
  • 添加:添加一个新的节点

重点:要操作一个 Dom 节点,就必须要先获取这个 Dom 节点

获取 Dom 节点:

//对应 css 选择器
var h1 = document.getElementsByTagName('h1');
var p1 = document.getElementById('p1');
var p2 = document.getElementsByClassName('p2');
var father = document.getElementById('father');

var childrens = father.children[index]; //获取父节点下的所有子节点
// father.firstChild
// father.lastChild

注意:这是原生代码,之后我们尽量都使用jQuery();

更新节点:

<div id="id1">

</div>

<script>
	var id1 = document.getElemetnById('id1');
</script>

操作文本:

  • id1.innerText="456" 修改文本的值
  • id1.innerHTML='<strong>123</strong>' 可以解析HTML文本标签

问题:innerText 和 innerHTML 有什么区别?

  • innerText:
    在这里插入图片描述
  • innerHTML:
    在这里插入图片描述

操作 CSS:

id1.style.color = 'yellow'; // 属性使用 字符串 包裹
id1.style.fontSize='20px'; // - 转 驼峰命名问题
id1.style.padding = '2em'

删除节点:

删除节点的步骤:先获取父节点,再通过父节点来删除自己!

<div id="father">
    <h1>标题一</h1>
    <p id="p1">p1</p>
    <p class="p2">p2</p>
</div>
<script>
   var self = document.getElementById('p1');
   var father =  p1.parentElement;
   father.removeChild(self)
    
   // 删除是一个动态的过程;
   father.removeChild(father.children[0])
   father.removeChild(father.children[1])
   father.removeChild(father.children[2])
</script>

注意:删除多个节点的时候,children是在时刻变化的(动态变化的~),删除节点的时候一定要注意!

插入节点:

我们获得了某个 Dom 节点,假设这个 Dom 节点是空的,我们通过 innerHTML 就可以增加一个元素了,但是这个 DOM 节点已经存在元素了,我们就不能这么干了!会产生覆盖。

追加:

<p id="js">JavaScript</p>
<div id="list">
    <p id="se">JavaSE</p>
    <p id="ee">JavaEE</p>
    <p id="me">JavaME</p>
</div>

<script>
    var js = document.getElementById('js');
    var list = document.getElementById('list');
    list.appendChild(js);// 追加到后面
</script>

效果:
在这里插入图片描述

创建一个新的标签,实现插入:

<script>
    var js = document.getElementById('js'); //已经存在的节点
    var list = document.getElementById('list');
    //通过JS 创建一个新的节点
    var newP = document.createElement('p');// 创建一个p标签
    newP.id = 'newP';
    newP.innerText = 'Hello,Kuangshen';
    // 创建一个标签节点
    var myScript = document.createElement('script');
    myScript.setAttribute('type','text/javascript');
    
    // 可以创建一个Style标签
    var myStyle= document.createElement('style'); //创建了一个空style标签 
    myStyle.setAttribute('type','text/css');
    myStyle.innerHTML = 'body{background-color: chartreuse;}'; //设置标签内容

    document.getElementsByTagName('head')[0].appendChild(myStyle)

</script>

insertBefore

var ee = document.getElementById('ee');
var js = document.getElementById('js');
var list = document.getElementById('list');
// 要包含的节点.insertBefore(newNode,targetNode)
list.insertBefore(js,ee);

9、操作表单(验证)

表单是什么? from DOM 数

  • 文本框 text
  • 下拉框 < select >
  • 单选框 radio
  • 多选框 checkbox
  • 隐藏域 hidden
  • 密码框 password
  • …….

表单的目的:提交信息!

获得要提交的信息:

<form action="post">
    <p>
        <span>用户名:</span> <input type="text" id="username">
    </p>

    <!--多选框的值,就是定义好的value -->
    <p>
        <span>性别:</span>
        <input type="radio" name="sex" value="man" id="boy"><input type="radio" name="sex" value="women" id="girl"></p>

</form>

<script>
    var input_text = document.getElementById('username');
    var boy_radio = document.getElementById('boy');
    var girl_radio = document.getElementById('girl');

    // 得到输入框的值
    input_text.value
    // 修改输入框的值
    input_text.value = '123'


    // 对于单选框,多选框等等固定的值,boy_radio.value只能取到当前的值
    boy_radio.checked; //查看返回的结果,是否为true,如果为true,则被选中~
    girl_radio.checked = true; //赋值

</script>

提交表单。md5加密密码,表单优化:


<!--
表单绑定提交事件
οnsubmit= 绑定一个提交检测的函数, true, false
将这个结果返回给表单,使用 onsubmit 接收!
οnsubmit="return aaa()"
-->
<form action="https://www.baidu.com/" method="post" onsubmit="return aaa()">
    <p>
        <span>用户名:</span> <input type="text" id="username" name="username">
    </p>
    <p>
        <span>密码:</span> <input type="password" id="input-password">
    </p>

    <input type="hidden" id="md5-password" name="password"> <!--加这一行的目的是为了非显示加密,因为如果直接对输入的密码框中的内容进行加密,从而改变密码输入框中的内容的话,就会使得用户体验到这种改变,这种隐藏式的方法就可以避免这种情况!-->

    <!--绑定事件 onclick 被点击-->
    <button type="submit">提交</button>
</form>


<script>
    function aaa() {
        alert(1);
        var uname = document.getElementById('username');
        var pwd = document.getElementById('input-password');
        var md5pwd = document.getElementById('md5-password');

        md5pwd.value = md5(pwd.value);
        // 可以校验判断表单内容,true就是通过提交,false,阻止提交
        return true;
    }
</script>

10、jQuery

概念:jQuery 库里面存在大量的包装好的javascript函数。

获取jQuery

在这里插入图片描述

公式:$(选择器).事件(事件函数)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--<script src="https://cdn.bootcss.com/jquery/3.4.1/core.js"></script>-->
    <script src="lib/jquery-3.4.1.js"></script>
</head>
<body>

<a href="" id="test-jquery">点我</a>

<script>

    //选择器就是css的选择器
    $('#test-jquery').click(function () {
        alert('hello,jQuery');
    })

</script>

</body>
</html>

jQuery的选择器:

特点:功能强大,和CSS一样容易便于使用和记忆!

   //原生js,选择器少,麻烦不好记,例如:
   //标签
   document.getElementsByTagName();
   //id
   document.getElementById();
   //类
   document.getElementsByClassName();

   //jQuery  css 中的选择器它全部都能用,例如:
   $('p').click(); //标签选择器
   $('#id1').click(); //id选择器
   $('.class1').click() //class选择器

文档工具站:http://jquery.cuishifeng.cn

事件:

鼠标事件,键盘事件,其他事件!

在这里插入图片描述

示例:获取鼠标的移动坐标!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="lib/jquery-3.4.1.js"></script>
    <style>
        #divMove{
            width: 500px;
            height: 500px;
            border: 1px solid red;
        }
    </style>
</head>
<body>

<!--要求:获取鼠标当前的一个坐标-->
mouse :<span id="mouseMove"></span>
<div id="divMove">
在这里移动鼠标试试
</div>

<script>
    //当网页元素加载完毕之后,响应事件
    $(function () {
        $('#divMove').mousemove(function (e) {
            $('#mouseMove').text('x:'+e.pageX + 'y:'+e.pageY)
        })
    });
</script>


</body>
</html>

效果图:
在这里插入图片描述

操作DOM

节点文本操作:(类似于innerText和innerHTML)

$('#test-ul li[name=python]').text(); //获得值
$('#test-ul li[name=python]').text('设置值'); //设置值
$('#test-ul').html(); //获得值
$('#test-ul').html('<strong>123</strong>'); //设置值

css 的操作:

 $('#test-ul li[name=python]').css({"color","red"})

元素的显示和隐藏:本质display:none

$('#test-ul li[name=python]').show()
$('#test-ul li[name=python]').hide()

娱乐测试:

$(window).width()
$(window).height()
$('#test-ul li[name=python]').toggle(); // toggle是用来切换元素的显示状态(如果它本身是显示的,则切换为隐藏状态,反之...)

未来ajax():

$('#from').ajax()

$.ajax({ url: "test.html", context: document.body, success: function(){
    $(this).addClass("done");
}});

小技巧:

1、如何巩固JS ?( 看jQuery 源码, 看游戏源码!)

2、巩固HTML。CSS (扒网站,全部down下来,然后对应修改看效果~)

推荐:

Layer 弹窗组件
Element-ui

第一篇 JavaScript入门篇 第1章 初步了解JavaScript 1.1 JavaScript是什么 1.2 JavaScript能做什么 1.2.1 表单数据合法性验证 1.2.2 页面特效 1.2.3 交互式菜单 1.2.4 动态页面 1.2.5 数值计算 1.3 JavaScript编程起步 1.3.1 “Hello World!”程序 1.3.2 选择JavaScript脚本编辑器 1.4 如何引入JavaScript脚本代码 1.4.1 通过<script>与</script>标记对引入 1.4.2 通过<script>标记的src属性引入 1.4.3 通过JavaScript伪URL引入 1.4.4 通过HTML文档事件处理程序引入 1.5 嵌入JavaScript脚本代码的位置 1.5.1 在<head>与</head>标记对之间放置 1.5.2 在<body>与</body>标记对之间放置 1.5.3 在两个标记对之间混合放置 1.6 选择合适的浏览器 1.7 处理不支持JavaScript脚本的情况 1.7.1 使用<!——和——>标记对直接屏蔽法 1.7.2 使用<noscript>和</noscript>标记对给出提示信息 1.8 本章小结 1.9 本章习题 第2章 JavaScript编程的语言基础 第3章 JavaScript事件处理 第4章 JavaScript基于对象编程 第5章 文档对象模型(DOM) 第6章 String、Math、Array等数据对象 第7章 Window及相关顶级对象 第8章 Document对象 第9章 HTML元素对象 第二篇 JavaScript进阶篇 第10章 正则表达式 第11章 客户端与服务器端通信 第12章 JavaScript与Ajax技术 第13章 JavaScript错误与异常处理 第三篇 JavaScript实例篇 第14章 JavaScript与插件通信 第15章 JavaScript常用特效收集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值