JavaScript

JavaScript文档下载

1.JavaScript

1.1 概述

JavaScript是一门使用广泛的前端语言

2. 快速入门

2.1 引入Javascript

1.内部标签

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

2.外部引入

2.2 数据类型

变量

所有变量都是用var定义即可

js不区分小数和整数 Number

123  ///123
123.1 ///123.1
1.123e3 ///1123
-99  //负数
NaN  ///not a number
Infinity  //表示无限大

字符串

‘abc’ “abc”

布尔值

逻辑运算

&& 与 || 或 ! 非

比较运算符

= == 类型不一样值一样也会为真 === 绝对等于

NaN === NaN fase 这个与所有的数值都不相等 包括自己 isNaN(NaN) true

console.log((1/3) === (1-2/3))
console.log(Math.abs(1/3-(1-(2/3)))<0.00000001)

null 和 undifined

null 为空 undefined 为未定义

数组

一系列相同类型的数值

var arr = [1,2,3,4,"Hello", null, true]//尽量使用这种方式
new Array(1,2,3,'Hello')
数组下标越界 浏览器会提示undefined
对象是大括号,数组是中括号

对象

//Person person = new Person(1,2,3,4,5);
var person = {
	name: "qianqing",
	age: 3,
	tags: ['js','java','web']
}

2.3 严格检查模式

局部变量用let定义 ES6

在前面加入“user strict" 严格检查模式,预防JavaScript的随意性导致产生的一些问题

局部变量建议都使用let来定义~ 必须写在JavaScript的第一行

2.4 字符串

正常的字符串我们使用单引号或双引号包裹 ‘’ “”

转义字符的使用\

console.log('a\'nb')
\n 	\t  \u4e2d  \u#### unicode字符
\x4l   ASCII字符

多行字符串编写

var msg = `
	'hello
	world
	你好'
`

let name = "qianjiang";
let age = 3;
let msg = `你好呀!${name},${age}岁`
字符串不可变
str.length  字符串长度
str.toUpperCase 转换成大写
str.toLowerCase 转换成小写
str.indexOf 获取指定的下标  指定字符出现的位置
str.subString  截取字符串有起始下标和终止下标    [)

2.5 数组

Array可以包含任何的数据类型

arr.length 加入给arr.length赋值 数组大小就会发生改变 如果赋值过小 元素就会丢失

不能给数组中间增加元素

arr.indexOf(2)
arr.slice()   截取数组的一部分 返回一个新数组  类似于String的subString
arr.push  arr.pop  性质相当于栈  往队尾增加元素 在队尾删除元素
arr.unshift 往头部增加元素
arr.shift去掉头部的元素  往头部增加删除元素
arr.sort  排序数组中的元素
arr.reverse  反转数组
arr.concat 拼接数组  
arr.join('-')  使用特定字符串连接数组

多维数组

存储数组如何存 如何取

2.6 对象

var person = {
    属性名: 属性值,
    属性名: 属性值,
}
delete person.name
person.haha = "hahaha"
person.hasOwnProperty('age')

js中对象,{…}表示一个对象,键值对描述属性:xxxx:xxxx , 多个属性之间使用逗号隔开,最后一个属性不加逗号!

使用一个不存在的对象属性不会报错。

动态删减属性 person.name = “qianjiang”

动态添加属性,直接给新的属性添加值

判断属性值是否在这个方法中 xxxxx in xxxxx

2.7 流程控制

if else 条件判断

while 循环 避免写死循环

for 循环

foreach 的使用

var age = [12,12,112, 12,121 ,12,121212,212]
age.forEach(function (value){
            console.log(value);
        })
for(var num in age){
    console.log(age[num]);
}
fpr(var num of age){
    console.log(num);
}

2.8 Map 和 Set

 let map = new Map([['tom',100],['jerry', 90],['haha',80]]);
        let name = map.get('tom');
        console.log(name);
        map.set('admin',123456);//新增或修改
		map.delete("tom");//删除

set集合 满足不重复性

var set = new Set([3,1,1,1,1,1])
set.add(2)//添加
set.delete(1)//删除
console.log(set.has(3))  //true

set.iterator 使用iterator迭代遍历map 和set

