前端基础学习——js基础

js基础

JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,是一种开发Web页面的脚本语言。

1. js输入输出

1.1. 输入信息

prompt('请输入您的用户名:');
// prompt接收到的是字符串   接受数据类型:string类型;

注意:只要是文字,字母必须加单引号或者双引号,只能用一种。

1.2. 输出信息

 alert("这个是弹窗");

注意:alert:警告,不点击的话,后面的代码不会执行。

1.3. 控制台输出

console.log("这是控制台输出");
// 输出数字
console.log(123);
// 多个输出语法: 用 , 隔开,注意只是console.log()
console.log("用户名", "密码");
// 不识别HTML代码
console.log("<h1>用户名和密码</h1>");

1.4. 在页面文档中输出

// 往HTML页面输出,
document.write("用户名");
// 识别HTML代码,只是 document.write
document.write("<h1>用户名和密码</h1>");

2. 注释

2.1. 单行注释

//,快捷键是ctrl+/,一般做简单的说明。

2.2. 多行注释

/* ctrl+shift+/  
可以回车
写很多的注释
函数、功能:介绍用多行注释;
*/

3. 变量

变量是存储数据值的容器。

语法:定义变量 ,存数据。

关键字: var 变量名

var a;

使用变量:

a = 10;
// =:赋值运算:规则:把右侧的值10,存入左侧的变量里;
// 特点:给a变量存入10,a前面不需要再var;

声明(定义)变量时候,同时进行赋值:

var b = 20;
// 过程1:声明变量  var b;
// 过程2:b = 20;
// 变量 背后代表某个值:
var a = 10;
var b = 20;
console.log(a + b);      //30

把右侧的用户输入的信息,赋值给左侧的info变量里:

var info = prompt("输入年龄:");
console.log(info);

变量可以再次被赋值:

var c = 10;
console.log(c);    // 10 
c = 20;
console.log(c);    // 20

变量运算结果,赋值给自己:

var a = 10;
a = a + 1;         // a += 1;
console.log(a);    // 11

变量储存

var a=10;
// 过程,变量提升
// var a;告诉计算机有一个变量a
// a = 10;计算机会在内存中申请一个用于存储数据的空间,把数据10存入申请的内存空间
// 计算机会为这个空间地址分配一个内存地址

变量命名:

  • 范围:字母、数字、下划线、$符号;
  • 工作上,一般用驼峰命名;
  • 根据公司的需要:变量用英文;
  • 根据公司业务场景,意思来给变量命名。

注意:

  1. 不能以数字开头。
  2. 不能使用关键字和保留字;

变量可以多次声明和赋值:

同时声明多个变量:

var a, b, c, d;

同时声明多个变量且赋值:

var a = 1,b = 2;

案例:

var a = 10;
var b = a;     // 把变量a 里面的值10,赋值(复制)了一份给b;
b = 15;
console.log(a)    // 10
console.log(b)    // 15

4. js基本数据类型

  1. number 类型
var a = 10.1;
var b = NaN;
// NaN:不是某个数,泛指,不确定;
  1. String 类型:字符串
var a = "10.1"
var username = 'admin'

规则:只要两边有单双引号的一种,这个就是String 类型,就是个字符串;
转译字符:特殊的字符;" ’
转一下:JS认为这些特殊的字符,是正常的字符;
语法: ",特点必须写在字符串内;

var info = '我说:"xxxxxxx" ;  他说:'xxxxxxxxx1';     她说:\  ';

字符串遇见 + ,把临近字符串的数据类型 转化为 String类型,形成字符串拼接。

  1. boolean 类型:
var a = true;
var b = false;

作用:描述一件事 对或者错?存在?确定?

  1. Null值
var a = null;
  1. Undefined类型
var a;
// js 会给默认值undefined

5. js检查数据类型

  var a;
  // 默认值:undefined;

  // 两种用法:
  var aType = typeof(a);
  var aType = typeof a;

6. 数据类型转换

6.1. js-转数字

  // ========================================= Number方法
  // 传入:参数,传入要转化的值;
  // 返回值:转化后数据;
  var a = "100";     只能传入纯数字字符串
  a = Number(a);     ----->a=100
  //  var a = "100abc";
  //  a = Number(a);     ----->a=NaN
  //  var a = "abc";
  //  a = Number(a);     ----->a=NaN
  //  var a = true;
  //  a = Number(a);     ----->a=1

  // ========================================== parseInt()方法
  // 返回:整数部分;
  // 传入:参数,转成功的话,只能传入数字部分在前的字符串;
  var b = "10.1abc";
  b = parseInt(b);    ---->b=10
  // 传入是其他(和上面不一样),返回NaN;
  //  var b = true;
  //  b = parseInt(b);    ---->b=NaN
  // var b = "abc10.1";
  //  b = parseInt(b);    ---->b=NaN

  // ========================================== parseFloat()方法
  // JS小数:浮点数;
  // 返回值:整数加小数部分;
  // 传入:转成功的话,只能传入数字部分在前的字符串;
  var a = "10.1abc";
  a = parseFloat(a);  ---->a=10.1

