JavaScript

介绍


什么是javaScript?
一门世界上最流行的脚本语言-用浏览器就能运行
一个合格的后端人员,一定要精通javaScript

javaScript引入

内部标签引入

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
alert("Hello, World!");
        </script>
</head>
<body>

</body>
</html>

外部引入

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/qj.js"></script>
</head>
<body>

</body>
</html>

浏览器控制台使用

基本语法

java定义变量是严格按照左边变量的类型,例如int number=3,变量number就是int类型,同时右边的值也会判断是什么类型,左右类型是否匹配
而js变量由于没有类型,例如var num=3,所以变量类型是依靠右边的值决定的,现在是3,所以num是整数类型

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script >
        //1.定义变量 变量类型 变量名 = 变量值,变量类型都是var
        var num=1;
        var age = 20;
        //2.条件控制
        if(2>1){
            alert("2大于1");
        }
        //console.log()在浏览器控制台上打印变量

    </script>
</head>
<body>

</body>
</html>

数据类型

1,number
js不区分小数和整数

2、字符串
"abc"

3、布尔值
true\false

4、比较运算符!!!!重要
1、=
2、== 等于(类型不一样,值一样,也会判断为true)
3、=== 绝对等于(类型一样,值一样,才会判断为true)

尽量避免用浮点数进行运算,存在精度问题,和java一样,用判断

5、null和undefined 空和未定义

6、数组
java的数组需要同个类型,js不用
var arr=[1,2,"hello"]
如果越界,会显示underfined

7、对象-用,号隔开,不用像JAVA一样要定义类,才能new对象,
var person={
name:"jjf",
age=3,
}

取对象的值:person.name

开户检查模式strict

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

       "use strict"//写在第一行,启用严格模式,预访JS的随意性导致报错,不加的话num=1都不会报错,加了你要加上var关键字
       //局部变量建议使用let
       var num=1;
    </script>
</head>
<body>

</body>
</html>

字符串

多行字符串

//多行字符,可以实现不用加转义字符就能多行
var name =`我是
你你`
console.log(name);

模板字符串

let name ="jj";
let age = 20;
let message = `Hello, ${name}`;
console.log(message);

字符串长度
console.log(str.length)
大小写转换

//注意,这里是方法了,不是属性了
student.toUpperCase()

从第一个字符串截取到最后一个字符串
student.substring(1)

数组类型

Array可以包含任意的数据类型,java不行

//定义数组
var arr=[1,2,3,4,5,6]

//长度
arr.length
注意,如果给arr.length赋值,数组大小会发生变化 ,如果赋值过小,元素就会丢失。这个java不一样,而且越界也不会报错,只会显示 undfined

//通过元素获得下标索引
arr.indexof(2)
1

//silce() 截取array的一部分,返回一个新数组,类似于srting中的substring

//push,pop(push,压入到尾部,pop,弹出尾部一个元素)
arr.push("a","b")
8
arr
(8) [1, 2, 3, 4, 5, 6, 'a', 'b']

arr.pop()
'b'
arr
(7) [1, 2, 3, 4, 5, 6, 'a']

//unshift(),shift(),压入到头部,头部弹出一个元素

//排序
arr.sort

//元素反转
arr.reverse()

//拼接
concat()-concat()并没有修改数组,只是会返回一个新的数组
arr.concat([1,2])
(9) [1, 2, 3, 4, 5, 6, 'a', 1, 2]
arr
(7) [1, 2, 3, 4, 5, 6, 'a']

//连接符join
拼接数组,使用特定的字符串连接

//多维数组 
arr=[[1,2],[3,4]];
(2) [Array(2), Array(2)]0: (2) [1, 2]1: (2) [3, 4]length: 2[[Prototype]]: Array(0)
arr[1][1]
4

对象

1\java的对象是new出来的,js就是若干个键值对
所有的键都是字符串,值是任意对象person['age']

  var person={
            //属性名:属性值
            name:"John",
            age:30,
            city:"New York"
        }
//js的对象,用{}表示一个对象,多个属性用逗号隔开,最后一个属性不加逗号

使用不一个不存在的对象属性,不会报错,只会undefined

2\可以动态的添加或删除对象的属性