let map = new Map([['tom',100],['jerry', 90],['haha',80],['nucy',84],['nancy',92]]);
let set = new Set([1,3,2,4,6,5,7,9,10]);
let it = map[Symbol.iterator]();
for (let x of map) {
    console.log(x);
}
let it1 = set[Symbol.iterator]();
for (let i = 0; i < set.size ; i++) {
    console.log(it1.next());
}

3. 函数及面向对象

3.1 定义函数

//定义绝对值函数,一旦执行return方法即结束
//如果没有执行return,函数执行完也会返回结果,结果为undefined
function abs(x){
    if(x >= 0)
        return x;
    else{
        return -x;
    }
}

var abs = function(x){
    //手动抛出异常
    if(typeof x != 'number'){
        throw "Not a number!";
    }
    //函数执行语句
    //function(x){} 这是一个匿名函数,但是可以把结果赋值给abs,通过abs就可以调用函数
}

参数问题 JavaScript可以传递任意一个参数 也可以不传入参数

//arguments 是一个免费赠送的关键字,代表传递进来的所有参数,是一个数组
var abs = function(x){
    console.log("x=>"+x);
    for(let i=0; i<arguments.length;i++){
        console.log(arguments[i]);
    }
}
//arguments包含所有参数,我们有时后想使用多余的参数来进行附加操作,需排除已有的参数
//rest 获取除了已经定义所有参数之外的参数
function demo(a,b,...rest){
    console.log("a=>"+a);
    console.log("b=>"+b);
    console.log(rest);
}//rest参数只能写在最后面,必须以...标识

3.2 变量作用域

在JavaScript中,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 = '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);
    }
    qj2();
    console.log('outer'+x);
}
qj();//假设在javaScript中函数查找变量从自身函数开始 由内向外查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量。

提升变量作用域

function qj(){
    var x = "x" + y;//y undefined
    console.log(x);
    var y = 'y';
} //js执行引擎自动提升了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实际上只有一个全局作用域,任何变量(函数也可视为变量),假设没有函数作用范围内找到就会向外查找,如果在全局作用域都没有找到,就会报错ReferenceError

规范

由于我们所有的全局变量都会绑定到我们的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++){//for(let i = 0;i < 100; i++){
        console.log(i);
    }
    console.log(i+1);//使用let  UnCaught ReferenceError: i is not defined
}

建议大家都是用let定义局部作用域的变量

常量const

//ES6之前,只能使用大写字母来定义常量,建议不要修改
var PI = '3.14';
console.log(PI);
PI = '213';
console.log(PI);


const PI = '3.14';//只读变量,修改会出错

3.3 方法

var sunset = {
    name: '秦将',
    birth: 2020,
    age: function(){
        var now = new Date().getFullYear();
        return now - this.birth;
    }
}
//属性 sunset.name
//方法 sunset.age() 一定要带()
function getAge(){
    var now = new Date().getFullYear();
        return now - this.birth;//this是无法指向的,他是默认指向调用它的那个对象
}
var sunset = {
    name: '秦将',
    birth: 2020,
    age: getAge
}

在js中可以控制this的指向 ==>apply的用法

getAge.apply(sunset,[]);//this指向sunset,参数为空

4. 常用对象

标准对象

typeof 123   "number"
typeof '123'  "String"
typeof true   "boolean"
typeof []   "object"
typeof {}  "object"
typeof Math.abs  "function"
typeof undefined  "undefined"

4.1 Date

		'use strict';
        let now = new Date();
        console.log(now); //Tue Mar 02 2021 18:18:44 GMT+0800 (中国标准时间)
        console.log(now.getFullYear());
        console.log(now.getMonth());
        console.log(now.getDate());//日
        console.log(now.getDay());//星期几
        console.log(now.getHours());
        console.log(now.getMinutes());
        console.log(now.getSeconds());
        console.log(now.getTime());//时间戳

        console.log(new Date(1614680477835));
console.log(new Date(1614680477835))
VM124:1 Tue Mar 02 2021 18:21:17 GMT+0800 (中国标准时间)

now.toLocaleString()
"2021/3/2 下午6:21:17"

4.2 Json

json是什么 轻量级的数据交换格式,早期所有数据传输习惯使用XML格式!

在Javascript 一切皆为对象,任何js支持的类型都可以用json来代替

格式: 对象都用大括号,数组list都用中括号, 所有的键值对都使用 key:value