6.2. js-转字符串

  // =================================================String()
  // 传入:数据或者变量;
  // 返回:转换后数据,字符串;
  var b = true;
  b = String(b);
  
  // ===========================================.toString();
  // 格式:注意有个.
  // 注意:undefined和null不能使用这个方式变成字符串;
  // 用法:数据或者变量.toString()
  // 返回:字符串;
  var a = 10;
  a = a.toString();

  // var a = null;
  // a = a.toString();
  // 报错: Uncaught TypeError: Cannot read property 'toString' of null

6.3. js-转Boolean

  // ===============================================Boolean()
  // 参数:传入数据或者变量;
  // 返回:true /false;
  // true:  确定,对,成立;
  // false: 不确定,错误,不存在;
  • 转化为false的几种情况:
var res1 = Boolean(0);
var res3 = Boolean(NaN);
var res2 = Boolean('');         // 空字符,里面啥没有,空格也没有;
var res6 = Boolean(false);
var res5 = Boolean(null);  
var res4 = Boolean(undefined); 

6.4. 数据转换总结

  1. 转Number
  • Number()
    • “100abc”---->NaN; 只识别数字部分;
    • true------->1;
  • parseInt()、parseFloat():
    • “100abc”---->100; 只识别前面的数字部分;
    • true/null/undefined -----> NaN;
  1. 转String:方法内部相当于给要转的这个数据左右两边加单双引号;
  • String(NaN) : ------>“NaN”;
  • null.toString() : 报错, null undefined 不能用.toString();
  1. 转Boolean:
  • 转false情况
    • 空字符串:“”
    • 数字:0、NaN;
    • null、undefined
    • false

7. js-操作符

7.1. 算术操作符

  // +   -   *   /   %
  // 常规:Number类型 进行 算术运算;
  // 场景:奇偶数判断;
  var a = 50 % 2;

  // ----------------------------------特别:字符串 遇见 + ;
  // 规则:字符串遇见 +,使临近字符串的其他数据类型,转化为字符串,形成字符串拼接;
  // 隐式转化:看不见的转化过程;
  var a = 10 + "abc" + 10;       //a="10abc10"
  // "10"+"abc"+"10";
  var b = 10 + 10 + 10 + "55" + 10 + 10;  // b="30551010"从左到右运算,遇到"+"再转换

  // -----------------------------------特别:字符串 遇见 -  *  /  %
  // 规则:字符串会隐式转化Number类型;
  // var a = "abc" - 1;    ---->NaN-1----->a=NaN

  // ------------------------------------特别:++  --:
  // 作用:在自己的基础上进行自增1,或自减1;
  var a = 10;
  a++;
  ++a;

  // 规则:++写在a前面,++a先算,计算后的结果,再往位置上提供数据;
  // var a = 10;
  // var b = ++a + 1;    ------>11+1

  // 规则:++写在a的后面,先往位置上提供数据,再进行a++运算(运算后结果不推到位置上)
  // var a = 10;
  // var b = a++ + 1;    ------->10+1
 
  var a = 10;
  var b = a++ + ++a;     -------->10+12
  
  var a = 10;
  var b = ++a + a++;     -------->11+11

7.2. 比较运算符

  // 比较运算符: >  <  >=  <=
  // 常规:两边都是需要Number类型;
  // = :优先级最低;
  // 返回:Boolean;
  // >= 满足一个就可以;
  var a = 4 >= 4;   // a=true
 
  // 非常规操作规则:非Number类型和Number类型比较,非Number类型会隐式转换为Number类型
  // var a = "abc" > 10; ----->NaN > 10 ----->a=false

  // == 规则:
  // 1.如果两边的数据类型不同,非Number类型转Number类型,看值是否相同;
  // 2.如果两边的数据类型相同,看值是否相等;

  // === 规则:(严格,没有隐式转化)
  // 1.直接先看数据类型,如果数据类型不同,直接返回false;
  // 2.如果两边的数据类型相同,看值是否相等;

7.3. 逻辑运算符

  // && 
  // 且:全部满足,如果有一个条件不满足,直接返回不满足的条件;
  // 执行过程:&& 前后 每个位置上需要一个数据 (Boolean类型)只进行比较,不返回;
  // 返回: 最后成立的结果 或 不成立的结果;
  var a = true && true;

  // || 或:只要满足一个条件就可以;
  // 返回:满足条件的结果;
  var a = 1 || 0;   // 1
  // 只是进行比较:true || false;不进行返回;
 
  // !:取反;
  var a = true;
  // 进行取反的运算;
  var b = !a;
   
  //判断闰年的算法: 能被4整除且不能整除100的为闰年;或者能够被 400 整除的就是闰年
   var year = prompt("请输入年份");
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
        alert("是闰年")
    } else {
        alert("不是闰年")
    }

7.4. 操作符优先级

  // 1. 第一优先级:()
  // 2. 第二优先级:++ -- !
  // 3. 第三优先级: * /  %
  // 4. 第四优先级: + -
  // 5. 第五优先级: > >= < <=
  // 6. 第六优先级: == != === !==
  // 7. 第七优先级: &&
  // 8. 第八优先级: ||
  // 9. 第九优先级: = += -= *= /= %=  

  var a = 200 === (10 + 10) * 10 > 1;
  // 200 === 20 * 10 > 1
  // 200 === 200 > 1
  // 200 === true;
  // false

8. 分支结构

8.1. if-else

语法:

