JavaScript 入门

JavaScript

JavaScript 是脚本语言

ECMAScript它可以理解为是JavaScript的一个标准
最新版本已经到 es6 版本~
但是大部分浏览器还只停留在支持 es5 代码上!
开发环境---线上环境,版本不一致

快速入门

引入JavaScript

1.内部标签

<script type="text/javascript"></script>

2.外部标签

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

基本语法

<script>
        //JavaScript严格区分大小写
        //1.定义变量
        let score = 71;
        // let zz = 2;
        // alert(num)
        //2.条件控制
        if (score>60 && score<70){
            alert("60~70")
        }else if (score>70 && score<80){
            alert("70~80")
        }else {
            alert("other")
        }
        // console.log(score)在浏览器控制台打印变量
        /**
         */

    </script>

数据类型

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

js不区分小数和整数

变量

不能用数字开头

number

//整数 123
//浮点数 123.1
//科学计数法 1.123e3
//负数 -99
//NaN not a number
//表示无限大 infinity

字符串

// 'abc' "abc"

布尔值

//true false

逻辑运算

//&& 两个都为真,结果为真 || 一个为真,结果为真 ! 真即假,假即真

比较运算符

//= 赋值
// == 等于(类型不一样,值一样,也会判断为true)
//=== 绝对等于(类型一样,值一样,结果为true)
  • 须知:
    //NaN===NaN,这个与所有的数值都不相等,包括自己
    //只能通过isNaN(NaN)来判断这个数是否是NaN
    浮点数问题
    console.log((1/3) === (1-2/3))
    //结果为false
    尽量避免使用浮点数进行运算,存在精度问题!
    Math.abs(1/3-(1-2/3))<0.0000001
    //一般这样成立就认为相等

null 和 nudefined

nullundefined 未定义

数组

java的数组是一系列相同类型的对象,JavaScript不需要

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

取数组下标:如果越界了就会

undefined

对象

对象是大括号,数组是中括号
每个属性之间使用逗号隔开,最后一个不需要添加

let person = {
            name:"hudu",
            age:3,
            tags:['java','js','web','...']
        }

取对象的值

person.name
> hudu
person.age
> 30

严格检查格式

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

数据类型

字符串

1、正常字符串我们使用单引号,或者双引号包裹

2、注意转义字符

\'
\n
\t
\u4e2d \u#### Unicode字符
\x41  Ascll字符

3、多行字符串

let msg = `hello
        world
        你好
        hi~`;

4、模版字符串

let name = 'hudu';
let age = 3;
let msg2 = `你好呀,${name}`;

5、字符串长度

let student = 'student';
console.log(student.length)

6、字符串可变性:不可变
7、大写转换

//注意这里是方法,不是属性
student.toUpperCase()
student.toLowerCase()
student.indexOf('t')//获取指定的字符位置
student.substring(2)//从二个到最后,两个参数表示第几到第几个,左闭右开

数组

slice() 截取 Array 的一部分,返回一个新数组
push()    pop() 尾部
unshitf() 压入头部 shitf() 弹出头部
sort()
reverse()
arr.concat([1,2,3]) 返回新的数组
join('-') 打印拼接数组,使用特定的字符串连接
多维数组
arr[[1,2],[3,4]]

对象

若干个键值对
JavaScript 中的所有键都是字符串,值任意

 1、对象赋值
 2、使用不存在的属性不会报错,undefined
 3、动态删减属性 delete person.name
 4、动态添加属性 person.email = 'sfasf@gmail.com',直接给属性添加值即可
 5、判断属性是否在这个对象中 'age' in person
 6、判断属性是否是这个对象自身拥有hasOwnProperty

流程控制

if(){}else if(){}else{}

while()
do{}while()

for()
for(var num in age){} num为索引
for(var num of age){} num为具体的值

forEach(function(value){})

Map 和 Set

<script>
    'use strict'
    let map = new Map([['tom',99],['jack',80],['alex',90]]);
    let msg = map.get('alex');
    console.log(msg);
    map.set('admin',123);