var user = {
            name: "qianjiang",
            age: 13,
            sex: "男"
        }
        //对象转化为json对象
        console.log(JSON.stringify(user));
        console.log(JSON.parse('{"name":"qianjiang","age":13,"sex":"男"}'));//将json字符串转化为对象

JSON和js的区别
var obj = {a: 'hello', b:'hellob'};
var json = '{"a": "hello", "b": "hellob"}';

4.3 Ajax

原生的js写法 xhr异步请求

jQuery 封装好的 方法 $("#name").ajax("")

axios 请求

5.面向对象编程

5.1什么是面向对象

JavaScript、java、C# 面向对象:javascript有些区别!

类:模板

对象: 类的实例

 var user = {
    name: "qianjiang",
    age: 13,
    run : function () {
        console.log(this.name + "running...");
    }
 }
 var xiaoming = {
    name: "xiaoming"
}
xiaoming.__proto__ = user;//把小明原型指向user
xiaoming.run();
  1. class继承

class 关键字是在ES6引入的

  function Student(name){
            this.name = name;
        };
        Student.prototype.hello = function(){
            alert("hello");
        };

        //ES6之后
        class Student{
            constructor(name) {
                this.name = name;
            }
            hello(){
                alert('hello');
            }
        }
  1. 继承
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);
xiaoming.hello();

xiaohong.myGrade();

6. 操作BOM对象

JavaScript和浏览器的关系 JavaScript的诞生就是为了让他能在浏览器中运行

BOM:浏览器对象模型 IE 6~11 Chrome Safari FireFox

window 对象 代表浏览器窗口

window.alert()

window.innerHeight() window.outerWidth()

window.innerWidth() window.outerWidth() //可以调整浏览器窗口试试

window.navigator 封装了浏览器的信息

navigator.appName navigator.appVersion navigator.userAgent navigator.platform

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

screen 代表屏幕尺寸

screen.width

screen.height

location(*)

location 代表当前页面的URL信息

host:"www.baidu.com"  代表主机
href:"https://www.baidu.com/"    代表当前位置
protocol: "https:"
reload:f reload()  //刷新网页
location.assign('https://cn.bing.com/search')

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>

document可以直接获取cookie

document.cookie 劫持cookie原理 服务器端可以设置 httpOnly

history

history.back() 前进

history.forwward() 后退

7. 操作DOM对象

DOM: 文档对象模型

核心:浏览器网页就是一个DOM树形结构

更新:更新DOM节点

遍历DOM节点: 得到DOM节点

删除: 删除一个DOM节点

添加: 添加一个新的节点 要操作一个DOM节点就要先获得这个DOM节点

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

var childrens = father.children;//获取父节点下的子节点
father.firstChild
father.lastChild

这是原生代码,之后们尽量使用jQuery

<div id="id1">

    </div>
    <script>
        id1 = document.getElementById("id1");
        console.log(id1);
        id1.innerText = '123';//修改文本的值
 		id1.innerHTML = '<strong>123</strong>'; //解析html文本标签
        id1.style.color = 'red'; //属性使用字符串
        id1.style.fontSize = '200px'; //驼峰命名问题
        id1.style.padding = '2em';
    </script>

删除节点

先获取父节点然后通过父节点删除自己

删除操作是动态删除,删除多个节点的时候删除操作是动态变化的

<div id="father">
    <h1>标题一</h1>
    <p id="p1">p1</p>
    <p class="p2">p2</p>
</div>

<script>
    var self = document.getElementById('p1');
    father = self.parentElement
    father.removeChild(self);
</script>

插入节点

我们获得了某个DOM节点,假设这个dom节点是空的,我们通过innnerHTML就可以增加一个元素,但是这个DOM节点已经存在元素了,我们就不能使用此方法进行增加元素

追加 append

<div id="list">
    <p id="se">JavaSE</p>
    <p id="ee">JavaEE</p>
    <p id="me">JavaME</p>
</div>
<script>
   let js = document.getElementById('js'), //已存在的节点
        list = document.getElementById('list');
    list.appendChild(js);
    //通过js创建一个新的节点
    let newP = document.createElement('p');
    newP.id = 'newP';
    newP.innerText = "Hello world!";
    list.appendChild(newP);

    //创建一个标签节点,通过这个属性可以设置任意的值
    var myScript = document.createElement('script');
    myScript.setAttribute('type','text/javascript');
    list.appendChild(myScript);
    //可以创建一个style标签
    var myStyle = document.createElement('style');//创建一个空Style标签
    myStyle.setAttribute('type','text/css');
    myStyle.innerHTML = 'body{background-color: chartreuse;}';//设置标签内容
    let head = document.getElementsByTagName('head');
    console.log(head);
    head[0].appendChild(myStyle);