if (条件表达式1) {
    //当条件表达式1的结果是 true 时执行的代码
}
else if (条件表达式2) {
    //当条件表达式2的结果是 true 时执行的代码
}
else if (条件表达式3) {
    //当条件表达式3的结果是 true 时执行的代码
}
// 特点1:上面的分支都是false, 执行else的分支:
// 特点2:else 分支不是必须的;else只能出现一次;
else {
    //多个条件表达式的结果都是 false 的时候执行的代码
}

8.2. switch-case

语法:

switch (key) {
   case value:
     // JS代码;
     break;
   default:
     break;
 }

特点

  • 与固定值进行比较。
  • key:传入的数据;
  • value:其中一个固定值,数据要和固定值进行比较:数据===固定值。

注意:

  1. :不能省略,
  2. break当前情况的结束;
  3. default:所有情况都不满足时,执行default;

8.3. 三元表达式

三元表达式其实是if else 的简写,有返回值。

表达式1 ? 表达式2 : 表达式3;
// 过程:
// 如果表达式1 执行结果为true。执行表达式2,把表达式2的结果作为整个三元表达式的结果进行返回;
max = a > b ? a : b;

// 三元表达式只要前面的条件成立,就会指向?后面的语句,可以是一条或多条; 多条的话使用逗号分隔

9. 循环结构

9.1. while循环

作用:有重复的思想在里面,有规律的变化,循环:重复;

语法:

// condition:条件表达式,返回Boolean值;不是Boolean值,隐式转化为Boolean;
// while (表达式) {
//   循环体;
//   alert("这是个病毒");
// }
//条件表达式为true,执行循环体

var num = 1;
while (num <= 10) {
sum = sum + num;
num++;
}

var num = 1;
while (num <= 100) {
if (num % 2 == 0) {
console.log("偶数是" + num);
}
num++;
}

9.2. for循环

// 先执行初始化表达式 var num = 1; 在整个循环里面,只执行一次;
// 进入条件表达式: num<=100;
// 返回true ,执行循环体;
// 返回fasle ,终止循环;
// 执行完循环体以后,才执行自增表达式: num++;
for (var num = 1; num <= 3; num++) {
    // 循环体
    console.log(num);
}
// 特点:有执行第4次,判断条件为false,循环结束;

//打印金字塔
for (var a = 1; a <= 10; a++) {
    for (var b = 1; b <= a; b++) {
        document.write("o");
    }
    // 换行
    document.write("</br>");
}

9.3. do-while循环

// 条件表达式:位置上需要一个Boolean值,若不是Boolean,会隐式转化;
// while (true) {
//   alert(1);
// }

do {
    // 循环体
    alert(1)
} while (false);
// 至少会执行一次;
  • while、do-while 循环不易看出循环的次数,一般用于未知次数的循环
  • for循环明显看出循环的次数,一般用于已知次数的循环;使用最多是for;

执行特点:

  • while、for循环可能一次循环都不会执行
  • do-while循环至少执行一次;

9.4. break和continue

  • break:终止当前循环
  • continue:跳过本次循环
// 例子:电梯一共有6层,现在我们要上电梯,我们的教室在3楼,电梯只要到3楼就可以了。
// 1. 每一层都要停;
// 2. 到了3层,终止循环;
for (var a = 1; a <= 6; a++) {
    console.log(a);
    // 到了3层
    if (a == 3) {
        // 终止 当前 for 循环整体;
        break;
    }
}

// 例子:电梯一共有6层,除了3楼没人下去,其他楼层都有人下去(3楼不停,其他楼层都要停)
// 1. 每层都停;
// 2. 到了这一次for循环,不需要执行;
for (var a = 1; a <= 6; a++) {
    if (a == 3) {
        // 作用:跳过 当次 循环,意味着写在 continue 本次后面的代码,都不会执行了;
        // continue:本次不用执行了,继续往下一次执行;
        continue;
    }
    console.log(a);
}

注意:

  1. break必须在switch语句或者是在for循环中使用。
  2. break可以在for循环的循环体中使用,可以在一个循环中多次使用break。
  3. switch语句中经常会出现多个break。
  4. break可以在循环中搭配if一起使用,但是不能单独使用。

10. 输出0-100之间的所有质数

// 1,2 都为质数
for (var a = 3; a <= 100; a++) {
        for (var n = 2; n <= a; n++) {
            if (a % n == 0) {
                break;
            }
        }
 //a == n为true,意味着n已经全部循环完毕,没有中断过,没有一次被整除      
        if (a == n) {
            console.log(a)
        }
    }

for (var a = 3; a <= 100; a++) {
    var is_zhishu=true;
        for (var n = 2; n <a; n++) {
            if (a % n == 0) {
                is_zhishu = false;
            }
        }
        if (is_zhishu) {
            console.log(a)
        }
    }

11.数组Array

声明数组:

  • 索引:位置,数字表示,从0开始。
//1.字面量声明  
var arr = [];
arr[0] = 97;
var arr_1 = [90, 50, "abc", true];
//2.构造函数声明
var arr = new Array();

// var arr = [10, 10, 10]
// var arr_1 = new Array(10, 10, 10);

// 单个值:传入,构造函数会把这个数据当作数据个数;
// var arr = [10];
// var arr_1 = new Array(10);