</script>

Set:无序不重复的集合

<script>
    'use strict'
    let set = new Set([3,1,1,1,1,1]);
    set.add(2);
    set.delete(1);
    console.log(set.has(3));
    console.log(Array.from(set));
</script>

iterator

for(let i of map)

函数

定义

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

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

arguments 是一个 JS 免费赠送的关键字;
代表,传递进来的所有的参数,是一个数组!
//rest 只能写在最后面
//获取除了已经定义的参数外的所有参数
function aaa(a,b,...rest){
    console.log("a>"+a);
    console.log(rest);
}

变量作用域

function qj() {
    var x="x"+y
    console.1og(x);
    var y='y';
}

结果 : xundefined
说明:js 执行引擎,自动提升 y 的声明,但是不会提升变量 y 的赋值;

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

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

全局函数

全局对象 window

var x='xxx';
alert(x);
alert(window.x); //默认所有的对象都绑定在window对象上

alter()这个函数本身就是window的变量
var x='xхх';
window.alert(x);
var old_alert = window.alert;
//o1d_alert(x);
window.alert = function (){
};
//发现alert() 失效了
window.alert(123);
//恢复
window.alert =old_alert;
window.alert(456) ;

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

规范

由于所有的全局变量都会绑定到window上,如果不同的js文件,使用相同的全局变量,冲突—>如何减少冲突

//唯一全局变量
let huduapp = {};

//定义全局唯一变量
huduapp.name = "hudu";
huduapp.add = function (a,b) {
    return a+b;
}

把自己的代码全部放在自定义的唯一空间名字中,降低全局命名冲突问题

局部作用域 let

function aaa() {
    for (var i = 0;i<100;i++){
    // for (let i = 0;i<100;i++){
        console.log(i)
    }
    console.log(i+1);//使用var i出了这个作用域还可以使用
}

常量 const

只读变量

var PI = '3.14';
console.log(PI);
PI='123';//可以改变这个值
console.log(PI);


ES6中引入这个常量const
const PI='3.14';//只读常量
console.log(PI);
PI='123';

方法

定义方法

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

<script>
    let hudu = {
        name:'hudu',
        birth:1990,
        age:function () {
            let now = new Date().getFullYear();
            return now - this.birth;
        }
    }
</script>

this 代表什么

function getAge(){
    let now = new Date().getFullYear();
    return now - this.birth;
}

let hudu = {
    name:'hudu',
    birth:1990,
    age: getAge
}

this 是无法指向的,是默认指向调用它的那个对象;

apply

在js中可以控制this的指向

getAge.apply(hudu,[])//this指向了hudu对象,参数为空参

内部对象

标准对象

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

Date

基本使用

let date = new Date();//Sun Jul 05 2020 12:49:42 GMT+0800 (China Standard Time)
date.getFullYear();//年份
date.getMonth();//月份 0~11
date.getDate();//天
date.getDay();//星期几
date.getHours();//小时
date.getMinutes();
date.getSeconds();
date.getTime();//时间戳

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

date.toLocaleString();//本地时间

JSON

格式

  • 对象都用{}

  • 数组都用[]

  • 所有的键值对都是用key:value

    'use strict'
    let user = {
     name:'hudu',
     age:30,
     sex:'man'
    }
    //对象转化为JSON字符串,{"name":"hudu","age":30,"sex":"man"}
    let json_user = JSON.stringify(user)
    //json字符串转化为对象,参数为json字符串
    let obj = JSON.parse('{"name":"hudu","age":30,"sex":"man"}');

    json字符串和json对象区别

    var obj = {a:'helloa',b:'hellob'}
    let json = '{"a":"hello","b":"hellob"}';

