JavaScript学习笔记
1、什么是JavaScript
JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式、声明式、函数式编程范式。 [1]
2、快速入门
2.1、引入JavaScript
1、内部标签
<script>
//...
<script>
2、外部引入
abs.js
2.2、基本语法入门
相似于java
<script>
// 1.定义变量 变量类型 变量名 = 变量值;
var num = 1;
var name = "橙宝";
alert(num);
// 2.条件控制
if(2>1){
alert("true");
}
// console.log(num) 在浏览器控制台打印变量!
</script>
2.3、数据类型
数值,文本,图形,音频,视频....
number
js不区分小数和整数,number
123//整数123
123.1//浮点数
1.123e3//科学计数法
-99 //负数
NaN //not a number
Infinity //表示无限大
字符串
'abc' "abc"
boolean
true , false
逻辑运算
&& 两个都为真,则结果为真
|| 一个为真,则结果为真
! 假为真
比较运算符
=
== 等于(类型不一样值一样,判断为true)
== 绝对等于(类型一样,值一样, 结果为true)
这是JS的一个缺陷,坚持不要使用==比较
须知:
- NaN===NaN , 这个与所有数值都不相等,包括自己
- 只能通过isNaN(NaN)来判断这个数是否为NaN
浮点数问题:
console.log((1/3) === (1-2/3));
尽量避免使用浮点数进行运算,存在精度问题!
console.log(Math.abs(1/3-(1-2/3))<0.00001);
null 和 undefined
- null 空
- undefined 未定义
数组
java的数组必须是相同类型的对象,javascript不需要
// 保证代码的可读性, 尽量用[]
var arr = [1,2,3,4,5,'hello',null,true];
new array(1,2,3,4,5);
取数组下标,如果越界了, 就会
undefined
对象
对象是大括号, 数组是中括号
每个属性之间使用 , 隔开,最后一个不需要
var person = {
name: "橙宝" ,
age: 3,
tags: ['js','java','web','...']
}
取对象的值
person.name
person.age
2.4、严格检查模式
<!--
前提:IDEA 需要支持ES 6
'use strict'; 严格检查模式,语法JavaScript的随意性导致产生一些问题
需要写在第一行
局部变量都建议使用let去定义~
-->
<script>
'use strict';
// 全局变量
let i = 1;
//ES 6 let
</script>
3、数据类型
3.1、字符串
- 正常字符串我们使用单引号,或者双引号包裹
- 主要转义字符\
\'
\n
\t
\u4e2d unicode字符
\x41 ASCII字符
3、多行字符串编写
//tab
var msg = `
122
hello
strict
`
4、模板字符串
let name = "橙宝";
let age = 3;
var msg = `你好, ${name} `
5、字符串长度
var student = 'student';
console.log(student.length);
7
str.length
6、字符串的可变性,不可变
7、大小写转换
//注意这里是方法不是属性
console.log(student.toUpperCase());
console.log(student.toLowerCase());
8、substring()
index()
3.2、数组
Array可以包含任何类型的数据
new arr (1,2,3,'22','hello');
//以下都会方法
unshift() : 压入到头部
shift() : 弹出头部的一个元素
push() : 压入到尾部
pop() : 弹出尾部元素
sort() : 排序
reverse() : 元素反转
concat() : 链接数组 //注意concat 并没有修改数组,只是会返回一个新的数组
join() : 打印拼接字符串,使用特定的字符串连接
多维数组
3.3、对象
若干个键值对
var 对象名 = {
属性名 : 属性值,
属性名 : 属性值,
属性名 : 属性值
}
'use strict';
var person = {
name : "橙宝,
age : 19,
email : "1845472368@qq.com",
score : 20
}
JS中对象,{......}表示一个对象,键值对描述属性xxxx: xxxx,多个属性之间使用逗号隔开,最后一个属性不加逗号!
1、对象赋值
2、使用一个不存在的对象不会报错! undefined
3、动态的删减属性, 通过delete动态的删除属性
delete person.name
true
4、动态的添加 , 直接给新的对象赋值即可
person.haha = "haha";
5、判断属性值是否在这个对象中!'xxx' in xx
'age' in person
true
3.4、流程控制
跟java差不多,略
3.5、Map 和 Set
'use strict';
var names = ['tom','jack','cheng'];
var scores = ['80','90','85'];
var map = new Map([['tom',80],['jack',90],['cheng',85]]);
var name = map.get('tom');
console.log(name);
map.set('admin',123456);
map.delete('tom');
Set: 无序不重复的集合
3.6、iterator
遍历map
for (let x of map){
console.log(x);
}
4、函数
匿名函数
var abs = function(x){
if(x<0)
return x;
else
return -x;
}
4.1、变量的作用域
在 ES6 中,提供了 let 关键字和 const 关键字。
let 的声明方式与 var 相同,用 let 来代替 var 来声明变量,就可以把变量限制在当前代码块中。
使用 const 声明的是常量,其值一旦被设定便不可被更改。
let 允许你声明一个作用域被限制在块级中的变量、语句或者表达式。与var关键字不同的是,它声明的变量只能是全局或者整个函数块的。
4.2、方法
方法
方法就是把函数放在对象的里面,对象只有两个对象:属性和方法
<script>
'use strict'
let cheng = {
name : 'ch',
birth : 2000,
age: function () {
let now = new Date().getFullYear();
return now - this.birth;
}
}
</script>
//属性
cheng.name
//方法一定要带()
cheng.age()
apply
在js中可以控制this的指向
function getAge(){
let now = new Date().getFullYear();
return now - this.birth;
}
let kuangshen = {
name : 'ch',
birth : 2000,
age: getAge
};
let xiaoming = {
name : 'xm',
birth : 2001,
age : getAge
};
getAge.apply(xiaoming,[]);
5、内部对象
标准对象
typeof 123
"number"
typeof true
"boolean"
typeof NaN
"number"
typeof undefined
"undefined"
typeof Map
"function"
5.1、Date
基本使用
'use strict'
var now = new Date();
now.getFullYear();//年
now.getMonth();//月
now.getDate();//日
now.getDay();//星期几
now.getHours();//时
now.getMinutes();//分
now.getSeconds();//秒
now.getTime(); //时间戳
5.2、JSON
JSON是什么
- JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
- 它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
- 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在JavaScript中一切皆为对象,任何Js支持的类型,都可以用JSON来表示;
格式:
- 对象都用{}
- 数组都用[]
- 所有键值对 都是用key : value
JSON 字符串 和 JS对象的转化
var user = {
name : "cheng",
age : 19,
sex : '男'
}
//对象转换为JSON字符串
var jsonUser = JSON.stringify(user);
//json 字符串转化为对象
var obj = JSON.parse('{"name":"cheng","age":19,"sex":"男"}');
var obj = {a:'hello' , b:'hellow'};
var json = '{"a" : "hello" , "b" : "hellow"}';
5.3 Ajax
- 原生的js写法
- jQuey 封装好的方法 ¥
6、面向对象编程
6.1、什么是面向对象
javascript,c#,java....面向对象;javascript有些区别
- 类 : 模板 原型对象
- 对象 : 具体的实例
在javascript这个需要大家换一下思路
原型对象
var user = {
name : "cheng",
age : 19,
sex : '男',
run : function () {
console.log(this.name + 'run...');
}
};
var xiaoming = {
name : 'xiaoming'
};
//原型对象
xiaoming.__proto__=user;
var bird = {
fly : function () {
console.log(this.name + " 飞");
}
};
//小明的原型对象是 user
xiaoming.__proto__ = bird;
function student(name) {
this.name = name;
}
//给student新增一个方法
student.prototype.hello = function () {
alert('hello');
};
class 继承
class 关键字是在ES 6引入的
1.定义一个类,属性,方法
//ES 6之后
//定义一个学生类
class student{
constructor(name){
this.name = name;
}
hello(){
alert('hello');
}
}
var xiaoming = new student('xiaoming');
var xiaohong = new student('xiaohong');
xiaoming.hello();
2、继承
<script>
function student(name) {
this.name = name;
}
//给student新增一个方法
student.prototype.hello = function () {
alert('hello');
};
//ES 6之后
//定义一个学生类
class student{
constructor(name){
this.name = name;
}
hello(){
alert('hello');
}
}
class xiao extends student{
constructor(name,grade){
super(name);
this.grade = grade;
}
myGrade(){
alert("我是小学生,啦啦");
}
}
var xiaoming = new student('xiaoming');
var xiaohong = new xiao('xiaohong',1);
</script>
本质:查看对象原型
5SRV$3S(_{X(5J[UW$CU{D.png)
原型链
proto:

7、操作BOM对象
浏览器介绍
javascricpt 和 浏览器关系:
JavaScript 诞生就是为了让他能够在浏览器中运行!
BOM:浏览器对象模型
- IE 6~11
- Chrome
- Safari
- FireFox
- Opera
三方
- QQ浏览器
- 360浏览器
操作window对象
window 代表 浏览器窗口
window.alert("111");
undefined
window.innerHeight
85
window.innerWidth
731
window.outerHeight
760
window.outerWidth
1280
navigator (不建议使用)
navigator.appName
"Netscape"
navigator.appVersion
"5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
navigator.userAgent
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
navigator.platform
"Win32"
大多数时候,我们不会使用navigator对象,因为会被人为修改!
不建议使用这些属性来判断和编写代码
screen
代表屏幕尺寸
screen.height
800
screen.width
1280
location (重要)
location 代表当前页面的URL信息
host: "www.baidu.com"
href: "https://www.baidu.com/?tn=62095104_43_oem_dg"
protocol: "https:"
reload: ƒ reload() //刷新网页
// 设置新的地址
location.assign("https://www.bilibili.com/video/BV1JJ41177di?p=19&spm_id_from=pageDriver");
document (文本内容)
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
"__gads=ID=fc5cd07727bdc8f7:T=1610499688:S=ALNI_MY6bhf8LvvDFhcQiiOVwQktp4TEkw; UM_distinctid=179e0a54b90342-05ce38aab8346-f7f1939-fa000-179e0a54b91d9c; CNZZDATA1277383466=1969413449-1622969696-https%253A%252F%252Fwww.baidu.com%252F%7C1622969696; CNZZDATA1263394805=322497688-1624428160-https%253A%252F%252Fwww.baidu.com%252F%7C1624428160; _ga_4CQQXWHK3C=GS1.1.1625745518.1.1.1625745525.0; _ga=GA1.2.702379678.1610499688; CNZZDATA1279964619=1989557582-1625749557-https%253A%252F%252Fwww.cnblogs.com%252F%7C1625749557; _gid=GA1.2.520179618.1625998871"
劫持cookie原理
www.taobao.com
<script src="aa.js">
</script>
<!--恶意人员;获取你的cookie上传到他的服务器-->
服务器端可以设置cookie : httpOnly
history
history 代表浏览器的历史记录
history.back() //后退
history.forward() //前进
8、操作DOM对象 (重点)
DOM: 文档对象模型
浏览器网页就是一个Dom树形结构!
- 更新:更新Dom节点
- 变量Dom节点:得到Dom节点
- 删除:删除一个Dom节点
- 添加:添加一个新的节点
想操作一个Dom节点,就必须要先获得这个Dom节点
获得Dom节点
var h1 = document.getElementsByTagName('h1'); var p1 = document.getElementById('p1'); var p2 = document.getElementsByClassName('p2'); var father = document.getElementById('father'); var children = father.children;这是原生代码,之后我们尽量都使用jQuery
更新节点
<div id="id1">123</div>
<script>
var div = document.getElementById('id1');
</script>
操作文本
div.innerText = '123'修改文本的值div.innerHTML = '<strong>123</strong>'
操作JS
div.style.color = ' red '
" red " //属性使用 字符串包裹
div.style.fontSize = '200px'
"200px" //驼峰命名
div.style.padding = '20px'
"20px"
删除节点
删除节点的步骤:先获取父节点,在通过父节点删除中间
<div id="father">
<h1>标题1</h1>
<p id="p1">p1</p>
<p class="p2">p2</p>
</div>
<script>
var self = document.getElementById('p1');
var father = self.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="je">JavaSE</p>
<div id="list">
<p id="jee">javaEE</p>
<p id="jme">javaME</p>
<p id="js">js</p>
</div>
<script>
var div = document.getElementById('list');
var je = document.getElementById('je');
</script>
创建一个新的标签,实现插入
<script>
var div = document.getElementById('list');
var je = document.getElementById('je');
//通过JS 创建一个新的节点
var newP = document.createElement('p');//创建一个P标签
newP.id = 'newP';
newP.innerText = "hellow chengbao";
//创建一个标签节点
var myScript = document.createElement('script');
myScript.setAttribute('type','text/javascript');
var body = document.getElementsByTagName('body');
//可以创建一个style标签
var myStyle = document.createElement('style');
myStyle.setAttribute('type','text/css');
myStyle.innerHTML = 'body{background: azure;}';
document.getElementsByTagName('head')[0].appendChild(myStyle);
</script>
insertBefore
var div = document.getElementById('list');
var jme = document.getElementById('jme');
var jee = document.getElementById('jee');
//要包含的节点.insertBefore(newNode,targetNode);
div.insertBefore(je,jme);
9、操作表达(验证)
表达是什么 form DOM树
- 文本框 text
- 下拉框

浙公网安备 33010602011771号