// 第一个位置上数据被替换,arr[0]可以当作变量使用;
arr[0] = 200;

数组长度:

arr.length  
//最大索引总是比长度少 1 ;因为索引是从0(第一位)开始

遍历数组:

var arr = [10, 10, 10]
for (var i = 0; i < arr.length; i++) {
    sum += arr[i];
}

清空数组:

arr.length = 0;

数组方法:

11.1. push从后面添加到数组

var arr = [1, 2, 3, 4, 5, 6];
// 作用:把一个元素或多个元素,从数组后面添加到数组里面;
// 参数:添加的数据
// 返回:添加后的数组的长度;
var l = arr.push(8, "abc");
console.log(arr, l);

11.2. pop从后面删除一个元素

// 作用:从数组的后面删除一个元素
// 参数:无;
// 返回:被删除的元素;
var res = arr.pop();
console.log(arr, res);

11.3. unshift从前面添加数据

// 作用:从数组前面添加数据(一个或者多个)
// 参数:一个或者多个;
// 返回:添加后的数组的长度
var l = arr.unshift("a", "b");
console.log(arr, l);

11.4. shift从前面删除第一个元素

// 作用:从数组的前面删除一个元素
// 参数:无;
// 返回:被删除的元素;
var res = arr.shift();
console.log(arr, res);

11.5. splice可进行数组任何位置的增删改

var arr = ['a', 'b', 'c', 'd', 'e'];
// 删除:
// 参数:第一个参数是开始的下标,第二个参数:要移除的个数;
// 返回:被删除元素的数组;
var res = arr.splice(3, 1);
// console.log(arr);----->['a', 'b', 'c',  'e']     删除元素对原数组进行操作
// console.log(res);----->['d']

// 添加:
// 参数:第一个参数:开始下标;第二个参数:删除个数;后面参数:要添加的数据,从开始下标位置添加
// 返回:没有删除,返回[]
var res = arr.splice(3, 0, "AA", 18);
// console.log(arr); ---->["a", "b", "c", "AA", 18, "d", "e"]
// console.log(res); ---->[]

// 修改:
// 参数:第一个参数:开始下标;第二个参数:删除个数;后面参数:要添加替换的数据,从开始下标位置
// 返回:被替换的数据的数组;
var res = arr.splice(3, 1, "HH");
// console.log(arr); ----->["a", "b", "c", "HH", "e"]
// console.log(res); ----->["d"]

11.6. 数组与字符串互转

var str = '刘备|关羽|张飞';
console.log(str);

// 字符串---->数组:
// 参数:分隔符,把字符串中和分隔符一样的地方,切割开;
// 返回:数组;
var arr = str.split("|");
console.log(arr);

// 数组----->字符串
// 参数:分隔符;
// 返回:字符串;
var str_1 = arr.join("*");
console.log(str_1);

11.7. indexOf数组中查找元素

// ---------------------------------------------indexOf  
// 参数:被查找的元素
// 返回:被查找的元素的下标索引(没有找到返回-1)
// 场景:查找数组中有没有我们需要的数据;
var arr = [1, 10, 20];
var index = arr.indexOf("a");
console.log(index);     ----->-1

// ----------------------------------------------findIndex
// 参数:函数(被传入的函数,回调函数)
// 格式要求:
// item  回调函数,代表每一次遍历的数据
// return 判断条件(自己写)
// 返回:满足条件的第一个元素的下标,若没有,返回-1;
var index = arr.findIndex(function(item) {
    return item === 20;
});
console.log(index);

11.8. 遍历数组

forEach:

var arr = [0, 10, 10, 10, 20];  
// 作用:遍历数组
// 参数:函数(函数)格式要求:
// 函数参数:item,index,arr
// item:每个数据
// index:下标;
// arr:当前遍历的数组;

var max = arr[1];
arr.forEach(function(item, index, arr) {
    console.log(item, index, arr);
    if (item > max) {
        max = item;
    }
});
console.log(max);

filter:

// 作用:对当前数组一定的过滤;
// 参数:函数(函数)格式要求:
// 函数参数:item,index,arr
// item:每个数据
// index:下标;
// arr:当前遍历的数组;
// return 过滤条件; 返回是true,把当前满足条件的item 放入新的数组中
// 返回:返回过滤后的新数组;

var arr_1 = arr.filter(function(item, index, arr) {
    // 过滤条件; 返回是true,把当前满足条件的item 放入新的数组中
    return item == 10;
});
console.log(arr, arr_1);

11.9. concat 数组拼接

// 作用:数组的拼接
// 参数:要拼接的数据(单个数据、多个数据、单个数组,多个数组)
// 返回:拼接后的新数组;

var arr1 = [1, 2, 3];
var arr2 = [4, 5, 6];
var arr3 = [7, 8, 9];
var res = arr1.concat(arr2, arr3);
console.log(arr1, res);

11.10. slice截取数组

// 作用:截取数组
// 返回:被截取的新数组;
var arr = ['a', 'b', 'c', 'd', 'e'];

// 参数:2个参数。第一个参数从哪个下标开始(包括),截取到哪个下标结束(不包括),
var res = arr.slice(1, 4);
console.log(arr, res);

