JavaScript是一门世界上最流行的脚本语言
ECMAScript可以理解为是JavaScript的一个标准,最新版本已经到es6版本了,但是大部分浏览器还只停留在支持es5代码上;开发环境和线上环境版本不一致
内部引入:在
或内部写都可以
Document
外部引入:必须成对出现
alert("hello world!"); //弹窗
注释:与java相同 //xxxxxxxx
/* xxxxxx */
1.定义变量 变量类型var(只有var一种) + 变量名 =变量值;
变量名:不能以数字开头,可以有$和_
2.条件控制 (可以嵌套)
3.严格区分大小写
4.在网页控制台可以写JavaScript代码
5.console.log(score):在浏览器的控制台打印变量!
6.断点:点击下图标记处,重新刷新后会在断点处停止运行,与idea调试类似
7.Appliction:
8.浏览器必备调试(F12):
数值、文本、图形、音频、视频......
1、js不区分小数和整数,统一用Number
① 123 //整数123
② 123.1 //浮点数123.1
③ 1.123e3 //科学计数法
④ -99 //负数
⑤ NaN // not a number
⑥ Infinity //表示无限大
2、字符串
"abc" 'abc'
3、布尔值
true 、false
4、逻辑运算
与:&& 两个都为真,结果为真
或:|| 一个为真,结果为真
非:! 真即假,假即真
5、比较运算符
赋值:=
等于(类型不一样,值一样也会判断为true):== 例:1 "1" 坚持不要使用==比较
绝对等于(类型一样,值一样,结果为true):===
特殊:NaN === NaN,这个与所有的数值都不相等,包括自己
只能通过isNaN(NaN)来判断这个数是否是NaN
浮点数问题:有精度的损失,尽量避免使用浮点数进行运算。
6、空指针null 、undefined
null:为空
undefined:未定义
7、数组(用中括号括起来[ ]):
java的数组必须是一系列相同类型的对象,js不需要这样
取数组下标,如果越界了,就会undefined
8、对象(用大括号括起来{ }):
每个属性之间用逗号隔开,最后一个不需要加逗号
取对象的值:
‘use strict’; 严格检查模式,预防JavaScript的随意性导致产生的一些问题,必须写在JavaScript的第一行!
局部变量建议都使用let去定义(ES6语法)
1、正常字符串我们使用单引号或双引号包裹
2、注意转义字符 :“ \ ” 都要在字符串包裹内
\'
\n
\t
\u4e2d:中 Unicode字符:\u####
Ascii字符:"\x41" A
3、多行字符串编写 tab上面esc下面 ` `(piao)
4、模板字符串
5、字符串长度:str.length
6、字符串的可变性:不可变
可以通过下标打印字符串内任意的字符
7、大小写转换
//这里是方法,不是属性
大写:student.toUpperCase();
小写:student.toLowerCase();
8、student.indexOf(' '):获取下标
9、substring
student.substring(1,3); //与 [ ) 相同,含头不含尾 [1,3)
student.substring(1); //从第一个字符串截取到最后一个字符串
Array可以包含任意的数据类型
var arr=[1,2,3,4,5,6]; // 通过下标取值和赋值
arr[0]
arr[0]=1;
1、长度
arr.length;
注意:假如给arr.length赋值,数组大小就会发生变化,如果赋值过小,元素就会丢失
2、indexOf,通过元素获得下标索引
arr = [1,2];
arr.indexOf(2);
下标:1
注意:字符串的 " 1 "和数字1是不同的
3、slice() 截取数组的一部分,返回一个新的数组,类似于String中的substring,
4、push、pop
push( ):压入尾部
pop( ):弹出尾部的一个元素
5、unshift( ) 、shift( )
unshift( ):压入头部
shift( ):弹出头部的一个元素
6、排序:sort( )
7、元素反转:reverse( )
8、concat( )
注意:concat( )并没有修改数组,只是会返回一个新的数组
9、连接符:join( )
打印拼接数组,使用特定的字符串连接
10、多维数组
数组:存储数据(如何存、如何取)
若干个键值对
var 对象名 = {
属性名:属性值,
属性名:属性值,
属性名:属性值
}
//定义了一个person对象,它有四个属性
var person={
name:"kuangshen",
age:3,
email:"[email protected]",
score:0
}
js中对象,{......}表示一个对象,键值对描述属性 xxx : xxx,多个属性之间使用逗号隔开,最后一个属性不加逗号
JavaScript中的所有的键都是字符串,值是任意对象
1、对象赋值
2、使用一个不存在的对象属性不会报错
3、动态的删减属性
通过delete删除对象的属性
4、动态的添加
直接给新的属性添加值即可
5、判断属性值是否在这个对象中
' age ' in person;
true;
' toString ' in person; //继承
true
6、判断一个属性是否是这个对象自身拥有的 hasOwnProperty
if判断
var age = 3;
if(age > 3){
alert("haha");
}else{
alert("kuwa");
}
while循环,避免程序死循环
var age = 3;
while(age < 100){
age = age + 1;
console.log(age);
}
do{
age = age + 1;
console.log(age);
}while((age < 100))
for循环
for(let i = 0; i < 100; i++){
console.log(i);
}
forEach循环
var age = [1,2,3,4,5,2,6,4,7,4,9];
// 函数
age.forEach(function (value){
console.log(value)
} )
for...in
var age = [1,2,3,4,5,2,6,4,7,4,9];
// 函数
/* for( Type str: eL) */
//for(var index in object){ }
for( var num in age){
console.log(age[num])
}
Map:
var map = new Map([ ['tom',100],['jack',90],['haha',80] ]);
var name = map.get('tom');
map.set('admin',125);
map.delete('tom'); //删除
console.log(name);
Set:无序不重复的集合
var set = new Set([1,2,3,4,5,1,1,1]) //Set可以去重
set.add(2); //添加
set.delete(1); //删除
console.log(set.has(3)); //是否包含某个元素
使用iterator来遍历迭代我们Map、Set
var arr = [3,4,5];
for (let x in arr){ //打印的是下标
console.log(x);
}
for...in 与 for...of
var arr = [3,4,5];
for (let x of arr){ //打印具体的值
console.log(x);
}
//遍历Map只能用for...in
var map = new Map([ ['tom',100],['jack',90],['haha',80] ]);
for(var x of map){
console.log(x);
}
//遍历Set
var set = new Set([5,6,7]);
for(let x of set){
console.log(x);
}
绝对值函数
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
参数问题:js可以传任意一个参数,也可以不传递参数
参数进来是否存在的问题? 假设不存在参数,如何让规避?
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包含所有的参数,我们有时候想使用多余的参数来进行附加操作,需要排除已有的参数
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参数只能写在最后面,必须用 ... 标识。
在js中,var 定义变量实际是有作用域的。
假设在函数体中声明,则在函数体外不可能使用(非要想实现,可以研究 闭包 )
function qj() {
var x = 1;
x = x + 1;
}
x = x + 2; //Uncaught ReferenceError: x is not defined
如果两个函数使用了相同的变量名,只要在函数内部,就不冲突
function qj() {
var x = 1;
x = x + 1;
}
function qj2() {
var x = 1;
x = x + 1;
}
内部函数可以访问外部函数的成员,反之则不行
function qj() {
var x = 1;
x = x + 1;
function qj2() {
var y = x + 1; //2
}
var z = y + 1;
}
假设,内部函数变量和外部函数的变量重名,函数查找变量从自身函数开始,由内向外查找;假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量(就近原则)
function qj() {
var x = 1;
function qj2() {
var x = 'A';
console.log('inner'+x); //innerA
}
console.log('outer'+x); //outer
qj2();
}
qj()
提升变量的作用域
function qj() {
var x = 'x' + y;
console.log(x);
var y = 'y';
}
结果:xundefined
说明:JavaScript执行引擎自动提升了y的声明但是不会提升变量y的赋值
function qj2() {
var y;
var x = 'x' + y;
console.log(x);
y = 'y';
}
这个是在JavaScript建立之初就存在的特性,养成规范:所有的变量定义都放在函数的头部,便于代码维护
//全局变量
var x = 1;
function f(){
console.log(x);
}
f();
console.log(x);
全局对象 window
var x = 'xxx';
alert(x);
alert(window.x); //默认所有的全局变量,都会自动绑定在window对象下
window.alert(x);
window.alert(window.x);
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
规范:由于我们所有的全局变量都会绑定到我们的 window 上,如果不同的js文件使用了相同的全局变量,就冲突了,那么如何减少冲突呢?
定义一个唯一全局变量
//唯一全局变量 var KuangApp = { }; //定义全局变量 KuangApp.name = 'kuangshen'; KuangApp.add = function(a,b){ return a + b; }
把自己的代码全部放图自己定义的唯一空间名字中,降低全局命名冲突的问题
jQuery:简化符号 $( )
function aaa( ){
for(var i = 0; i < 100; i++){
console.log(i);
}
console.log(i+1); //问题:i 出了这个作用域还可以使用
}
ES6 let 关键字,解决局部作用域冲突问题
建议打击都使用 let 去定义局部作用的变量;
function aaa( ){
for(let i = 0; i < 100; i++){
console.log(i);
}
console.log(i+1); //问题:i 出了这个作用域还可以使用
}
在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量,建议不要修改这样的值
var PI = '3.14';
console.log(PI);
PI = '213'; //可以改变这个值
console.log(PI);
在ES6引入了常量关键字 const
const PI = '3.14'; //只读变量
console.log(PI);
PI = '213';
console.log(PI);
定义方法:
方法就是把函数放在对象的里面,对象只有两个东西:属性和方法
var kuangshen = {
name:'qj',
birth:2020,
//方法
age: function(){
// 今年 - 出生的年
var now = new Date().getFullYear();
return now - this.birth;
}
}
调用方法一定要带括号( )
kuangshen.age( )
this代表什么?
function getAge(){
// 今年 - 出生的年
var now = new Date().getFullYear();
return now - this.birth;
}
var kuangshen = {
name:'qj',
birth:2020,
//方法
age: getAge
}
this是无法指向的,是默认指向调用它的那个对象;
apply:在js中可以控制this的指向
function getAge(){
// 今年 - 出生的年
var now = new Date().getFullYear();
return now - this.birth;
}
var kuangshen = {
name:'qj',
birth:2020,
//方法
age: getAge
};
getAge.apply(kuangshen,[]); //无参,this:指向了kuangshen,参数为空
标准对象:
Date
基本使用:
var now = new Date(); //Tue Jul 12 2022 15:09:24 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(1657609764002)) //时间戳转为时间
转换:
now = new Date(1657609764002);
Tue Jul 12 2022 15:09:24 GMT+0800 (中国标准时间)
now.toLocaleString(); //注意,调用是一个方法,不是一个属性
'2022/7/12 15:09:24'
now.toGMTString();
'Tue, 12 Jul 2022 07:09:24 GMT'
json是什么?
在JavaScript一切皆为对象,任何JavaScript支持的类型都可以用JSON来表示;number、string...
格式:
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"}';
JavaScript、java、c#... 面向对象 JavaScript有点区别
类:模板 原型对象
对象:具体的实例
在JavaScript这个需要大家换一下思维方式
原型:
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 ...");
}
};
//xiaoming的原型是student
xiaoming._proto_ = Bird;
1、定义一个类、属性、方法
//ES6之后
class Student{
constructor(name){
this.name = name;
}
hello(){
alert('Hello');
}
}
var xiaoming = new Student("xiaoming");
var xiaohong = new Student("xiaohong");
//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);
本质:查看对象原型
原型链:
_proto_:
浏览器介绍
JavaScript和浏览器关系?
JavaScript 诞生就是为了能够让他在浏览器中运行
BOM:浏览器对象模型
三方
window
window 代表浏览器窗口 //可以调整浏览器窗口试试
Navigator (不建议使用)
封装了浏览器的信息
大多数时候,我们不会使用 navigator 对象,因为会被人为修改
不建议使用这些属性来判断和编写代码
screen
代表屏幕的尺寸
location
代表当前页面的URL信息
host: "www.baidu.com" 主机
href: "https://www.baidu.com/" 当前指向的位置
protocol: "https:" 协议
reload: ƒ reload() 重新加载(刷新网页)
location.assign(' 网址 ')
document
代表当前的页面,HTML DOM文档树
获取具体的文档树节点
- Java
- JavaSE
- JavaEE
获取cookie
document.cookie
劫持cookie原理
www.taobao.com
服务器端可以设置:cookie:httpOnly
history:代表浏览器的历史记录 (不建议使用)
history.back( ) //后退
history.forward( ) //前进
DOM:文档对象模型
核心:
浏览器网页就是一个 Dom 树形结构
要操作一个Dom节点,就必须要先获得这个Dom节点!
标题一
p1
p2
获得dom节点
这是原生代码,之后我们尽量都使用jQuery( );
标题一
p1
p2
更新节点
id1.innerText = '456'; //修改文本的值
id1.innerHTML = ' 123 ' //可以解析HTML文本标签
id1.innerText = ' 123 '
操作jS
id1.style.color = 'red'; //属性使用 字符串 包裹
id1.style.fontSize = '20px' //下划线转驼峰命名问题
id1.style.padding = '20px'
删除节点
删除节点的步骤:先获取父节点,再通过父节点删除自己
标题一
p1
p2
注意:删除多个节点的时候,Children 属性是在时刻变化的,删除节点的时候一定要注意!
插入节点
JavaScript
JavaSE
JavaEE
JavaME
insertBefore
jQuery API 中文文档 | jQuery API 中文在线手册 | jquery api 下载 | jquery api chmjQuery API 1.x - 3.x 中文在线版,jQuery API 中文最新版,jQuery 是一个兼容多浏览器的 JavasSript 框架,核心理念是 - write less, do more。jQuery API 中文文档(适用jQuery 1.0 - jQuery 3.x).https://jquery.cuishifeng.cn/
表单是什么? form DOM树
表单的目的:提交信息
获得要提交的信息
JavaScript
jQuery库,里面存在大量的JavaScript函数
1、获取jQuery:
jQueryjQuery: The Write Less, Do More, JavaScript Libraryhttps://jquery.com/
公式: $(selector).action()
Document
点我
//原生js,选择器少,麻烦不好记
//标签
document.getElementsByTagName()
//id
document.getElementById
//类
document.getElementsByClassName()
//jQuery
$('p').click //标签选择器
$('#id1').click //id选择器
$('.class1').click //class选择器
文档工具站:jQuery API 中文文档 | jQuery API 中文在线手册 | jquery api 下载 | jquery api chm
鼠标事件、键盘事件、其他事件
Document
mouse:
在这里移动鼠标试试
节点文本操作
$('#test-ul li[name=python]').text(); //获得值
$('#test-ul li[name=python]').text('设置值'); //设置值
$('#test-ul li[name=python]').html(); //获得值
$('#test-ul li[name=python]').html(' 123 '); //设置值
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();
前端代码:
打开审查元素,删去不必要的东西(Elements内删去之后网页不变)
docsify
如何巩固js:看jQuery源码,看游戏源码
如何巩固HTML,CSS:扒网站