一、JavaScript 介绍

1、概念

JS 是一门 客户端 脚本语言

(1)客户端:运行在客户端浏览器,每一个浏览器都有 JS 解析引擎

(2)脚本语言:不需要编译,直接解析执行

2、功能

可以来增强用户和 HTML 页面的交互过程,让页面有一些动态的效果

3、浏览器执行 JS

(1)渲染引擎(内核):解析 Html、Css,比如:Chrome 浏览器的 blink、老版本的 webkit

(2)JS 引擎(JS 解释器):读取运行网页中的 JS 代码,比如:Chrome 浏览器的 V8

4、JS 的组成

ECMAScript:JavaScript 语法

DOM:页面文档对象模型

BOM:浏览器对象模型

 

二、JavaScript 使用位置

1、行内 JS

<input type="button" value="唐伯虎" onclick="alert('秋香')" />

  ① 可以写在 HTML 标签的事件属性(以 on 开头)中

  ② HTML 推荐使用双引号,JS 推荐使用单引号

2、内嵌 JS

  定义 <script> 标签,标签体内容就是 JS 代码

<script>
    alert('我是内嵌式 JS')
</script>

3、外部 JS

  定义 <script> 标签,通过 src 属性引入外部文件

<script src="./My.js"></script>

注意:

  ① <script> 可以定义在 HTML 页面的任何地方,但是定义的位置会影响执行顺序。

  ② <script> 可以定义多个

 

三、JavaScript 注释

(1)单行注释://

(2)多行注释:/*  */

 

四、JavaScript 输入输出语句

<script>
    //1.浏览器弹出输入框
    prompt('请输入年龄')
    //2.浏览器弹出警示框
    alert('未满十八岁不能查看')
    //3.控制台打印信息
    console.log('我是控制台打印语句')
</script>        

 

五、JavaScript 变量

变量是内存中存放数据的空间,给这个空间起的名字叫做变量名

1、声明变量

var age;

var 是 JS 关键字,用来声明变量;声明变量后,计算机会自动分配空间(var 是 variable 缩写)

2、赋值

age = 18;

3、初始化

var myname = 'pink'

注意:

  ① 如果一行只有一条语句,则结尾分号可以省略(不建议)

  ② 变量可以不声明,直接赋值使用(不建议)

 

六、JavaScript 数据类型分类

不同数据占用的内存空间不同,为了充分利用内存空间分成了不同的数据类型

JS 的数据类型是根据等号变量值的数据类型来判断的

var a = 18;        //这是一个数字型
var b = '张三';    //这是一个字符串

JS 是动态语言,变量的数据类型可以变化

var a = 18;        
var a = '张三';      //可以给数字型 a 赋值字符串类型的数据

(1)简单数据类型

  ① Number:数字型,可以保存整数、小数、Infinity(无穷大)、NaN(非数字)、八进制(0开头)、十六进制(0x 开头)

  ② String:字符串型

  ③ Boolean:布尔型,可以保存 true、false

  ④ Null:空型(已声明赋值为 null),保存的值为空

  ⑤ Undefined:未定义型(已声明但未赋值)

(2)复杂数据类型

  ① Array:数组

  ② Function:函数

  ③ Object:对象

 

七、JavaScript 数据类型转换

1、转为字符串型

<script>
    var num = 18;

//1.toString()
    var str = num.toString();
    console.log(str);
    console.log(typeof str);
            
//2.String()
    var str2 = String(num);
    console.log(str2);
    console.log(typeof str2);
            
//3. + 号拼接字符串
    var str3 = num + '';
    console.log(str3);
    console.log(typeof str3);
            
</script>

2、转为数字型

<script>
// 1、parseInt() 整型
    console.log(parseInt('3.14'));
    console.log(typeof(parseInt('3.14')));

// 2、parseFloat() 浮点型
    console.log(parseFloat('3.14'));
    console.log(typeof(parseFloat('3.14')));
</script>

3、转为布尔型

