JavaScript基础语法02

目录

一、流程控制

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

顺序结构:代码从上到下依次执行;
分支结构:if , if-else , if else-if , else-if , else{} , switch case ;
循环结构:for , while , do-while , forEach , for in for ;

var age = parseInt(prompt("请输入您的年龄"));

if(age >= 18){
    console.log("可以去看电影了---- 肖生克的救赎");
}else{
    console.log("看什么看,回家敲代码去,敲10遍,你的问题都会迎刃而解了");
}

2. 三元运算符

var 变量 = 表达式1 ? 表达式2 : 表达式3;
执行原理: 首先判断表达式1为true还是flase,如果表达式1为true,则执行表达式2,并把结果返回给前面的变量;如果表达式1为false,则执行表达式3,并把结果返回给前面的变量。

3. 多分支语句

3.1 if else if else if… else{}


if(表达式1){
    代码1;
}else if(表达式2){
    代码2;
}else if(表达式3){
    代码3;
}...

else{
    代码5;
}

执行原理:
首先判断表达式1是否成立,如果表达式1为true,则执行代码1;后面的代码都不执行了;
如果表达式1为false,则继续判断表达式2,如果表达式2为true,则执行代码2;后面代码不再执行;
如果表达式2为false,则继续判断表达式3,如果表达式3为true,执行代码3,后面代码不再执行;
如果表达式3为false,则直接执行代码5;

例子: 成绩的结果


var score = parseInt(prompt("请输入您的成绩"));
if (!isNaN(score)) {
    if (score > 90 && score  100) {
        console.log("A级");
    } else if (score > 80) {
        console.log("B级");
    } else if (score > 70) {
        console.log("C级");
    } else if (score >= 60) {
        console.log("D级");
    } else {
        console.log("E级");
    }
} else {
    console.log("您输入有误,请输入一个正确的数字");
}

3.2 switch-case


switch(表达式){
    case "值1":
        代码1;
    break;
    case "值2":
        代码2;
    break;
    case "值3":
        代码3;
    break;
    ...

    default:
        代码6;
}

执行原理:
首先判断表达式的值,如果表达式的值和值1相同,则执行代码1,代码继续往下执行当遇到break,后面的代码就不在执行了;
如果表达式的值和值1不相同,则继续和值2进行比较,如果表达式的值和值2相同,则执行代码2,代码继续往下执行当遇到break,后面的代码就不在执行了;
…同理
如果表达式的值和上面的值都不相同,则执行 _default_里面的代码


var jiBie = "A";
switch(jiBie){
    case "A":
        console.log("90到100分之间");
    break;
    case "B":
        console.log("80到90分之间");
    break;
    case "C":
        console.log("70到80分之间");
    break;
    case "D":
        console.log("60到70分之间");
    break;
    default:
        console.log("0到59之间");
}

总结: 记得switch特点: 要给具体的值
如果给的是某个范围,推荐使用 if else if else if… else
如果给的是某个具体的值,推荐使用 switch-case


var day = parseInt(prompt("请输入数字"));
switch(day){
    case 1: console.log("星期一"); break;
    case 2: console.log("星期二"); break;
    case 3: console.log("星期三"); break;
    case 4: console.log("星期四"); break;
    case 5: console.log("星期五"); break;
    case 6: console.log("星期六"); break;
    case 7: console.log("星期天"); break;
    default: console.log("您输入有误,请输入正确的数字");
}

3.3 循环

3.3.1 while循环

语法格式:
while(循环条件){
    循环体;
    结束条件;
}

var i = 0 ;
while(i  9){
    console.log(i) ;
    i++;
}

3.3.2 do-while循环

语法格式:
do{
    循环体;
}while(条件);

总结: do-while 至少执行一次循环体,while先判断条件,再决定是否执行循环体,有可能一次循环体也不执行;

3.3.3 for 循环

语法格式:
for(初始化表达式1;条件表达式2;自增表达式3){
    循环体;
}

执行原理: 首先执行初始化表达式1,其次判断条件表达式2,若条件不成立,直接跳出整个循环;若条件成立,执行循环体,再执行自增表达式3,之后再判断条件是否成立,若不成立,则直接跳出整个循环,若成立继续循环,同理;


var sum = 0;
for(var i = 1; i  100; i++){
    sum += i;
}
console.log("1-100的平均值:" + (sum / 100));

3.3.4 break和continue关键字

break关键字: 当程序遇到break;直接跳出当前整个循环,此时这个循环结束,执行循环下面的代码。

while(true){
    console.log("预览");
    break;
}
console.log("跳出");

