JavaScript入门保姆级教程 ——— 重难点详细解析(万字长文,建议收藏)

Source

基本语法、事件

🍅 Java学习路线:搬砖工的Java学习路线
🍅 作者:程序员小王
🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF
🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步
🍅 欢迎点赞 👍 收藏 ⭐留言 📝

一、JavaScript简介

JavaScript(原名:ECMAScript):网景 (Netscape)公司开发,基于浏览器的,解释型的脚本语言(写在Html中)

  • 作用
1. 表单验证
2. 页面特性
3. 操作页面元素

注意:JS是弱类型语言;严格区分大小写,且存在浏览器差异

  • 一门客户端脚本语言
* 运行在客户端浏览器中的。每一个浏览器都有JavaScript的解析引擎
* 脚本语言:不需要编译,直接就可以被浏览器解析执行了
  • 功能:
 # jsp: java服务页面 实现页面的动态效果 动的是数据 ${requestScope.name}
 # js:              实现页面的动态效果 动的是页面结构(标签)
 可以来增强用户和html页面的交互过程,可以来控制html元素,
    让页面有一些动态的效果,增强用户的体验。操作Html的页面结构
  • JavaScript发展史:
1. 1992年,Nombase公司,开发出第一门客户端脚本语言,专门用于表单的校验。命名为 : C--  ,
后来更名为:ScriptEase

2. 1995年,Netscape(网景)公司,开发了一门客户端脚本语言:LiveScript。
后来,请来SUN公司的专家,修改LiveScript,命名为JavaScript

3. 1996年,微软抄袭JavaScript开发出JScript语言

4. 1997年,ECMA(欧洲计算机制造商协会),制定出客户端脚本语言的标准:ECMAScript,
就是统一了所有客户端脚本语言的编码方式。

* JavaScript = ECMAScript + JavaScript自己特有的东西(BOM+DOM)

  • 注意事项:
# js和java没有关系 独立的编程语言
# js是一种解释型编程语言
     编译型:运行效率高,不能跨平台  源码--》字节码 运行的字节码 C C++
     解释型: 逐行解释运行,运行效率低,运行的是源代码,能跨平台 js
     先编译再解释: 运行效率较高 可跨平台 java

# js的解释器---浏览器
  WebKit 内核系列:chrome、360..【标准w3c组织】
  IE内核系列:IE浏览器(IE 6.0版本以前)
  js浏览器差异:解析过程中也存在浏览器差异的

# js代码核心功能是操作页面结构,不能独立运行,依托与HTML运行

二、JavaScript使用

1. 基本语法:
    1. 与html结合方式
      1. 内部JS:
        * 定义<script>,标签体内容就是js代码
      2. 外部JS:
        * 定义<script>,通过src属性引入外部的js文件

      * 注意:
        1. <script>可以定义在html页面的任何地方。但是定义的位置会影响执行顺序。
        2. <script>可以定义多个。
    2. 注释
      1. 单行注释://注释内容
      2. 多行注释:/*注释内容*/

1、引入js方式

在html代码中通过<script>标签嵌套js代码
<script type="text/javascript">
//js语句
</script>

注意;在开发过程中通常会将这段代码放在<head></head>标签中
<head>
<script type="text/javascript">
//js语句
</script>
</head>

2、js中输出

1. 向浏览器窗口中输出HelloWord
  <script type="text/javascript">
    document.write("<h1>HelloWord</h1>");
  </script>
2.一警告框的形式打印输出结果
 <script type="text/javascript">
  window.alert("HelloWord");
  </script>
3.向浏览器控制台输出结果
<script type="text/javascript">
    console.info("HelloWord");
</script>

·案例·:

 <script type="text/javascript">
        <!--书写js代码-->
        //在HTML中页面输出
        document.write("helloWord")
        //浏览器弹框输出 参数:输出的内容,阻断后续程序运行
        alert("helloWord");
        //浏览器控制台输出 快捷键:F12
        /**
         * console.log()、console.info()、console.debug()的作用都是在浏览器控制台打印信息的。
         使用最多的是console.log()。
         console.info()和console.debug()本质上与console.log()没有区别。
         是console.log()的另一个名字而以,可以理解为它们三个其实就是同一个,只不过名字不一样。
         其中,console.info()打印出的信息,在控制显示的时候信息前面会出现一个小图标,
         而且谷歌浏览器和opera不支持console.debug()。
         */
        console.log("helloWord");
        console.info("Hello World!")
    </script>

3、变量