<script>
      console.log(Boolean(''));          // false      
      console.log(Boolean(0));           // false 
      console.log(Boolean(null));        // false 
      console.log(Boolean(NaN));         // false 
      console.log(Boolean(undefined));   // false 
</script>    

空字符串、0、null、NAN、undefined 转换为布尔型都是 false

 

八、JavaScript 运算符

(1)算术运算符

  +(加)、-(减)、*(乘)、/(除)、%(取余)

(2) 一元运算符

  ++(自增)、--(自减)、+(正号)、-(负号)

(3)比较运算符

  >、>=、<、<=、==、===(全等于)

  • 比较方式:

  ① 类型相同:直接比较(字符串:按照字典顺序比较。按位逐一比较,直到得出大小为止)

  ② 类型不同:先进行类型转换,再比较,例如:console.log(18 == '18');  结果为 true

  ③ ===:全等于,在比较之前先判断两侧数据类型,如果类型不一样直接返回 false

(4)逻辑运算符

  &&(与)、||(或)、!(非)

  • 逻辑运算返回的值不一定是布尔型,即当运算的是表达式,而不是布尔值时(逻辑中断)
  • 逻辑中断会发生短路,能决定后续的程序是否执行(重要)

(5)赋值运算符

  =、+=、-=、*=、/=、%=

 

九、JavaScript 流程控制

 顺序结构、分支结构、循环结构

1、顺序结构

按顺序执行

2、分支结构

有条件,只有一个语句能执行

  • if 语句(一个条件,二选一执行)
  • if else 语句(一个条件,二选一执行)
  • if else if 语句(多个条件,多选一执行)
  • ? : : 语句(一个条件,二选一执行)
  • switch case 语句(一个条件,多选一执行)

注意:

① switch 判断条件与 case 全等(即 ===)才会执行

② 如果不写 break,那么匹配 case 后,执行当前语句后继续向下执行 

③ switch case 语句案例:

<script>
    var fruit = prompt('请输入水果种类');
    switch(fruit){            //有大括号 { }
        case '苹果':           //有冒号 :
            alert('1元/斤');
            break;        //注意是否要添加 break
        case '香蕉':
            alert('1.5元/斤');
            break;
        case '橘子':
            alert('2元/斤');
            break;
        case '芒果':
            alert('2.5元/斤');
            break;
        default:          //写 default(无匹配 case)
            alert('没有' + fruit);
        }
</script>

3、循环语句

  • for 循环
  • 双重 for 循环
  • while 循环
  • do while 循环

 注意:

① do while 语句案例

<script>
    var i = 1;
    do {                  //大括号
        console.log('我今年' + i + '岁了');
        i++;
    } while (i <= 100)   // wile 加小括号
</script>

② continue 关键字案例

<script>
//吃包子案例
    for (var i = 1; i <= 5; i++){
        if(i == 3){
            console.log('第3个包子有虫子,不能吃');
            continue;         //退出本次循环,继续执行下次循环
        }
        console.log('我正在吃第' + i + '个包子');
    }
</script>

③ break 案例

<script>
//吃包子案例
    for (var i = 1; i <= 5; i++){
        if(i == 3){
            console.log('第3个包子有虫子,我不吃你的包子了!!');
            break;    //直接退出整个循环,之后的循环也不会执行
        }
        console.log('我正在吃第' + i + '个包子');
    }
    
</script>

 

十、JavaScript 数组

1、创建数组

  ① 利用 new 

//创建空数组
var 数组名 = new Array(); 

// 举例
// 创建空数组 arr:
var arr = new Array();

  ② 利用数组字面量

// 创建空数组
var 数组名 = [];
// 创建初始化的数组
var 数组名 = ['小白','小黑'];

// 举例
// 创建空数组
var arr = [];
// 创建一个数组,初始化值为:小白、12、true
var arr = ['小白',12,true];    // 数组中可以存放任意类型的数据

2、获取数组中的元素

数组名[];

// 举例
var arr = ['周一','周二','周三','周四','周五','周六','周日'];
console.log(arr[6]);

3、遍历数组