delete person.name
true
person
{age: 30, city: 'New York'}age: 30city: "New York"[[Prototype]]: Object
person.xixi="haha"
'haha'
person
{age: 30, city: 'New York', xixi: 'haha'}

3\判断属性是否在这个对象中

"age" in person
true

流程控制-分支和循环

if判断

var age=3;
        if(age>=18){
            console.log("You are old enough to vote.");
        }else{
            console.log("You are not old enough to vote.");
        }

while

 var age=3;
        while(age<18){
            console.log("You are not yet 18.");
            age++;
        }
        console.log("You are 18 or older.");

for

    var age=3;
      for(var i=0;i<age;i++){
          console.log("Hello World");
      }

数组循环

 var age=[1,2,3,4,5];
//js叫做函数,java叫做方法
        age.forEach(function(element){
            console.log(element);
        });

Map和Set

MAP

//es6
        var map=new Map([['tom',100],['jerry',200],['alice',300]]);
        var name=map.get('tom');//通过key获取value
        map.set('admin',400); //通过key设置value
        map.delete("tom");
        console.log(name);

Set:无序不重复的集合

  var set =new Set([1, 2, 3, 2, 1]); // Set [1, 2, 3]会去重
        set.add(4); // Set [1, 2, 3, 4]
        set.delete(2); // Set [1, 3, 4]
        console.log(set.has(2)); // false

遍历map

   var map = new Map([["apple", 1], ["banana", 2], ["orange", 3]]);
      for(var x of map){
          console.log(x);
      }

函数

方法:java,对象(属性、方法)
函数:js

定义函数
java:public 返回值类型 方法名{}

函数-funtion 方法名

//第一种方式
 funtion abs(x){
    if(x>0){
      return x;
      }else{
          return -x;
       }
}

//第二种方式
var abs =function(x){

}

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

调用函数
abs(10)//10
参数问题:js可以传任意参数,也可以不传递参数,不会报错,最多undefind
只能在方法中定义判断,手动抛出异常

arguments是获得所有传进来的参数

  var abs=function(x){
         console.log(x);
         for(var i=0;i<arguments.length;i++){
             console.log(arguments[i]);
         }
         if(x>=0){
             return x;
         }else{
             return -x;
         }
     }

rest,获取除了定义参数之后的参数


   function aaaa(a, b,...rest) {
          console.log(a );
          console.log(b);
          console.log(rest);
      }
      //aaaa(2,4,5,5)

变量的作用域let const

在js,var定义的变量是有作用域的,假设在函数中声明,在函数外是不能使用的(如果要实现,得用闭包)
如果在函数使用了相同的相同变量名,只要在函数内部,就不冲突