// 参数:1个参数,从哪个下标开始,一直到结尾都要截取
var arr_1 = arr.slice(1);
console.log(arr_1);

// 参数:没有参数,全部截取,复制数组;
var res = arr.slice();

// 数组:复杂数据类型;
// console.log(res, arr);
// console.log(res == arr);   ---->false

11.11. 数组复制

需求:复制过来的新数据和原来的数据没有任何关系

var arr = ["a", "b", "c", "d"];

// var arr_1 = arr;
// arr_1[0] = "abc";
// console.log(arr);   ---->arr = ["abc", "b", "c", "d"];

// -----------------------------------------------------------for
for (var i = 0; i < arr.length; i++) {
    arr_1[i] = arr[i]
}
arr_1[0] = 10
console.log(arr_1, arr);

// -----------------------------------------------------------forEach
// arr:可选参数
// var new_arr = [];
arr.forEach(function(item, index) {
    new_arr.push(item);
});
new_arr[0] = "abc";
console.log(new_arr, arr);

// ------------------------------------------------------------filter
// 作用:满足过滤条件的元素,组成1个新数组返回;
var new_arr = arr.filter(function(item, index, arr) {
    return arr.indexOf(item) != -1;
});
// arr.indexOf(item) != -1条件:过滤条件结果为true , 把当前的item组成到新的数组里;
// new_arr[0] = "abc";
// console.log(new_arr, arr);

// ------------------------------------------------------------拼接和截取
// 参数:不传入
// 返回:新数组(和arr一样)
var new_arr = arr.concat();
// new_arr[0] = "---------------------";
// console.log(new_arr, arr);

// 参数:不传入
// 返回:全部截取,新数组(和arr一样)
var new_arr = arr.slice();
// new_arr[0] = "-----------++----------";
// console.log(new_arr, arr);

// ------------------------------------------------------------与字符串的互转
var str = arr.join("-");
console.log(str);
var new_arr = str.split("-"); // 新数组
new_arr[0] = "-----------++----------";
console.log(new_arr, arr);

11.12. 数组排序 sort()

sort() 方法用于对数组的元素进行排序。

var arr = [11,52,74,85,96,15];
arr.sort(sortby)
// sortby	可选。规定排序顺序。必须是函数。
// 返回值:对数组的引用。

// 注意:数组在原数组上进行排序,不生成副本。

// 如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,
// 说得更精确点,是按照字符编码的顺序进行排序。
// 要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。

// 如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,
// 然后返回一个用于说明这两个值的相对顺序的数字。
// 比较函数应该具有两个参数 a 和 b,其返回值如下:

// 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
// 若 a 等于 b,则返回 0。
// 若 a 大于 b,则返回一个大于 0 的值。

11.13. 数组倒序reverse()

reverse() 方法用于颠倒数组中元素的顺序。

var arr = [11,52,74,85,96,15];
arr.reverse();

// 注意:该方法会改变原来的数组,而不会创建新的数组。

12. 转义字符-换行

换行:\n;  转译字符:把特殊字符 " ' \  \n

13. ES6 语法:模板字符串:``

// 反引号``
// 字符串拼接
// 2019-11-12 14:53:33
// var str = year + "-" + month + "-" + riqi + " " + hour + ":" + minute + ":" + second;
// ES6 语法:模板字符串;``  
// 特点:`` 单双引号直接用法;变量放在${}里面
var str = `${year}-${month}-${riqi} ${hour}:${minute}:${second}`;

14. 冒泡排序

// 1.比较相邻的两个元素,如果前一个比后一个大,则交换位置。
// 2.第一轮的时候最后一个元素应该是最大的一个。
// 3.按照步骤1的方法进行相邻两个元素的比较,由于最后一个元素是最大的,所以最后一个不用比较    
var arr = [74, 54, 23, 41];
for (var i = 0; i < arr.length - 1; i++) {          //需要比较arr.length-1次
    for (var j = 0; j < arr.length - 1 - i; j++) {  //大的数放在后面,每次前几个数值比较
        if (arr[j] > arr[j + 1]) {
            var key = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = key;
        }
    }
}

15. 函数

作用:函数将重复出现的代码封装起来;在需要的地方进行调用(复用)。

// function:声明函数的关键字 
function fn() {
    // 封装的代码;不会自己调用;
}
// 调用语法:函数名();
fn();

15.1. 函数的形参、实参

  • 形参:内部定义的这个变量,只能在内部使用;外面不能使用;和外面没有任何关系。
  • 实参:外部调用函数的时候,传入真实数据,实参;把真实数据赋值了一份给形参。
function sum(n, m) {
    var num = 0;
    for (var i = n; i <= m; i++) {
        num += i;
    }
    // 返回的是数据
    return num;
}
var num =sum(10,20);

// 函数定义时有形参,调用时不传入参数,没有实参传入,JS内置给赋值为undefined
// 形参的个数可以多于实参的个数
function fn(a) {
    console.log(a);
}
fn(); // 输出undefined

15.2. 函数返回值return

作用:把内部运算结果,返回给到外面;

function fn(a) {
    a = a + 10;
    return a;
}
// 外面:需要找个变量接受
var b = fn(10);