1.js是一种弱类型类型语言
java--是一种强类型语言(变量的类型和值的类型一致)
int a=3; String str="whj";
js--是一种弱类型的语言(只有值类型,没有变量类型)
var a=3; a="whj"

*强类型:在开辟变量存储空间时,定义了空间将来存储的数据的数据类型。
        只能存储固定类型的数据
* 弱类型:在开辟变量存储空间时,不定义空间将来的存储数据类型,
         可以存放任意类型的数据。
2.js的变量定义
变量:一小块存储数据的内存空间
变量可可以多次重名声明定义赋值,值以最后一次有值的赋值为准
var a=4; a=false; a="hehe";

typeof运算符:获取变量的类型。
* 注:null运算后得到的是object

4、数据类型

1.基本数据类型
数字类型--不分小数和整数
字符串类型--不分字符和字符串,用单引号或者双引号声明定义 “hjehe”
布尔类型--true|false0|0false) 非空|null(false)

*1. number:数字。 整数/小数/NaN(not a number 一个不是数字的数字类型)
*2. string:字符串。不区分字符和字符串,不区分单双引号 字符串  "abc" "a" 'abc'
*3. boolean: truefalse
*4. null:一个对象为空的占位符
*5. undefined:未定义。如果一个变量没有给初始化值,则会被默认赋值为undefined

3.引用、复合型数据类型
数组 日期 对象 函数类型

4.JS特殊语法:
      1. 语句以;结尾,如果一行只有一条语句则 ;可以省略 (不建议)
      2. 变量的定义使用var关键字,也可以不使用
            * 用: 定义的变量是局部变量
            * 不用:定义的变量是全局变量(不建议)
5、特殊类型:
   NAN not a number 进行了不正常的数字运算  “whj/2=NAN
   undefined 变量声明后未赋值直接使用 var a; alert(a);
   null 变量手工赋值为null,函数返回值为null

6、关键字 tepyof 查看当前变量的实际数据类型 使用方式
    var a="10";
    var b=10;
    alert(a=b);//true
    alert(typeof a);//string
    alert(typeof b)//number
    alert(typeof a= typeof b);//true

5、运算符

1.数学运算符:+ - / % *
注意:只有能计算出结果 ,js就会自动类型转换切换运算出结果
2、判断相等性 :== ===
==:比较两种是否相等
var a=3; var b="3" alter(a==b)-->true
===:比较值和类型是否相等
var a=3; var b="3" alter(a===b)-->false

例:
<script type="text/javascript">
   a=3; b="3"; window.alert(a===b);
</script>

3.typeof 判断变量的类型
4.三元运算符
        ? : 表达式
        var a = 3;
            var b = 4;
    
            var c = a > b ? 1:0;
        * 语法:
          * 表达式?1:2;
          * 判断表达式的值,如果是true则取值1,如果是false则取值2

6、JavaScript流程控制

1、判断语句 ---与java一样
if(){
    
      }
if()else{
    
      }
switch(a) case  java中a的值:byte,short,int,char,String(1.7以后)  js:没要求

2、循环控制:
forvar i=0;i++{
    
      }
while(){
    
      }
do()while()

7、练习:99乘法表

<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <script>
<!--    99乘法表-->
    document.write("<table align='center'>");

//控制行数
for (var i = 1; i <=9 ; i++) {
      
        
  document.write("<tr>");
  for (var j = 1; j <=i ; j++) {
      
        

    document.write("<td>");
    document.write(i+"*"+j+"="+(i*j)+"&nbsp;&nbsp;&nbsp;");
    document.write("</td>");
  }
  //换行输出
  document.write("</tr>");
}
document.write("</table>");
  </script>
</head>

三、自定义函数【重点】

概念:特点功能的代码块,可以反复调用

  • 在js例函数被定义为一种数据类型,一个函数也可以称为“一个函数类型的值”,保存之这个值的变量就是函数名

  • 定义函数

1.使用关键字function定义函数
function 函数名(参数名,....){
    
      函数体}

function add(a,b){
    
      return a+b;}

调用:函数名+参数表 :
    add(10,20);

2.隐式声明(匿名)定义
语法:var函数名=function(函数名){
    
      函数体}
  用function定义一个函数,将其看做是一个值,将这个值赋值给变量。
  例如:var add=function add(a,b){
    
      return a+b;}
  使用:变量名(实参)
  add(5,2);
  