Ajax

  • 原生的js写法 xhr异步请求
  • jQuery封装好的方法${“#name”}.ajax(“”)
  • axios请求

面向对象编程

什么是对象

Java中

类:模板

对象:具体的实例

在JavaScript中

类:原型对象

对象:具体的实例

let student = {
    name:'hudu',
    age:20,
    run:function () {
        console.log(this.name+"run...")
    }
}

let xiaoming = {
    name:'xiaoming'
}

//小明的原型是student
//原型对象
xiaoming.__proto__ = student;

class继承

class关键字是ES6引入的。

定义一个类,属性,方法

<script>
    function Student(name) {
        this.name = name;
    }

    //给student新增一个方法
    Student.prototype.hello = function () {
        alert('Hello')
    }

    //ES6之后
    //定义一个学生的类
    class student{
        constructor(name) {
            this.name = name;
        }
        hello(){
            alert('hello')
        }
    }
    let xiaoming = new Student('xiaoming');
</script>

继承

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

    myGrade(){
        alert('我是'+this.grade+'班小学生');
    }
}

let xiaohong = new xiaoxue('xiaohong',1)

本质:查看对象原型

xiaohong
xiaoxue {name: "xiaohong", grade: 1}
grade: 1
name: "xiaohong"
__proto__: Student

原型链

操作 BOM 对象(重点)

BOM:浏览器对象模型

window

window 代表浏览器窗口

window.alert(1);
undefined
window.innerHeight
150
window.innerWidth
944
window.outerHeight
624
window.outerWidth
944

Navigator(不建议使用)

Navigator 封装了浏览器信息

window.navigator.appCodeName
"Mozilla"
window.navigator.appName
"Netscape"
window.navigator.appVersion
"5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
navigator.platform
"MacIntel"

大多数时候,不会使用navigarot,会被人为修改

不建议使用这些属性来判断和编写代码

screen

screen.width
1440
screen.height
810

location

location 代表当前页面URL信息

hash: ""
host: "www.baidu.com"
hostname: "www.baidu.com"
href: "https://www.baidu.com/"
origin: "https://www.baidu.com"
pathname: "/"
port: ""
protocol: "https:"
reload: ƒ reload()//刷新网页

//设置新的地址
location.assign('https://www.bilibili.com/')

document

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

document.title
"哔哩哔哩 (゜-゜)つロ 干杯~-bilibili"
document.title = 'hudu'

获取具体的文档树节点

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

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

获取 cookie

document.cookie
""

劫持 cookie 原理
www.taobao.com

<script src="aaa.js">

</sript>

<!--恶意人员;获取你的cookie上传到他的服务器~-->

服务器端可以设置cookie:httpOnly

history

代表浏览器的历史记录(不建议使用)

history.forward()
history.back()

操作DOM对象

DOM 文档对象模型

核心

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

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

要操作一个Dom节点,就不需要获得这个Dom节点

获得dom节点

//标签
let h1 = document.getElementsByTagName('h1');

let p1 = document.getElementById('p1');
let p2 = document.getElementsByClassName('p2');
let father = document.getElementById('father');

let children = father.children//获取父节点下的所有子节点
father.lastChild;
father.firstChild;
p1.nextElementSibling;

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

更新节点

<body>
<div id="id1">

</div>

<script>
    let id1 = document.getElementById('id1')
    id1.innerText = 123;
</script>
</body>

操作文本

  • id1.innerText = 123;修改文本值
  • id1.innerHTML = '<strong>12345</strong>'可以极细HTML文本标签

是覆盖操作

操作js

id1.style.color = 'red'//属性使用字符串
id1.style.fontSize = '20px'//下划线驼峰命名

删除节点

删除节点步骤,先获取父节点,再删除节点

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

<script>
    let father = document.getElementById('father');

    let self = document.getElementById(p1);
    let father1 = self.parentElement;
    father1.removeChild(self);

    // father.removeChild(p1);