//变量在函数外就用不了
function qj(){
        var x=1;
        x=x+1;
    }
    x=x+2;//Uncaught ReferenceError: x is not defined
   function qj(){
        //内部函数可以访问外部函数的成员,反之不行
        var x=1;
        function y(){
            var y=x+1;//2
        }
        var z=y+1;//y is not defined
    }
   function qj(){
        //函数会直接从自身函数找变量开始,由内向外查找,假设内外有相同的变量,会自动屏蔽外部的变量
        var x=1;
        function y(){
            var x=2;
            console.log(x);//2
        }
       console.log(x);//1
        
    }
      //由于js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值,所以会报错
        //所以养成规范,变量的定义都放在函数的头部,不要乱放,便于阅读和维护
    function qj(){
        var y;
        var x="x"+y;
        console.log(x);
        y="y";
        
        //正确的写法
        function qj2(){
            var x=1,
                y=x+1;
              z,i,async 
            //后面随便用
        }

全局变量

//全局变量,内部外部都可以访问
      var x = 10;
      function myFunction() {
          console.log(x);
      }
      myFunction();
      console.log(x);

全局对象window

var x = "10";
     alert(x);
     alert(window.x);//默认所有的全局变量,都会自动绑定到window对象上

全局变量和全局对象window的解释说明

// var定义的全局变量成为window属性
var message = "Hello";
console.log(window.message); // "Hello"

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

规范
如果全局变量都绑定在window上,如果不同的js文件,使用了全局变量,如何减少冲突??

  //通过重新定义一个全局对象来替换window对象
        //降低全局命名冲突的问题
       //唯一全局变量
       var jj={
           
       }
       //定义全局变量
       jj.name="jj";
       jj.add=function(a,b){
           return a+b;
       }

局部作用域let
解决局部作用域冲突问题

   function myFunction() {
           for (var i = 0; i < 10; i++) {
               console.log(i)
           }
           console.log(i+1);//在同一个函数中,i是可以被能被访问的
       }
  function myFunction() {
           for (let i = 0; i < 10; i++) {
               console.log(i)
           }
           console.log(i+1);//用了let声明的变量i,只能在for循环中使用,
       }

所以定义局部作用域的变量都用let

常量const
const pi="3.14";

方法

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

一、JavaScript 的灵活性:“直接调用”的真相
JavaScript 更偏向动态语言,对象的创建和方法调用方式更灵活,但需要理解其底层机制。

1. 方法直接定义在对象上
你可以直接通过对象字面量创建对象并调用方法,无需 new:

javascript

// 直接定义对象和方法
const dog = {
  name: "Buddy",
  bark() {
    console.log("Woof!");
  }
};
dog.bark(); // 直接调用 → "Woof!" ✅
2. 动态添加方法
JavaScript 对象可以随时扩展方法:

javascript

const cat = {};
// 动态添加方法
cat.meow = function() { 
  console.log("Meow~");
};
cat.meow(); // "Meow~" ✅
3. 构造函数与 new 的使用
如果你需要复用对象模板(类似 Java 类),仍需通过 new 创建实例:

javascript

class Bird {
  constructor(name) {
    this.name = name;
  }
  fly() {
    console.log(`${this.name} is flying!`);
  }
}
const eagle = new Bird("Eagle");
eagle.fly(); // "Eagle is flying!" ✅
// 不用 new 会报错
const wrong = Bird("Eagle"); // ❌ 抛出错误:Class constructor cannot be invoked without 'new'
二、Java 的严格性:必须通过实例调用
Java 是静态类型语言,方法调用严格依赖于类与对象的关系,设计更为严谨。

1. 类与对象的强制绑定
必须通过 new 创建对象实例后才能调用实例方法:

java

public class Dog {
    private String name;
    public Dog(String name) { this.name = name; }
    public void bark() { System.out.println("Woof!"); }
}

public static void main(String[] args) {
    Dog myDog = new Dog("Buddy");
    myDog.bark(); // "Woof!" ✅
    // Dog.bark(); ❌ 直接通过类调用会报错
}
2. 静态方法的特殊规则
仅有静态方法(static 修饰)可通过类直接调用,无需实例:

java

public class MathUtils {
    public static int add(int a, int b) {
        return a + b;
    }
}

public static void main(String[] args) {
    int sum = MathUtils.add(2, 3); // ✅
}

开始

   var jj={
        name:"John",
        birth:"1990-01-01",
        //方法
        age:function(){
            var r=new Date().getFullYear()-new Date(this.birth).getFullYear();
            return r;
        }
    }
//属性
jj.name
//方法,一定要带()
jj.age()

apply
在js中可以控制this指向,否则直接调用方法,一般this是指window这个对象

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

    var jj={
        name:"John",
        birth:"1990-01-01",
        //方法
        age:getAge
    };

    //jj.age()//是可以的,
getAge.apply(jj,[]);//任何一个方法都有apply方法,可以将this绑定到另一个对象上

内部对象

Date

  var now = new Date();//Sat Mar 22 2025 10:30:01 GMT+0800 (中国标准时间)
      now.getFullYear();//年
      now.getTime();//时间戳//174261077

补充:json

早期,都是用xml文件进行数据传输,现在是用json
在javascript中,一切都是对象,任何js支持的类型都可以用json来表示
--格式
---对象都用{}
---数组都用【】
---所有的键值对都用key:value

 var user={
        name:"John",
        age:30,
        city:"New York"
    }
    console.log(user);//{name: "John", age: 30, city: "New York"}是对象,在控制台是可以展开的
    //将对象转换为JSON字符串
    var jsonStr=JSON.stringify(user);
    console.log(jsonStr);//'{"name":"John","age":30,"city":"New York"}'是字符串

    //将JSON字符串转换为对象
    var obj=JSON.parse('{"name":"John","age":30,"city":"New York"}');
    console.log(obj);//{name: "John", age: 30, city: "New York"}是对象

json和js对象的区别

var obj={a:"hello",b:"aa"};
var json='{"a":'hello',"b":'aa'};

Ajax

-原生的js写法 xhr异步请求
-jQuey封闭好的方法,$("#name").ajax("")
-axios请求

面向对象编程

js,java,c++都是面向对象编程
--类:模板
--对象:具体的实例

在JS中,如果需要使用另一个对象的方法或属性,是原型继承,直接对象继承另一个对象-两种写法,class是ES6引入的

proto 原型

而java中,是得用类继承类

  var user={
       name:"John",
       age:30,
       run:function(){
           console.log(this.name+" is running");
       }
   }

   var xiaoMing= {
       name: "XiaoMing",
   }

   xiaoMing.__proto__=user;//xiaoming的原型指向user,这样就能用run方法了,

class继承-主流

  //ES6之后
        //定义一个学生的类
        class Student {

            constructor(name) {//就像java中的构造方法
                this.name = name;
            }
            hello() {
                alert("hello")
            }
        }
var xiaoming=new Student("xiaoming");
xiaoming.hello()

继承

        //ES6之后
        //定义一个学生的类
        class Student {

            constructor(name) {//就像java中的构造方法
                this.name = name;
            }
            hello() {
                alert("hello")
            }
        }
class XiaoStdent extends Student {
    constructor(name, grade) {
        super(name);
        this.grade = grade;
    }
    myGrade() {
        alert("my grade is " + this.grade);
    }
}

let xiao = new XiaoStdent("xiao", 3);
xiao.hello();
xiao.myGrade();

继承本质还是原型
存在原型链

操作BOM对象(重点)

js和浏览器的关系?
网景公司-js诞生就是为了能在浏览器中运行,js脚本可以操作浏览器

BOM:浏览器对象模型
--IE
--chrome
--safari
--firefox
以上浏览器指的是内核,通常360,QQ都是用了上面的内核

window
window代表是浏览器窗口

window.outerHeight对象的属性
852
window.alert(1);对象的方法

navigator浏览器的信息

navigator.appVersion
'5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0'

screen代表屏幕尺寸
screen.height
900
screen.width
1440

loction重要-代表当前页面的URL信息

location
Location {ancestorOrigins: DOMStringList, href: 'https://www.baidu.com/', origin: 'https://www.baidu.com', protocol: 'https:', host: 'www.baidu.com', …}
ancestorOrigins
: 
DOMStringList {length: 0}
assign
: 
ƒ assign()
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()
replace
: 
ƒ replace()
search
: 
""
toString
: 
ƒ toString()
valueOf
: 
ƒ valueOf()
Symbol(Symbol.toPrimitive)
: 
undefined
[[Prototype]]
: 
Location

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

document.title
'百度一下,你就知道'
document.title='cjf'
'cjf'

获取具体的文档节点

<body>
<dl id="app">
    <dt>JavaScript</dt>
    <dd>javase</dd>
    <dd>javascript</dd>
</dl>
<script>
    var dl=document.getElementById("app");



</script>
document.cookie
'BAIDUID_BFESS=22416490A8C3DA5B751AD353A293781A:FG=1; BAIDU_WISE_UID=wapp_1740788934902_328; BIDUPSID=22416490A8C3DA5B751AD353A293781A; PSTM=1742043921; BD_HOME=1; BD_UPN=12314753; ZFY=qf5Tg1icJLsJBNtLPA:B5N2fJ0:Ax5siQv8HejvxF6O7I:C; H_PS_PSSID=61027_61673_62080_62325_62347_62427_62473_62484_62500_62456_62454_62452_62450_62602_62637_62674; BA_HECTOR=850h242121a0ak000ha4a1250t0g6c1jts9b523'

劫持cookie原理-一般出现病毒网页
上着正常网页,弹出一个新网页,植入了他的js文件,通过劫取的你的cookie上传到他的服务器
登陆淘宝,刷新天猫就可以直接登陆,就是因为拿了你的cookie信息

history

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

获得DOM节点

整个浏览器网页就是一个dom树形结构
--更新:更新dom节点
--遍历dom节点:得到Dom节点
--删除:删除一个dom节点
--添加:添加一个新的节点

要操作一个dom节点,就一定要获得这个dom节点

<div id="father">
    <h1>JavaScript</h1>
    <p id="p1">p1</p>
    <p class="p2">p2</p>
</div>

<script>
    //css选择器
    var h1 = document.getElementsByTagName('h1')[0]; // 获取第一个 h1 元素
    var p1 = document.getElementById('p1');
    var p2 = document.getElementsByClassName('p2')[0]; // 获取第一个类名为 'p2' 的元素
    var father = document.getElementById('father');

    // 使用 father.children 获取 father 的所有子元素
    console.log(father.children);
    // 使用 father.firstChild 获取 father 的第一个子元素
    console.log(father.firstChild);
    // 使用 father.lastChild 获取 father 的最后一个子元素
    console.log(father.lastChild);
</script>

这是原生代码,后面都是用jQuery

更新DOM节点

<div id="id1">

</div>

<script>
   var id1= document.getElementById('id1');
   id1.innerHTML = "Hello World";//修改文本的值
   //id1.innerHTML += "<strong>Welcome to JavaScript</strong>";//添加HTML代码
   id1.style.color = "red";//修改文本颜色
   id1.style.backgroundColor = "yellow";//修改背景颜色
   

</script>

删除DOM节点

步骤:先获取父节点,再通过父节点删除自己
father.removeChild(p1)

或者通过子元素找到父元素,再通过父元素删除自己

删除是一个动态的过程,删除多个节点的时候,children是一直在变化的

插入节点

我们获得了某个节点,假设这个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>
//创建标签
var js = document.getElementById("js");//已经存在的节点
var list = document.getElementById("list");
list.appendChild(js);
//通过js创建节点并添加到list中
var newP = document.createElement("p");//创建新的节点
newP.id="newP";//设置id
newP.innerText="newP";//设置内容
list.appendChild(newP);//添加到list中

骚操作,在文件中加入是script标签,同时也是创建标签的另一种写法,这个方法好点,创建标签的时候也赋值

//创建一个标签节点(通过这个属性,可以设置任意的值)
var myScript = document.createElement("script");
myScript.setAttribute("type","text/javascript");//设置src属性
list.appendChild(myScript);//添加到list中

insert插入到前面

操作表单(验证)

<body>
<form action="post">
   
    <p>
    <span>密码</span><input type="password" id="password">
    </p>
</form>

<script>
var username = document.getElementById("username");
//得到输入框的value值
var usernameValue = username.value;
//修改输入框的value值
username.value = "2233";

    </script>

表单提交验证及MD5加密!

<form action="#" method="post"  >

    <p>
    <span>用户名</span><input type="text" id="username" name="username">
    </p>
    <p>
        <span>密码</span><input type="password" id="password" name="password">
    </p>
    <!--绑定事件-->
  <button type="submit" onclick="aaa()">提交</button>
</form>

<script>
function aaa() {
    var username = document.getElementById("username");
    var password = document.getElementById("password");
    //MD5加密

    console.log(username.value);
    console.log(password.value);
    //MD5加密
    password.value = md5(password.value);
}

    </script>

JQuery学习

Jquery库,里面存在大量JS方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
<srcipt src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></srcipt>
    <!-- 可以引入链接,链接挺慢的,还是建议本地导入,也可以导入本地文件,但是要到官网-->

</head>
<body>

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

selector:选择器,可以是标签名、类名、ID、属性、内容等

action:动作,可以是click、mouseover、mouseout、change等
-->

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

    //选择器就是css选择器
    $('#test').click(function(){
        alert("你点击了我");
    });
    $('p').click(); //点击所有p标签

    //事件
    //鼠标,键盘
    $('p').mouseover(function(){
        $(this).css('background-color','red');
    });
    </script>

补充,如果jquery不通过文件导入,那一定要在head中加script标签注明jquery的链接,这样在body的script写的jQueyt才能生效

posted @ 2025-03-18 15:02  乘加法  阅读(20)  评论(0)    收藏  举报