3.函数类型值可以在变量间赋值
  var f1=function(){
    
      return "hehe"}
  var f2=f1;-->将f1这个函数赋值给f2,f2也是一个函数
  var f3=f1():-->将f1这个函数的结果赋值给f3,f3就是字符串“hehe”

4、函数可以作为函数的参数【常用】

实现方法二:
test(function (i,j)){
    
      
  return i+j;
}
  • 案例:将java中的排序放到前端使用

5、函数可以不按照规定传递参数

  function add(i+j){
  return i+j;
  }
  var result1=add(1);  //1+undefined=NaN
  var result1=add(1,2);//3
  var result1=add(1,2,3,4);//3(只取前两位)
  
  * 注意:js中的函数可以不按照指定参数去传参,可能会出问题

1、内置数组对象Arguments[重点]

注意事项:

js里没有“方法重载”,调用函数时可以传入多余or少于形参数量的实参。
js将所有的实参默认保存在一个叫做arguments的数组里。
注:arguments(争吵)只能在函数内部使用

function add(i,j){
    
      
  if(typeof i=="number"&&typeof="number"){
    
      
       if(arguments.length==2){
    
      
           return i+j;
        }else{
    
      
           alert("类型有误,请重新输入");
        }
        }else{
    
      
             alert("参数个数有错,请重新输入");
        }
  }
  
  *arguments作用:增强函数的健壮性

2、内置函数

1.parseInt函数:把str转化成number整数
document.write(parseInt("123")+"<br/>");//123
document.write(parseInt("1.23")+"<br/>")//1
document.write(parseInt("1a23")+"<br/>");//1
document.write(parseInt("a123")+"<hr/>");//NaN

2.parseFloat函数:把str转化成number小数
document.write(parseFloat("3.14")+"<br/>")//3.14
document.write(parseFloat("a123")+"<br/>");//NaN(not 啊number)
document.write(parseFloat("1a.23")+"<br/>")//1

四、对象

1、对象类型

# js语言是一门类(类似)的面向对象的编程语言,js没有类的概念

#1、在js里只有对象,没有类,任意两个对象都不一样

# 2.定义一个对象
  语法:var obj={属性名:属性值,属性名:属性值,.......};
#3.访问对象的属性
(1)访问一个属性:对象名  或者 对象名{"属性名"}

(2)遍历所有属性: 对象名.属性名 或者 对象名["属性名"]
     循环每一次执行,都会从对象中获取一个属性值,赋值给指定的变量名。
    属性特点:
         1. 方法定义是,形参的类型不用写,返回值类型也不写。
         2. 方法是一个对象,如果定义名称相同的方法,会覆盖
         3. 在JS中,方法的调用只与方法的名称有关,和参数列表无关
         4. 在方法声明中有一个隐藏的内置对象(数组),arguments,封装所有的实际

2、自定义对象:自己定义的对象

(1)new Object();方式创建对象 【了解】

  <script type="text/javascript">
        //创建一个学生对象
        var student = new Object();
        //属性+方法 属性的定义 对象名.属性名
        student.id = 1;
        student.name = '王恒杰';
        student.age = 21;
        //获取属性值
        alert("id是:" + student.id);
        alert("名字是:" + student.name);
        alert("年龄是:" + student.age);
        student.getId=function(){
            return this.id;
        }
       student.setId=function(id){
            this.id=id
        }
       student.getName=function(){
            return this.name;
        }
        student.setName=function(name){
            this.name=name;
        }
        student.getAge=function(){
            return this.age;
        }
        student.setAge=function(age){
            this.age=age;
        }
        alert(student.getName());
        student.setName("王恒杰whj");
        alert(student.getName());
    </script>

(2)同构系统与异构系统

# 异构系统通过XML,JSON,字符串进行多语言的通讯,因为这些都是规定好的,各个语言中使用都是一样的。例如JavaScript和Java通过Json进行数据交换,JavaScript利用eval()函数,而Java有jackson,json-lib等类库来进行帮忙解析。

# 不使用xml的原因:JSON 相对于XML要轻量,XML就比较笨重了,所以现在很多数据传输都在逐渐转为使用JSON来作为传输数据的方式。(2)同构系统与异构系统
  • 同构系统

  • 异构系统

在这里插入图片描述

(3)json形式对象创建