</script>
father.children
HTMLCollection(3) [h1, p#p1, p.p2, p1: p#p1]
father.children[0]
<h1>标题一</h1>

注意:删除多个节点的时候,children是在时刻变化的,删除节点的时候一定要注意

插入节点

我们获得了某个dom节点,假设dom节点是空的,我们可以通过innerText或者innerHTML就可以增加一个元素了。

但是这个dom节点如果已经存在元素了,我们就不能这么干,会产生覆盖

追加操作

<p id="js">Java</p>
<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');
    let list = document.getElementById('list');


</script>

list.appendChild(js)
<p id="js">Java</p>

创建一个新的标签

let js = document.getElementById('js');
let list = document.getElementById('list');

list.appendChild(js);//追加到后面

//通过JS创建一个新的节点
let newP = document.createElement('p');
// newP.setAttribute('id','newP');
newP.id = 'newP';
// newP.innerHTML = ''
newP.innerText = 'hello';
list.appendChild(newP);

//创建一个标签节点(通过这个属性可以设置任意的值)
let myScript = document.createElement('script');
myScript.setAttribute('type','text/javascript')

//给body设置背景颜色,通过style方式
let body = document.getElementsByTagName('body');
// body[0].style.background = '#66ccff';

//通过添加css实现
let myStyle = document.createElement('style');
myStyle.innerHTML = 'body{background-color:#66ccff;}';
let head = document.getElementsByTagName('head')[0];
head.appendChild(myStyle);

insertBefore

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

操作表单

<form action="">
    <p>
        <span>用户名:</span><input type="text" id="username">
    </p>
    <p>
        <span>性别</span>
        <input type="radio" name="sex" value="man"><!--checked="true"-->
        <input type="radio" name="sex" value="woman"></p>

</form>

<script>
    let input_text = document.getElementById('username');
    // input_text.value='1231231';

    let man = document.getElementsByTagName('input')[1];
    let woman = document.getElementsByTagName('input')[2];

    //对于单选,多选框等,value只能获得值
    man.checked;//查看返回结果,是否为true,true为选中
    // man.checked = true;//赋值
</script>

提交表单

MD5 加密密码

<!--
表单绑定提交事件
onsubmit 绑定一个提交检测的函数  true  false
将这个结果返回给表单使用onsubmit 接收
-->
<form action="#" method="post" onsubmit="return check()">
    <p>
        <span>用户名:</span><input type="text" required placeholder="请输入用户名" id="username" name="username">
    </p>
    <p>
<!--        <span>&nbsp;&nbsp;&nbsp;&nbsp;码:</span><input type="password" id="password" name="password">-->
        <span>&nbsp;&nbsp;&nbsp;&nbsp;码:</span><input type="password" id="input-password">
    </p>
    <input type="hidden" id="md5-password" name="md5-password">
<!--    <input type="submit" value="注册">-->
<!--    绑定事件 onclick 被点击-->
<!--    <button type="submit" onclick="check()">提交</button>-->
    <button type="submit">提交</button>
</form>

<script>
    function check() {
        let username = document.getElementById('username');
        let password = document.getElementById('input-password');
        let md5pwd = document.getElementById('md5-password');

        md5pwd.value = md5(password.value);

        //可以校验判断表单内容。true就是通过提交,false就是不通过
        return true;
        // console.log(username.value);
        // console.log(password.value);
        // //MD5算法
        // // password.value = '********'
        // password.value = md5(password.value)
        // console.log(password.value);
    }
</script>

jQuery

<!--
公式:$(selector).action()
-->

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

<script>
    // let id = document.getElementById('test-jquery');
    // id.click();
    //选择器就是css的选择器
    $('#test-jquery').click(function () {
        alert('hello,jquery')

    })
</script>

选择器

<script>
document.getElementsByTagName();
document.getElementById();
document.getElementsByClassName();

// jQuery
$('p').click();
$('#id1').click();
$('.class1').click();

</script>

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

事件

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

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

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

操作 dom

// document.getElementsByClassName('js')
$('#test-ul li[class=python]').text();//获得值
$('#test-ul li[class=python]').text('hello');//设置值
$('#test-ul').html();

css 操作

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

元素的隐藏和消失

//相当于display:none
$('#test-ul li[class=python]').show();
$('#test-ul li[class=python]').hide();
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Galois 于 3周前 加精
讨论数量: 1

言简意合,总结到位!

4周前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!