</script>

insert

<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>
    let ee = document.getElementById('ee');
    let js = document.getElementById('js');
    let list = document.getElementById('list');
    //要包含的节点,insertBefore(newNode,targetNode)
    list.insertBefore(js,ee);
</script>

8. 操作表单

表单是什么 form DOM树 表单的目的:提交信息

  1. 文本框 text
  2. 密码框
  3. 下拉框 radio
  4. 单选框多选框 checkbox
  5. 隐藏域 hidden
  6. 密码框 password
<form action="post">
    <p>
        <span>用户名:</span><input type="text" id="username">
    </p>
    <p>
        <span>性别:</span>
        <input id="boy" type="radio" name="sex" value="men"><input id="girl" type="radio" name="sex" value="women"></p>

</form>
<script>
    let username = document.getElementById('username');
    let boy_radio = document.getElementById('boy');
    let girl_radio = document.getElementById('girl');

    //得到输入框的信息
    username.value = "123";
    //对于单选框多选框等等固定的值,boy_radio.value只能取到当前的值 boy_radio.checked 可以查看选项是否被选中
    boy_radio.checked = true;
</script>

提交表单

<!--表单绑定提交事件
    onsubmit = 绑定一个提交检测的函数, true  false
    将这个结果返回给表单 使用onsubmit接收-->
<form action="#" method="post" onsubmit="test()">
    <p>
        <span>用户名:</span><input type="text" id="username">
    </p>
    <p>
        <span>密码:</span><input type="password" id="input-password">
    </p>
    <input type="hidden" id="md5-password" name="password">
    <button type="button" onclick="test()">提交</button>
</form>
<script>
    function test(){
        alert("123");
        let uname = document.getElementById('username');
        let pwd = document.getElementById('input-password');
        let md5pwd = document.getElementById('md5-password');
        md5pwd.value = md5(pwd.value);
        
        //可以校验判断表单内容,true就是通过提交,false就是阻止提交 
        return true;
    }
</script>

9. jQuery

javascript 和 jQuery 库 里面存在大量的javascript函数;

获取jQuery

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script src="jquery-3.5.1.js"></script>
</head>
<body>

<!--
    公式: $(selector).action()
-->
<a href="" id="test-jquery">点我</a>
<script>
    document.getElementById('id');
    $('#test-jquery').click(function(){
        alert('hello,jQuery!');
    })
</script>
</body>
</html>

选择器

 //原生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="http://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script src="jquery-3.5.1.js"></script>
    <style>
        #divMove{
            width: 500px;
            height: 300px;
            border: 1px solid red;
        }
    </style>
</head>
<body>
mouse: <span id="mouseMove"></span>
<div id="divMove">
    <!--获取鼠标当前的位置坐标-->
    在这里移动鼠标试试
</div>
<script>
    //当网页元素加载完毕之后响应事件
    $(document).ready(function(){

    })
    $(function(){
        $('#divMove').mousemove(function(e){
            $('#mouseMove').text('x:'+e.pageX + 'y:'+ e.pageY)
        })
    })
</script>
</body>
</html>

操作DOM

节点文本操作

<ul id="test-ul">
    <li class="js">JavaScript</li>
    <li name="python">Python</li>
</ul>
<script>
    //document.getElementById('')
    $('#test-ul li[name=python]').text();//属性选择器获得值
    $('#test-ul li[name=python]').text('设置值');//设置值
    $('#test-ul').html();//获得值
    $('#test-ul').html('<strong>123</strong>');//设置值
</script>

css操作

 $('#test-ul li[name=python]').css("color","blue");

元素的显示与隐藏: display = none;

 $('#test-ul li[name=python]').show();
 $('#test-ul li[name=python]').hide();
娱乐测试
$(window).width()
$(window).height()
$('#test-ul li[name=python]').toggle();

未来ajax

$('#form').ajax()

$.ajax({url: "test.html", context:document.body, success:function(){
    $this.addClass("done");
}})
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值