是一种数据交换格式,本质就是一个特殊形式的字符串 —— json串
特殊形式:{key:value , key1 : value1…}

  <script type="text/javascript">
        //创json建一个对象
        var student = {
    
      
            id: 1, name: 'whj', age: 18, getAge: function () {
    
      
                return this.age;
            }, setAge: function (age) {
    
      
                this.age = age;
            },
            //有play方法(play方法返回一个字符串值)
            play:function(){
    
      return "hehe"}
        }
        //访问属性
        alert(student.id);
        alert(student.name);
        alert(student.age);
        //访问方法(模拟)
        alert(student.getAge());
        student.setAge(58);
        alert(student.getAge());
        alert(student.play)
    </script>
    
 *异常:Assiguments patterns must be on the left side of assignment
       分配模式必须在分配模式的左侧,写:不要写=
 *typeof运算符:获取变量的类型。

3、内置对象:js中准备好的

(1)数组【重点】

# java中数组的特点:定长,元素类型相同  
# js中数组的特点:js里的数组长度不固定,可以任意扩展,数据可以是任意类型。 

<script type="text/javascript">
1.创建数组的两种方式
  //创建数组
  //1.隐式,Array数组对象 new Array();  ing[] arr1=new int[10]
   var arr1=new Array();
  //2.显示,显示初始化数组  var arr2=[元素1,元素2];
    var arr2=[1,2,3,4]

2.操作数组
    var arr1=new Array();
   //操作数组元素 下标
   arr1[0]='whj';
   arr1[1]='yfj';
   //有arr1[2]这种方式
   arr1[3]='whx';
   //获取数组的元素值
  alert(arr1[1]);
  
3.数组遍历的两种方式  
  //数组遍历
  /**
   * 下标遍历
   * @type {number[]}
   */
  for (var i = 0; i < arr1.length; i++) {
      
        
      alert(arr1[i]);
  }
  /**
   * foreach遍历
   * foreach遍历 java: for(当前元素类型 名字,遍历的数组或集合)
   *               js: for(当前元素的下标 in 遍历的数组)
   * @type {number[]}
   */
  for (index in arr1) {
      
        
    alert(arr1[index])
  }
</script>
  • 相关属性方法
 var arr2 = [1, 2, 3, 4]
    //压栈(添加数组)
    arr2.push();
    //弹栈(将末尾元素移除)
    arr2.pop();
    
1.数组对象.sort()--->对数组里的元素按照自然顺序升序排列
2.数组对象.push()--->在数组的末尾插入一个元素
3.数组对象.pop--->删除数组末尾的最后一个元素,且数组长度减1
4.数组对象.join(参数)-->将数组中的元素按照指定的分隔符拼接为字符串
5.delete 数组对象[下标]--->删除数组指定位置元素,且数组长度不变

(2)字符串

  <script type="text/javascript">
    //创建字符串
    var string1 = new String("whj");
    var string2 = "whj";
    alert(string1 + "=====" + string2)
    string2.length;
  </script>

(3)日期

   <script type="text/javascript">
   //日期
   let date = new Date();
   alert(date)
   //获取年
    alert(date.getFullYear());
   // 月 系统是0--11
   alert(date.getMonth()+1);
   // 日
   alert(date.getDate());
   // 时
   alert(date.getHours());
   // 分
   alert(date.getSeconds());
   // 秒
   alert(date.getMinutes());
   //周
   alert(date.getDay());
   //毫秒
   alert(date.getMilliseconds());
  </script>

(4)Math

//随机数 返回0-1之间的随机数
        let number = Math.random();
        alert(number)
        
             1. 创建:
                * 特点:Math对象不用创建,直接使用。  Math.方法名();

            2. 方法:
                random():返回 0 ~ 1 之间的随机数。 含0不含1
                ceil(x):对数进行上舍入。
                floor(x):对数进行下舍入。
                round(x):把数四舍五入为最接近的整数。
            3. 属性:
                PI
 5. RegExp:正则表达式对象
      1. 正则表达式:定义字符串的组成规则。
        1. 单个字符:[]
          如: [a] [ab] [a-zA-Z0-9_]
          * 特殊符号代表特殊含义的单个字符:
            \d:单个数字字符 [0-9]
            \w:单个单词字符[a-zA-Z0-9_]
        2. 量词符号:
          ?:表示出现0次或1次
          *:表示出现0次或多次
          +:出现1次或多次
          {m,n}:表示 m<= 数量 <= n
            * m如果缺省: {,n}:最多n次
            * n如果缺省:{m,} 最少m次
        3. 开始结束符号
          * ^:开始
          * $:结束
      2. 正则对象:
        1. 创建
          1. var reg = new RegExp("正则表达式");
          2. var reg = /正则表达式/;
        2. 方法  
          1. test(参数):验证指定的字符串是否符合正则定义的规范 