利用 for 循环遍历

<script>    
    var arr = ['周一','周二','周三','周四','周五','周六','周日'];                    
    // 遍历数组
    for (var i = 0; i < arr.length; i++){
        console.log(arr[i]);                 // arr[i] 输出数组元素;    计数器 i 当索引号来用
    }
    console.log('数组长度为' + arr.length);    //获取数组长度:数组名.length
</script>

4、新增数组元素

  ① 修改 length

// 例如
<script>
    var arr = [1,2,3];
    console.log(arr.length, arr);
    arr.length = 5;                     //修改数组长度
    console.log(arr.length, arr);
</script>
        

  ② 追加数组元素

// 例如
<script>
    var arr = [1,3,5];
    console.log(arr);
    arr[3] = 13;          // 追加元素  
    console.log(arr);
</script>

 

十一、JavaScript 函数

封装一段需要重复执行的代码块

1、声明

  ① 利用函数关键字(命名函数)

function 函数名(){
    // 函数体       
}

// 举例
function sayHello(){
    alert('HelloWorld!');
}

  ② 利用函数表达式(匿名函数)

var 变量名 = function(){
    // 函数体       
}

// 举例
var sayHello = function(){
    alert('HelloWorld!');
}

2、函数参数

<script>
    function getAdd(num1,num2) {   // 形参可以看作不用声明的变量
        var sum = num1 + num2;
        console.log(sum);
    }
    getAdd(3,4);    //  函数无返回值时返回的是 undefined
</script>

3、函数返回值

<script>
    function getMessage(){
        return '我爱你';   // 函数返回值不只是变量,还可以是字符串、数字
    }
    console.log(getMessage());
</script>

注意:函数只能 return 一个变量,例如:

return sum1,sum2;  // 调用函数只能获取到 sum2

 4、arguments 的使用

只有函数才有 arguments 对象,而且是每个函数都内置好了 arguments

  • arguments 是一个伪数组,不是真正意义上的数组
  • 存储了所有传递过来的实参
  • 具有数组的 length 属性
  • 按照索引的方式存储
  • 没有真正数组的一些方法 pop()、push()等
  • 可以按照数组方式遍历 arguments
<script>
    function fn(){
        console.log(arguments);                        //打印伪数组
        console.log('arguments的长度:' + arguments.length);        //length 属性
        console.log('arguments索引为1的元素:' + arguments[1]);      // 按索引存储
        for (var i = 0; i < arguments.length; i++) {
            console.log('遍历arguments元素:' + arguments[i]);        // 按数组方式遍历
        }
    }
    fn(1,2,3);
</script>

 

十二、JavaScript 作用域

(1)为了减少命名冲突 

(2)es6 之前 JS 作用域:全局作用域、局部作用域

  ① 全局作用域:整个 JavaScript 标签或者 JS 文件

  ② 局部作用域:函数内部

特殊情况:函数内部未声明、直接赋值的变量是全局使用的

 

十三、JavaScript 对象

对象比数组表示内容更清晰

对象包含属性、方法

1、创建对象

  ① 使用字面量创建对象

<script>

// 利用字面量创建对象
    var obj = {             
        uname: '张三丰',          // 1.键值对形式 (属性名: 属性值)
        age: 18,                 // 2.用逗号隔开
        sayHi: function(){       // 3.方法名的冒号后是个匿名函数
            console.log('hi');
        }
    }
    
// 调用对象属性
    console.log(obj.uname);      // 方法一: 对象名.属性名
    console.log(obj['uname']);   // 方法二: 对象名['属性名']
    
// 调用对象方法
    obj.sayHi();                 // 对象名.方法名()

</script>

  ② 使用 new Object 创建对象

<script>

// 利用 new Object 创建对象
    var obj = new Object();
    obj.uname = '张三丰';        // 1.追加属性:对象名.属性名 = 属性值
    obj.age = 18;               // 2.用分号隔开
    obj.sayHi = function(){     // 3.方法名的等号后是个匿名函数
        console.log('hi');
    }