注意:

  1. 函数返回值,把内部的值进行返回,返回到外面;
  2. 只要函数内部出现了return,函数内return下面的代码(函数内)不再执行;
  3. 如果return 后面没有任何数据(变量),默认返回undefined;
  4. 如果连return都没有,函数就没有返回值,执行函数,默认返回undefined;

15.3. 函数参数-arguments

  • arguments:解决参数个数不确定;
  • 函数内部(里面)的变量;只能在函数内部使用;
  • 特点:JS内置的变量,不需要我们声明,也不需要写在小括号内;
  • 语法:arguments把参数传入值,都接收到,生成一个伪数组;
  • 伪数组:和数组很像,但不是数组。伪数组有下标,有长度,可遍历;
function fn() {
    console.log(arguments);
}

fn(1, 10, 20, 66, 89, 88, 99);
Arguments(7) [1, 10, 20, 66, 89, 88, 99, callee: ƒ, Symbol(Symbol.iterator): ƒ]

15.4. 函数表达式

  • 函数表达式是另外一种声明函数的方式。
  • 必须先声明后调用,否则程序报错。
var fn = function() {
    console.log(1);
}
fn();

15.5. 匿名函数

  • 匿名函数:函数没有名字;
  • 特点:不能单独使用:
function () {
    console.log(1);
} // 报错: Uncaught SyntaxError: Unexpected token 

// 使用1:函数表达式;
var fn_2 = function() {
    console.log(1);
};

// 使用2:自调用(自执行)函数;
(function() {
    console.log(1);
})();

15.6. 回调函数

// 参数:传入的是函数,这个被传入的函数(作为参数)就叫回调函数;
function demo() {
    console.log("1");
}
fn(demo);

16. js-作用域

在ES6之前,作用域可以分为全局作用域和局部作用域,ES6才出现块级作用域。

  • 全局作用域:在script 里面声明的变量,函数 function 作用域范围:全局作用域;
  • 规则:全局声明的变量,在JS代码任何位置都可以使用;包括局部作用域(函数内部);
  • 全局变量可以在函数内部使用;
var a = 1;
function fn() {
    console.log(a);
}
fn(); 
  • 局部作用域:函数内部的范围 function fn() { 局部作用域 } 。
  • 局部变量:函数内部声明的变量;规则:只能在函数内部使用;在外面不能访问;

17. js-预解析

  • 预解析,会把声明的变量和函数提升到当前的作用域的最顶端,也叫变量提升和函数提升;
  • 规则:遇到一个新的作用域,声明:var 变量;function fn(){},提升到当前作用域最顶端;
// 全局作用域
console.log(a);    ---->undefined
var a = 1;
//模拟内存的解析过程如下:
var a;
console.log(a); // undefined;
a = 1;

18. js-作用域链

  • 局部变量的寻找规则:先在当前自己的作用域的中找有没有声明的变量,如果没有往上层作用域找,如果上层作用域也没有该变量,就报错;

19. 对象

对象:属性和方法的集合体;

19.1. 对象创建

// 1.字面量
var obj = {};
console.log(obj);

// 2.构造函数
var obj_1 = new Object();
console.log(obj_1);

19.2. 对象添加属性

// ----------------------------点方式
// 对象.属性名 = 属性值
obj.name = "狗蛋";

// 对象.方法名 = 匿名函数;
obj.say = function() {
    console.log("1");
}

// ----------------------------初始化的时候,进行属性和方法的添加
var obj = {
    name: "zhangsan",
    age: 16,
    say: function() {
        console.log(1);
    },
};
// 格式:名字:属性值 或者 匿名函数;客观来说,属性和方法名都是名字;
// 注意:每组后面必须有逗号,最后一组可以不加

// ---------------------------键值对 [] 方式
// 键:属性名或者方法名;
// 值:属性值或匿名函数;

var obj = {};
obj["name"] = "狗蛋";
obj["say"] = function() {
    console.log(1);
};
  • 注意:
// 键值对和点方式区别:[属性名和方法名必须是字符串]
var a = "name";
// a暂时变量,变量后面的值属性名;
obj[a] = "狗蛋";

// 有个属性名叫a
obj.a = "狗蛋a"

19.3. 对象获取及遍历属性

// -------------------------------------------点方式获取  设置属性
var obj = {
    a: 1,
    b: 2,
};

// 获取一个对象上没有的属性名后的值,返回的undefined;
console.log(obj.key);      ----->undefined

console.log(obj.a);     // ----->1
obj.a = "abc";          // 重新设置属性值
console.log(obj.a);     // ----->"abc"

// -------------------------------------------键值对 [] 方式
console.log(obj["a"]);
obj["a"] = "abc";
console.log(obj);

// -------------------------------------------对象遍历 for in
// 语法:遍历就是循环;
// key:代表每一次循环的名字(属性名和方法名)
// key:"a"
// key:"b"
// object: 遍历循环的对象 obj
for (var key in obj) {
    console.log(key, obj[key]);
}

// 遍历数组
var arr = [1, 2];
for (var key = 0; key < arr.length; key++) {
    console.log(key, arr[key]);
}

19.4. 对象复制

var obj = {
    a: 1,
    b: "abc"
};

// var new_obj = obj;
// new_obj.a = 2;
// console.log(obj.a);   ------>2

// 遍历对象
var new_obj = {};
for (var key in obj) {
    new_obj[key] = obj[key]
}