for(var i = 0; i < 10; i++){
    while(true){
        console.log("break");
        break;
    }
}

continue关键字: 当程序遇到continue,跳出当前本次循环,直接执行下一次循环。

var i=0;
while(i<5){
    console.log(i);
    continue;
    i++;
}

var sum = 0;
var i = 1;
while(i  10){
    if(i % 2 == 0){
        i++;
        continue;
    }
    sum += i;
    i++;
}
console.log(sum);

二、数组

数组: 数组可存储多个数据


var arr = [1,2,3,4,5,6,7,8,9];
console.log(arr);
console.log(arr.length);

var arr= [];
console.log(arr.length);

注:
数组中的数据叫做元素,数组长度即为数组中元素的个数,数组下标从0开始,数组最大下标值为数组长度减1。

数组扩展案例:
1.去掉数组中重复的元素,其他元素存储到新数组中:


var arr = [0, 1, 2, 0, 3, 0, 4, 0, 5, 6, 0, 7, 6, 8, 6, 9];
var newArr = [];
for (var i = 0; i < arr.length; i++) {
    if (newArr.indexOf(arr[i]) == -1) {
        newArr.push(arr[i]);
    }
}

方法二:排序后相邻去除法
function uniqueArr(arr) {
    arr.sort(); // [0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 6, 6, 7, 8, 9]
    console.log(arr);
    var newArr = [arr[0]];
    console.log(newArr); // [0]

    for (var i = 1; i < arr.length; i++) {
        if (arr[i] != newArr[newArr.length - 1]) {
            newArr.push(arr[i]);
        }
    }
    console.log(newArr); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    return newArr;
}
var arr = [0, 1, 2, 0, 3, 0, 4, 0, 5, 6, 0, 7, 6, 8, 6, 9]
uniqueArr(arr)
// 方法三:
// 思路:获取没重复的最右一值放入新数组。
// 检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断
function uniqueArr(arr){
    var newArr = [];
    for(var i=0; i<arr.length; i++){
        for(var j=i+1; j<arr.length; j++){
            if(arr[i] == arr[j]){
                j = ++i;
            }
        }
        newArr.push(arr[i])
    }
    console.log(newArr);
    return newArr;
    // [1, 2, 3, 4, 5, 0, 7, 8, 6, 9]
}
let arr = [0, 1, 2, 0, 3, 0, 4, 0, 5, 6, 0, 7, 6, 8, 6, 9]
uniqueArr(arr);

2.面试题:反转数组
核心思想图解:

JavaScript基础语法02
var arr = [10,20,30,40,50,60,70];

for(var i = 0; i < arr.lengtgh/2; i++){
    var temp = arr[i];
    arr[i] = arr[arr.length - 1 -i];
    arr[arr.length - 1 -i] = temp;
}
consolw.log(arr);

总结:
1.设置即循环次数为数组长度的一半;(交换次数为元素个数一半)
2.通过第三方变量交换首尾两个数据的值;
3.每一次循环尾部的值为 arr.length-1-i ;

三、函数

1. 函数基础

函数: 把一些相同的功能模块封装起来,放到函数里面,需要时可直接调用。


function 函数名(){
    函数体;
}
调用:函数名();

步骤:
1.定义函数;
2.调用函数;

案例:


function everySum(){
    var sum = 0;
    for(var i = 1; i  100; i++){
        sum += i;
    }
    console.log("1-100之间的和:"+ sum);
}

everySum();

函数参数:


function twoSum(x,y){
    var sum = x + y;
    console.log(sum);
}
twoSum(10,20);

总结:
形参:函数定义括号中的变量;
实参:函数调用时括号中的变量数值;
形参作用:接收实参的值。

2. 函数测试

2.1 数组冒泡排序

冒泡排序: 按照一定顺序进行排序(从小到大或从大到小)

两层循环: 第一层控制比较的轮数;第二层循环控制比较的次数。
有循环,有判断,有第三方变量;

5 4 3 2 1
第一轮比较: 4 3 2 1 5 比较次数:4次 arr.length – 1 – 0
第二轮比较: 3 2 1 4 5 比较次数:3次 arr.length – 1 – 1
第三轮比较: 2 1 3 4 5 比较次数:2次 arr.length – 1 – 2
第四轮比较: 1 2 3 4 5 比较次数:1次 arr.length – 1 – 3

总结:
比较轮数:arr.length – 1 (元素个数 – 1);
比较次数:arr.length – 1 – i ;
1.外层循环:0 ~ arr.length – 1;
2.内层循环:0 ~ arr.length – 1 – i;
3.判断内层循环的第一个值与第二个值的大小,通过第三方变量交换。