// 调用对象属性、调用对象方法方法同上
    console.log(obj.uname);        
    console.log(obj['uname']);     
    obj.sayHi();                   

</script>

  ③ 使用构造函数创建对象

<script>
// 使用构造函数创建对象
    function Star(uname, age) {        //1. 构造函数名首字母要大写
        this.name = uname;             //2. 用 this 指定是哪个对象
        this.age = age;
        this.sayHi = function(){       //3. 方法名后接匿名函数
            console.log('hi');
        }
    }                                  //4. 构造函数不需要 return 返回
    var zsf = new Star('张三丰',18);    //5. 调用构造函数必须使用 new
    var zjl = new Star('周杰伦',18);
    
// 调用对象属性、调用对象方法方法同上
    console.log(zsf.name);        
    console.log(zsf['name']);     
    zsf.sayHi();     

</script>

2、遍历对象

<script>
    var zs = {
        name : '张三',
        age : 18,
        skill : function(){
            console.log('i can dance!');
        }
    }

// 使用 for ( var key in obj) 遍历对象
    for (var k in zs){         // for 里的变量习惯上使用 k 或者 key
        console.log(k);        //   k    属性名
        console.log(zs[k]);    // obj[k] 属性值
    }
</script>

 

十四、JavaScript 内置对象

JS 中的对象分为三种:自定义对象(ECMAScript)、内置对象(ECMAScript)、浏览器对象(JS 独有)

常见的内置对象有:Math、Date、Array、String 等

1、Math 对象

Math 数学对象不是一个构造函数,所以不需要 new 来调用

(1)圆周率

<script>
    console.log(Math.PI);
</script>

(2)求最大值方法

<script>
    console.log(Math.max(1,3,5));
    console.log(Math.max(1,3,'老师'));  // NAN  因为不能转为数字型
    console.log(Math.max());           // -Infinity  无参数
</script>

(3)求绝对值方法

<script>
    console.log(Math.abs(1));  
    console.log(Math.abs(-1));     // 1  隐式转换
    console.log(Math.abs('老师')); // NAN
</script>

(4)取整方法

<script>
    // 1.向下取整 floor()
    console.log(Math.floor(1.2));   // 1
    console.log(Math.floor(1.5));   // 1
    console.log(Math.floor(1.9));   // 1
    
    // 2.向上取整 ceil()
    console.log(Math.ceil(1.2));   // 2
    console.log(Math.ceil(1.5));   // 2
    console.log(Math.ceil(1.9));   // 2
    
    // 3.四舍五入取整 round()
    console.log(Math.round(1.2));   // 1
    console.log(Math.round(1.5));   // 2
    console.log(Math.round(1.9));   // 2
</script>

(5)随机数方法

<script>
    // 1. [0,1)的随机小数
    function getRandom() {
      return Math.random();
    }
    console.log(getRandom());
    
    // 2. 两个数(并包含两个数)之间的随机整数
    function getRandomIntInclusive(min, max) {
      min = Math.ceil(min);
      max = Math.floor(max);
      return Math.floor(Math.random() * (max - min + 1)) + min;  
    }        
    console.log(getRandomIntInclusive(1, 10));
</script>

2、Date 对象

Date 对象是一个构造函数,调用时要用 new 实例化

<script>
    // 1.不带参数实例化
    var now = new Date();
    console.log(now);
// 2.带上参数实例化 var time = new Date('2019-5-1'); console.log(time); </script>

(1)获取年、月、日、时、分、秒方法

<script>
    var date = new Date();
    console.log(date.getFullYear());  //
    console.log(date.getMonth());     //月 (月份小1个月)
    console.log(date.getDate());      //
    console.log(date.getDay());       //星期 (周日返回的是0)
    console.log(date.getHours());     //时 (时分秒小于10时都是个位数)
    console.log(date.getMinutes());   //
    console.log(date.getSeconds());   //
</script>

(2)把日期按习惯格式化