20. js简单类型与复杂类型

  • 规则:内存上有个地方,栈、堆。
  • 简单数据类型存在栈上。
  • 复杂数据类型存在堆上。
function fn(b) {
    // 局部变量b 
    b = 2;
}
var a = 1;
fn(a);
// b = a;
console.log(a);   ----->1
--------------------------------------------------------------
var a = 10;
var b = a;
b = b + 10;
console.log(a, b);  ----->10  20
--------------------------------------------------------------
var obj_1 = {
    a: 10
};
// 赋值,自己运算把原来的数据影响
var obj_2 = obj_1;
obj_2.a = 20;
console.log(obj_1.a);   ----->20
--------------------------------------------------------------
//  复制数据类型
function f2(o) {
    o.name = '翠花';
}
var a = {
    name: '狗蛋'
}
f2(a);
// o = a; // a 给了 o 地址;
// 最终a的name属性是多少?  翠花
console.log(a.name);    ---->翠花
----------------------------------------------------------------
var a = 10;
var b = 10;
// 类型相同,比值:格子里存的值;
console.log(a == b);    ------>true

var c = {};
var d = {};
//类型相同,比值:格子里存的值;地址不同,复杂数据类型,存放在堆
console.log(c == d);    ------->false

21. Math 对象

21.1. Math.random()随机数

// 随机小数:  JS内置对象 Math
// 返回:[0~1)随机小数;有可能会取值为0,有可能的概率很低;不包括1;
var a = Math.random();
a *= 256;

21.2. Math.floor()向下取整

// floor:地板;
// 传入:向下取整的数据;
// 返回:向下取整后的值; 
var a = Math.floor(a);   // 向下取整

21.3. Math.ceil()向上取整

// ceil 天花板
//Math.ceil();   向上取整;
var b = Math.random();
b *= 256;
b = Math.ceil(b);

21.4. Math.round()四舍五入

var a = 3.999999;
// 四舍五入
var res = Math.round(a);

21.5. Math.abs()取绝对值

var b = -5.33;  
// 返回绝对值,求正;不是取整数;
var res_b = Math.abs(b);

21.6. Math.max()取最大值

// 求一堆数中最大值;
// var c = Math.max(8, 4, 5, 7, 3, 99, 599, 299, 399);
// console.log(c);

// 需求:函数输入一些数字,求最大值;
// var d = MAX(8, 4, 5, 7, 3, 99, 599, 299, 399);
Math.MAX = function() {
    // 伪数组:有长度,有下标,可遍历
    // console.log(arguments);
    var max = arguments[0];
    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i] > max) {
            max = arguments[i];
        }
    }
    return max;
};
var c = Math.MAX(8, 4, 5, 7, 3, 99, 599, 299, 399);
console.log(c);

21.7. Math.min()取最小值

// 求一堆数中最小值;
var c = Math.min(8, 4, 5, 7, 3, 99, 599, 299, 399);
// console.log(c);

21.8.Math的n-m的随机整数

需求 : Math上拓展方法,用途:范围 n~m 随机整数 n<m

// 1.实际过程:0-10;  10个数,中间间隔11个数

// 扩大:10-0+1
var a = Math.random();
a = a * (m - n + 1);
// 缩小:向下取整;
a = Math.floor(a);

// 0-10 范围 向后挪动 n个;
// a = a + n;

// 2.函数封装:
// 0-10
// n-m
function getRandomInt(n, m) {
    var a = Math.random();
    a = a * (m - n + 1);
    a = Math.floor(a);
    a = a + n;
    return a;
}

//3.设置到对象上
Math.getRandomInt = function(n, m) {
    var a = Math.random();
    a = a * (m - n + 1);
    a = Math.floor(a);
    a = a + n;
    return a;
};

// 根据业务,丰富对象;
var a = Math.getRandomInt(60, 62);

22. 时间对象new Date()

var date = new Date();    // 时间对象
// 语法:date.方法名();  必须跟着小括号

// 返回:年份
var year = date.getFullYear();

// 返回:月份:从0,开始  0-11
var month = date.getMonth() + 1;
if (month < 10) {
    month = "0" + month;
}
month =(month + '').padStart(2,'0')

// 返回:日期:
var riqi = date.getDate();
if (riqi < 10) {
    riqi = "0" + riqi;
}
riqi =(riqi + '').padStart(2,'0')

// 返回:星期
// var day = date.getDay();  

// 返回:时
var hour = date.getHours();
if (hour < 10) {
    hour = "0" + hour;
}
hour =(hour + '').padStart(2,'0')

// 返回:分
var minute = date.getMinutes();
if (minute < 10) {
    minute = "0" + minute;
}

// 返回:秒
var second = date.getSeconds();
// 单位数:补位双位数
if (second < 10) {
    second = "0" + second;
}

22.1. 获取时间年月日时分秒

var date = new Date(); // 得到的是当前时间的日期对象
  • 获取年月日时分秒
console.log(date.getFullYear()); // 年份
console.log(date.getMonth());    // 月份,从0开始

// 英语:日期date   day某天
console.log(date.getDate());  //日期
console.log(date.getDay())    //星期
console.log(date.getHours()); // 小时,0-23
console.log(date.getMinutes()); // 分钟 , 0-59
console.log(date.getSeconds()); // 秒数 , 0-59
console.log(date.getMilliseconds()); // 毫秒 0-999 , 1秒 = 1000毫秒
  • 创建一个指定日期的对象