(5)RegExp:正则表达式对象

      1. 正则表达式:定义字符串的组成规则。
        1. 单个字符:[]
          如: [a] [ab] [a-zA-Z0-9_]
          * 特殊符号代表特殊含义的单个字符:
            \d:单个数字字符 [0-9]
            \w:单个单词字符[a-zA-Z0-9_]
        2. 量词符号:
          ?:表示出现0次或1*:表示出现0次或多次
          +:出现1次或多次
          {
    
      m,n}:表示 m<= 数量 <= n
            * m如果缺省: {
    
      ,n}:最多n次
            * n如果缺省:{
    
      m,} 最少m次
        3. 开始结束符号
          * ^:开始
          * $:结束
      2. 正则对象:
        1. 创建
          1. var reg = new RegExp("正则表达式");
          2. var reg = /正则表达式/;
        2. 方法  
          1. test(参数):验证指定的字符串是否符合正则定义的规范 

(6)Global


      1. 特点:全局对象,这个Global中封装的方法不需要对象就可以直接调用。  方法名();
      2. 方法:
          encodeURI():url编码
          decodeURI():url解码

          encodeURIComponent():url编码,编码的字符更多
          decodeURIComponent():url解码

          parseInt():将字符串转为数字
              * 逐一判断每一个字符是否是数字,直到不是数字为止,将前边数字部分转为number
          isNaN():判断一个值是否是NaN
              * NaN六亲不认,连自己都不认。NaN参与的==比较全部问false

          eval():讲 JavaScript 字符串,并把它作为脚本代码来执行。 

五、事件[重点]

js代码靠用户触发某些事件,触发js程序运行,当网页里的标签产生浏览器能够捕获的特定事件时,触发js代码运行。

1、事件模型的三要素

1.事件源:发生事件的事务/对象 通常为HTML页面的**标签** 对象
2.事件的属性:发生事件的性质(动作) 用户的某个操作(如:**单击、双击** 等)
3.监听器:事件发生后的处理 通常在**函数** 中定义处理程序

案例:点击按钮弹窗提示
事件源头:按钮标签
事件属性:单机
事件监听:弹窗提示

<head>
    <script type="text/javascript">
    //函数 事件的监听功能
    function  test1(){
      
        
        alert("点击成功")
    }
    </script>
</head>
<body>
<!--准备事件源     绑定事件属性:监听用户的操作:单机事件-->
 <input type="button" value="单机" onclick="test1()">
</body>

事件示例图:

2、为html标签注册事件的方式

<标签名 属性="" 事件名称="监听器">

如:
<input type="button" onclick="函数名字(参数列表)"/>

3、事件属性

1.鼠标相关
**onclick 单击事件** ***** **
** **ondbclick 双击事件** ***
** **onmouseover 移入鼠标** ***
** **onmouseout 移出鼠标** ***** 
onmousemove 鼠标移动*
onmousedown 鼠标按下
onmouseup 鼠标松开

2.键盘相关
onKeyDown 按键按下*
onKeyUp 按键抬起*

3.body相关事件
onload //页面加载完毕后触发
onunload 窗口离开时触发(刷新,返回,前进,主页。。。。)
onscroll 页面滚动
onresize 缩放页面

4.form表单控件相关事件***
onblur 当前对象失去焦点
onchange 当前元素失去焦点,并且值改变时<input>(监听value属性值的修改)<select>
onfocus 当前对象获得焦点时 <input>
onsubmit 表单提交时(验证表单格式是否正确)
onreset  重置按钮被点击。

onsubmit例:
function xxx(){
if(...){
alert("错误消息");
return false;
}
return true;
}
<form...οnsubmit="return xxx()">

4、注意事项

1.事件冒泡:发生在内部元素的事件默认会向外部元素扩散
   取消事件冒泡===event.cancelBubble=true;
   event--代表监听的事件对象
   event.clientX--事件产生的横坐标
   event.clientY--事件产生的纵坐标
2.通过事件监听可以取消某些标签的默认行为[存在浏览器差异 IE不生效]
超链接标签--<a href="跳转链接" onclick="return false">
表单标签--<form action="" metho="get" onsubmit="return false">


文末

👉在此,鸣谢:刘浩老师讲解

📌 作者:王恒杰

📃 更新: 2021.10.18

❌ 勘误: 无

📜 声明: 由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!
🍅 欢迎点赞 👍 收藏 ⭐留言 📝