<script>
    // 2022年4月3日 星期日 xx:xx:xx
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    var dates = date.getDate();
    var day = date.getDay();
    var arr = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];

    var hours = date.getHours();
    hours = hours < 10 ? '0' + hours : hours;
    var minutes = date.getMinutes();
    minutes = minutes < 10 ? '0' + minutes : minutes;
    var seconds = date.getSeconds();
    seconds = seconds < 10 ? '0' + seconds : seconds;  

    console.log(year + '年' + month + '月' + dates + '日 ' + arr[day] + ' ' + hours + ':' + minutes + ':' + seconds);
</script>

(3)获取时间戳方法

距离1970年1月1日总的毫秒数

<script>
    // 方法一: value of() 或者 getTime()
    var date = new Date();
    console.log(date.valueOf());
    console.log(date.getTime());

    // 方法二: 简单写法(最常用)
    console.log(+new Date());

    // 方法三: H5 新增
    console.log(Date.now());
</script>

(4)实现倒计时

<script>
    // xx天xx时xx分xx秒
    var nowTime = +new Date();
    var inputTime = +new Date('2022-4-3 23:30:00');
    var times = (inputTime - nowTime) / 1000;
    
    var days = parseInt(times / 60 / 60 / 24); 
    days = days < 10 ? '0' + days : days;
    var hours = parseInt(times / 60 / 60 % 24);
    hours = hours < 10 ? '0' + hours : hours;
    var minutes = parseInt(times / 60 % 60);  
    minutes = minutes < 10 ? '0' + minutes : minutes;
    var seconds = parseInt(times % 60); 
    seconds = seconds < 10 ? '0' + seconds : seconds;
    
    console.log(days + '天' + hours + '时' + minutes + '分' + seconds + '秒');
            
</script>

3、Array 对象

 Array 对象是一个构造函数,调用时要用 new 实例化

<script>
    // 1.不带参数:创建空数组
    var arr1 = new Array(); 
    console.log(arr1);
    // 2.一个参数:创建了长度为参数的数组,里面有参数个空的数组元素
    var arr2 = new Array(2);
    console.log(arr2);
    // 3.多个参数:创建了数组元素为参数的数组
    var arr3 = new Array(2,3);
    console.log(arr3);
</script>

(1)检测是否为数组方法

<script>
    var arr = [];
    var obj = {};
  //对象 Array 中用于检测是否为数组的方法
    console.log(Array.isArray(arr));   //true
    console.log(Array.isArray(obj));   //false
    
    //还可以用运算符 instanceof
    console.log(arr instanceof Array); //true
    console.log(obj instanceof Array); //false
</script>

(2)添加数组元素的方法

<script>
    var arr = [1,2,3,4];
    //1.数组末尾添加元素
    returnPush = arr.push(5,'老师');  //可添加多个元素
    console.log(arr);               //[1, 2, 3, 4, 5, '老师'] 
    console.log(returnPush);        //6 返回新数组的长度
    
    //2.数组前面添加元素
    returnUnshift = arr.unshift(0,'同学'); //可添加多个元素
    console.log(arr);          // [0, '同学', 1, 2, 3, 4, 5, '老师']
    console.log(returnUnshift);       //8 返回新数组的长度
</script>

(3)删除数组元素的方法

<script>
    var arr = ['张三','李四','王五','赵六','孙七'];
    //1.数组末尾删除元素
    var returnPop = arr.pop();  //只能删除一个元素
    console.log(arr);           //['张三', '李四', '王五', '赵六']
    console.log(returnPop);     //孙七 返回删除的元素

    //2.数组前面删除元素
    var returnShift = arr.shift(); //只能删除一个元素
    console.log(arr);        //['李四', '王五', '赵六']
    console.log(returnShift);   //张三 返回删除的元素
</script>  

(4)翻转数组的方法

<script>
    var arr = [1,3,5,6,2];
    var returnReverse = arr.reverse();
    console.log(arr);       //[2, 6, 5, 3, 1]
    console.log(returnReverse); //[2, 6, 5, 3, 1] 返回翻转后的数组
</script>

(5)数组排序的方法