// 给一个日期格式字符串
var date = new Date('2019-01-01');

// 特定的格式1: 输入一个字符串
var date = new Date("2018-08-23 12:00:12");
// month从0开始
var month = date.getMonth() + 1;
console.log(month);

// 分别传入年月日时分秒。注意传入的月份是从0开始算的
var date = new Date(2019,0,1,12,33,12);

// 特定的格式2:传入是数字;
var date = new Date(2018, 7, 23, 12, 00, 12);
var month = date.getMonth() + 1;
console.log(month);

22.2. 获取时间戳

  • 获取从1970年1月1日到现在的总毫秒数,常说的时间戳
// 比较:"2018-08-23 12:00:12"   "2019-11-17 12:00:12"
// 哪个靠未来些?

var date = new Date(); // 当前时间对象;
// 返回:数字,当前时间点距离 1970年1月1日 毫秒数,时间戳;
console.log(date.valueOf());
console.log(date.getTime());
console.log(1 * date);
console.log(Date.now());

// 场景1:JS测试用生成ID:
// var id = Date.now() * Math.random();

// 场景2:比较时间字符串的大小;
var date_1 = new Date("2018-08-23 12:00:12");    //创建一个指定日期的对象
var time_1 = date_1.valueOf();
console.log(time_1);

var date_2 = new Date("2019-11-17 12:00:12");
var time_2 = date_2.valueOf();
console.log(time_2);

if (time_2 > time_1) {
    console.log("2019-11-17 12:00:12");
} else {
    console.log("2018-08-23 12:00:12");
}

23. String字符串

23.1. 字符串不可变

字符串不可变:

  • 旧的字符串赋值在一个变量上,给变量重新赋值新的字符串(完全新的字符串,或者拼接后字符串),旧的字符串不是被覆盖;而是处于在内存的游离状态;
  • 所以尽量避免大量使用字符串的拼接;这个算性能优化的一点;

23.2. indexOf()查找字符

  • 作用:查询字符所在字符串的位置;
  • 参数:查询字符
  • 返回:下标,若没有查询到,返回-1;
var str = '我爱中华人民共和国';
var key = str.indexOf("通州");
console.log(key);

// 场景:查询是否有敏感字;
  • lastIndexOf 用法和indexOf一样,只不过是从后面开始找;
  • charAt:
// 这个方法用于获取字符串中位于指定位置的字符
var str = '我爱中华人民共和国';
console.log(str.charAt(2));    // ----->中
  • charCodeAt :
// 这个方法用于获取字符串中位于指定位置的字符的ASCII码
var str = 'abcdef'
console.log(str.charCodeAt(0));

23.3. split()-字符串转为数组

// 案例:解析地址`b.com?id=1&name=2`中的参数; 
// 地址:https://www.baidu.com/s?wd=a&rsv_spt=1  GET请求
// 解析:id=1&name=2  变成对象  {id:1,name:2}

var str = "b.com?id=1&name=2";
var arr = str.split("?");
// console.log(arr);   ---->["b.com", "id=1&name=2"]

str = arr[1];
// console.log(str);   ----->["id=1&name=2"]
var arr_1 = str.split("&");
// console.log(arr_1);  ["id=1", "name=2"]

// 遍历:
var obj = {};
var one, key, val;
for (var i = 0; i < arr_1.length; i++) {
    // 其中的一样被分隔为数组  ["id", "1"]
    one = arr_1[i].split("="); // 
    // 数组中第一项:对象中属性名  键
    key = one[0]; // id
    // 数组中第二项:对象中属性值  值
    val = one[1]; // "1"
    // 对象上设置 对象[属性名]
    obj[key] = val; // obj["id"] = "1";
}

console.log(obj);

23.4. 字符串拼接与截取

  • 下面的方法都没有对原字符串进行操作,返回新的字符串;
// ----------------------------------------------------------拼接concat 
// 作用:可以与多个字符串进行拼接  
// 参数:拼接的数据
// 返回:拼接后新的字符串;
var res = str.concat("--------", '88888');
console.log(str, res);

// ----------------------------------------------------------截取substring
// 作用:截取字符串
// 参数:第一个参数:截取开始的下标(包括);第二个参数:截取结束的下标(不包括)
// 返回:截取出来的字符串
var res = str.substring(0, 3);
console.log(str, res);

// -----------------------------------------------------------截取slice
// 作用:截取字符串;
// 参数:第一个参数:截取开始的下标(包括);第二个参数:截取结束的下标(不包括)
// 返回:截取出来的字符串
var res = str.slice(0, 3);
console.log(str, res);

// 特别:参数可以设置负数,遇见负数,内部(负数+字符串的长度--->值 下标)
var str = "abcdefghjk";
var res = str.slice(-6, 7);   // -6 + 10
var res_1 = str.slice(4, 7);
console.log(res, res_1);

// --------------------------------------------------------------截取substr
// 作用:截取字符串
// 参数:第一个参数,开始下标。第二个参数,截取的个数;
// 返回:被截取新字符串,没有对原字符串修改;
var res = str.substr(2, 3);
console.log(res);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值