var arr = [5 , 4 , 3 , 2 , 1];
for(var i = 0; i < arr.length - 1; i++){
    for(var j = 0; j < arr.length - 1 - i; j++){

        if(arr[j] > arr[j + 1]){
            var temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}
console.log(arr);

2.2 函数的返回值

函数返回值:一个完整的函数是有参数和返回值的。

工作中不会在函数里直接输出;一个函数是一个独立的功能模块; 定义一个变量接收函数。


function getSum(x,y){
    var sum = x + y;
    return sum;
}
var result = getSum(10,20);
console.log(result + 10);

总结: 一个完整的函数,必须有参数和返回值;如果一个函数有返回值,则这个函数有return返回值,且调用这个函数时一定要定义一个变量来接收。

2.3 函数参数个数和返回值的问题

实参和形参个数不一致问题:
第一种情况:实参个数大于形参

function getSum(x,y){
    return x + y;
}
var result = getSum(10,20,30,40,50,60);
console.log(result);

结论: 若实参个数大于形参个数,那么多余的实参就会被丢弃。

第二种情况:实参个数小于形参

 function getSum(x,y,z){
    return x + y + z;
}
var result = getSum(10,20);
console.log(result);

结论: 若实参个数小于形参个数,结果为 NaN 。
注意:若没有用到该多余的形参,可正确返回。即return x + y。

注:undefined 情况:
变量声明但没有赋值;
函数没有返回值,在调用时定义了变量来接收了,则函数默认返回值是undefined;

function getSum(x,y){
    var sum = x + y;
}
var result = getSum(10,20);
console.log(result);

函数有返回值return,但后面没有内容,输出结果为undefined;

function getSum(x,y){
    var sum = x + y;
    return;
}
var result = getSum(10,20);
console.log(result);

2.4 return后面的代码不执行

function getSum(x,y){
    return x + y;
    console.log("return后面的代码不执行!");
    return x + y;
}
var result = getSum(10 , 20);
console.log(result);

3. 函数自调用

(function(){
    console.log("自调用函数");
})();

归纳: 该函数为匿名函数,没有函数名,操作DOM,做动画常用。

扩展: 斐波那契数列
案例:已知一对兔子每个月可以生一对小兔子,而一对兔子从出生后第三个月起每个月生一对小兔子,若一年内没有发生死亡,匿名一对兔子一年内能繁殖成多少对?

var num1 = 1;
var num2 = 1;
var sum = 0;
for(var i = 3; i  12; i++){
    sum = num1 + num2;
    num1 = num2;
    num2 = sum;
}
console.log(sum);
       sum      i
1   1   2       3
1   2   3       4
2   3   5       5
3   5   8       6
5   8   13      7
8   13  21      8
13  21  34      9
21  34  55      10
34  55  89      11
55  89  144     12

4. arguments—伪数组

求n个数字的和: arguments;可以获取到用户传递的数据(工作经验:不知道用户会传递几个数据或几个实参)
arguments:可以随时拿到用户传递的参数,不用再写形参了。

之前用数组时要考虑实参与形参的个数的一致性,使用arguments可获取数组长度从而可以不考虑形参问题。

function fun(){
    console.log(arguments.length);
    console.log(arguments);
}
fun(10,20,30,40,50,60,70,80,90);

例: 伪数组arguments求任意数字的和

function getSum(){
    var sum = 0;
    for(var i = 0; i < arguments.length; i++){
        sum += arguments[i];
    }
    return sum;
}
var result = getSum(10,20,30,40,50,60,70);
console.log(result);

总结: arguments 能让代码优化,不用考虑形参。

5. 命名函数和匿名函数

函数的两种写法:
1.命名函数-有函数名

function fun(){
    console.log("命名函数");
}
fun();

2.匿名函数-无函数名:一般用在BOM和DOM

var f1 = function(){
    console.log("匿名函数");
}
f1();

函数案例:封装一个函数,让用户传入年月日,判断这一天是这一年的第几天?

function getDays(year,month,day){

    var days = day;

    if(month == 1){
        return days;
    }

    var months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

    for(var i = 0; i < month - 1; i++){
        days += months[i];
    }
    if(isLeapYear(year) && month > 2){
        days++;
    }
    return days;
}
var result = getDays(2000,3,1);
console.log(result);

function isLeapYear(year) {
    return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}

Original: https://blog.csdn.net/qq_51667621/article/details/127699661
Author: Laker 23
Title: JavaScript基础语法02

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/705199/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球