<script>
    var arr = [1,2,4,11,22,44];
    //1.不传参数:将元素转换为字符串再比较
    var returnSort = arr.sort();
    console.log(arr);        //[1, 11, 2, 22, 4, 44]
    console.log(returnSort); //[1, 11, 2, 22, 4, 44] 返回排序后的数组
    
    //2.传参
    //(1)升序排列
    arr.sort(function(a, b) {
        return a - b;       
    });
    console.log(arr);        //[1, 2, 4, 11, 22, 44]
    //(2)降序排列
    arr.sort(function(a, b){
        return b - a;       
    });
    console.log(arr);        //[44, 22, 11, 4, 2, 1]
</script>

(6)获取元素索引号的方法

当一个数组里有多个相同元素时,indexOf 和 lastIndexOf 都只返回一个索引值

<script>
    var arr = ['红','橙','黄','白','白'];
    //1.从前往后找,只找第一个匹配的返回索引
    console.log(arr.indexOf('橙'));  // 1
    console.log(arr.indexOf('黑'));  //-1  数组没有该元素时,返回 -1
    console.log(arr.indexOf('白'));  // 3  只能返回一个索引
    
    //2.从后往前找,只找第一个匹配的返回索引
    console.log(arr.lastIndexOf('橙'));  // 1
    console.log(arr.lastIndexOf('黑'));  //-1  数组没有该元素时,返回 -1
    console.log(arr.lastIndexOf('白'));  // 4  只能返回一个索引
</script>

(7)将数组转化为字符串的方法

<script>
    var arr = [1,2,3,'黑','blue'];
    //1.用 , 分割
    console.log(arr.toString());  // 1,2,3,黑,blue
    //2.自定义分隔符
    console.log(arr.join());      // 1,2,3,黑,blue  不传参:默认用 , 分割
    console.log(arr.join('-'));   // 1-2-3-黑-blue  传参:用传入的字符分割
    console.log(arr.join('&'));   // 1&2&3&黑&blue  
</script>

4、String 对象

字符串所有的方法都不会修改字符串本身(字符串是不可变的)

(1)根据字符返回位置方法

<script>
    var str = '我想你,我想见你';
    console.log(str.indexOf('见'));    // 6  位置从0开始,和数组一致
    console.log(str.indexOf('想'));    // 1  只能返回一个位置
    console.log(str.indexOf('想', 2)); // 5  从位置2开始查找
</script>

(2)根据位置返回字符方法

<script>
    var str = 'andy';
    // 1.返回字符  
    console.log(str.charAt(0));    //a

    // 2.返回字符的ASCII码  (可用来判断用户按下了哪个键)
    console.log(str.charCodeAt(0));  //97

    // 3.返回字符  (H5新增)
    console.log(str[0]);   //a
</script>

遍历字符串如下:

<script>
    var str = 'andy';
    for (var i = 0; i < str.length; i++){  //字符串类型是简单数据包装类型,所以有属性length
        console.log(str.charAt(i));        //通过位置返回字符来遍历字符串的字符
    }
</script>

(3)拼接字符串方法

<script>
    var str = 'andy';
    console.log(str.concat('iscute'));  //andyiscute 和+效果相同,更多地是使用+来拼接
</script>

(4)截取字符串方法

<script>
    var str = 'andy';
    console.log(str.substr(1,2));  // nd  substr(开始索引号,截取的字符长度)
</script>

(5)替换字符方法

<script>
    var str1 = 'andy';
    var str2 = 'andyandy';
    console.log(str1.replace('a', 'b')); //bndy
    console.log(str2.replace('a', 'b')); //bndyandy 只会替换第一个字符
</script>

(6)将字符串转换为数组的方法

<script>
    var str = 'Andy,Jack,Mike';
    console.log(str.split(',')); //['Andy', 'Jack', 'Mike'] 
    console.log(str.split('a')); //['Andy,J', 'ck,Mike']
</script>

 

Posted on 2022-03-10 15:33  choco莉特  阅读(177)  评论(0编辑  收藏  举报