JS基础

JS基础

将之前的一些博客整合在了一起

JS编程基础

  • 编程 :就是计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程
  • 计算机程序: 就是计算机所执行的一系列的指令的集合,而程序全部都是我们用所掌握的语言来编写的,所以人们要控制计算机一定要通过计算机语言向计算机发出指令
  • 注意: 上面所定义的计算机指的是任何能够执行代码的设备

计算机的组成

  • 硬件
    输入设备 键盘鼠标
    输出设备 显示器打印机
    cpu 负责处理数据和运算
    硬盘 负责存储数据,硬盘永久存储数据
    内存 内存暂时存储数据

  • 软件

     	系统软件		windows,Linux,masos
     	应用软件		浏览器,qq
    

数据存储

  • 计算机内部使用二进制0和1来表示数据
  • 所有数据包括文件图片最终都是以二进制数据存放在硬盘中,平时我们说的安装软件就是把程序文件复制到硬盘中
  • 硬盘内存保存的都是二进制数据
  • 数据的存储单位 bit<Byte<KB<MB<GB<TB<…

位(bit) 1bit可以保存一个0或者1
字节(Byte) 1Byte=8bit
千字节(KB) 1KB=1024Byte
兆字节(MB) 1M=1024KB
吉字节(GB) 以此类推
太字节(TB) 以此类推

  • 程序的运行

硬盘------>-内存条------------>cpu

1.打开某个程序时,先从硬盘中把程序的代码加载到内存中
2.cpu执行内存中的代码
注意:之所以要内存的一个重要原因,是因为cpu运行太快了,如果只从硬盘读数据,会浪费cpu性能,所以才使用存取速度更快的内存来保存运行时的数据(内存是电,硬盘是机械)

初识javascript

  • javascript是运行在客户端的脚本语言
  • 脚本语言:不需要编译,运行过程中由JS解释器(JS引擎)逐行来进行解释执行

HTML/CSS/JS的关系

HTML/CSS是标记语言——描述类语言

  • HTML决定网页的结构,相当于身体
  • CSS决定呈现给用户的模样,相当于衣服

JS脚本语言——编程类语言

  • 实现业务逻辑和页面控制,决定功能,相当于人的动作

浏览器执行JS

浏览器分成两部分:渲染引擎和JS引擎

  • 渲染引擎:用来解析HTML和CSS,俗称内核
  • JS引擎:也称为JS解释器。用来读取网页中的javascript代码,对其处理后运行。比如chrome的v8

注意:浏览器本身并不会执行JS代码,而是通过内置的javascript引擎来执行js代码。js引擎执行代码时逐行解释每一句源码(转换为机械语言),然后由计算机去执行。

js的组成

ECMAScript(javascript的语法):由ECMA国际进行标准化的一门编程语言。规定了js的编程语法和基础核心知识,是所有浏览器厂商共同遵守的一套js语法工业标准
DOM——文档对象模型:是w3c组织推荐的处理可扩展标记语言的标准编程接口。通过DOM提供的接口可以对页面上的各种元素进行操作
BOM——浏览器对象模型:提供了独立于内容的,可以与浏览器窗口进行互动的对象结构,通过BOM可以操作浏览器窗口

js的书写位置

js的书写格式与css差不多,值得注意的是引用外部js文件在script中间不可以写代码

JS变量

变量:是用来存放数据的容器,我们通过变量名获取数据。
本质:变量是程序在内存中申请的一块用来存放数据的空间

//变量在使用时分为两步:1.声明变量 2.赋值
    //1.声明变量  
    var age;
    //age是定义的变量名,我们通过变量名来访问内存中分配的空间
    //2.赋值 
    age = 10;
    //用来把右边的值赋给左边的变量空间中
    //变量值是程序员保存到变量空间的值
    //3.变量的初始话 
    var age = 18;
    //声明一个变量并赋值,我们称为变量的初始化
	//一个变量被重新赋值后,原有的值会被覆盖,变量值以最后赋的值为准

变量命名规范

  • 由字母,下划线,数字,美元符号组成
  • 不能以数字开头
  • 严格区分大小写
  • 不能是关键字,保留字
  • 变量名必须有意义
  • 遵守驼峰命名法

JS数据类型

为什么需要数据类型:因为在计算机中,不同的数据占用的存储空间是不同的,为了便于把数据分成所需内存大小不同的数据,充分利用存储空间,于是定义了数据类型

变量是用来存储值的所在处,他们有名字和数据类型。变量的数据类型定义了如何将这些值的位储存到计算机的内存中,javascript是一种弱型或者说动态语言,这意味着不用提前声明变量类型,在程序运行过程中,类型会被自动确定。

在代码运行时,变量的数据类型由js引擎根据 = 右边变量值的数据类型来判断,运行完毕后,变量就确定了数据类型

js拥有动态类型,同时也意味着相同的变量可用作不同的数据类型

var x = 6;
var x = 'beibei';

数据类型的分类

  • 简单数据类型(Number,String,Boolean,undefind,Null)
  • 复杂数据类型(object)
简单数据类型说明默认值
Number数字型0
Boolean布尔型,true,false,等价1和0false
String字符串,如"张三"“”
undefinedlet a;声明不赋值,此时a = undefinedundefined
Nulllet a = null;声明a为空值null

数字型 Number

最大值和最小值

alert(Number.MAX_VALUE);//最大值
alert(Number.MIN_VALUE);//最小值
//三个特殊值
alert(Infinity);//代表无穷大
alert(-Infinity);//代表无穷小
alert(NaN);//not a number 代表一个非数值

//isNaN()用来判断非数字 并且返回一个值
//如果不是数字返回true,是数字返回false

字符串类型 String

可以是引号中的任意文本,语法为双引号" "和单引号’ ’
js可以用单引号嵌套双引号,或者用双引号嵌套单引号

  • 字符串转义字符

    • \n 换行符
    • \ 斜杠
    • ’ 单引号
    • ‘’ 双引号
    • \t tab缩进
    • \b 空格
  • 字符串长度
    由若干字符组成,这些字符的数量就是字符串的长度。通过字符串的length属性可以获取整个字符串的长度

var str = 'my name is beibei'
console.log(str.length);
  • 字符串拼接
    多个字符串可以使用+进行拼接,其拼接方式为字符串+任意类型=拼接后的新字符串
    拼接前会把字符串相加的任何类型转成字符串,再拼接成一个新字符串
    +号总结口诀:数值相加,字符相连

布尔型 Boolean

两个值 true和false
true参加加法运算当作1
false参加加法运算当作0

undefind和Null

一个声明后没有赋值的变量会有一个默认值 undefind

//例如
var a;
console.log(a);// undefind
console.log('你好'+a);// 你好undefind
console.log(11+a);// NaN
console.log(true+a);// NaN

//一个变量给Null值,里面的值为空
var b = null;
conslog.log('你好'+b); // 你好null
console.log(11+b); // 11
console.log(true + b) // 1

字面量

是在源码中一个固定值的表示法,通俗来说就是字面量如何表达这个值
数字字面量:8,9,10
字符串字面量:‘beibei’,‘前端’
布尔字面量:true,false

获取变量的数据类型

//typeof	可用来获取检测变量的数据类型
var num = 10;
console.log(typeof num);

数据类型转换

使用表单,prompt获取过来的数据默认是字符串类型的,此时就不能进行加法等运算,需要转换变量的数据类型

  • 转换成字符串
//toString()
var num = 123;
console.log(num.toString());
//  String()强制类型转换
console.log(String(num));
//加号拼接字符串    也称隐式转换
console.log(num+'beibei');
  • 转成数字型
var num = '23';
var num1 = '78.21'
//parseInt()
console.log(parseInt(num));
//parseFloat()       
console.log(parseFloat(num1))    
//Number强制转换
console.log(Number(num));
//js隐式转换(-  *   /)
console.log('12'-1);      
  • 转换成布尔型
//Boolean()函数
console.log(Boolean('true'));

代表空,否定的值会被转换成false,如:"",0,NaN,null,undefind
其余的值都会转换成true

解释型语言和编译型语言

  • 概述
    计算机不能直接理解任何除机器语言以外的语言,所以必须要把程序员所写的程序语言翻译成机器语言才能执行程序,程序语言翻译成机器语言的工具,被称为翻译器

JS——>翻译器——>机器语言(二进制)

翻译器翻译的方式有两种:一个是编译,另外一个是解释。两者之间的区别在于翻译的时间点不同

  • 编译器是在代码执行之前进行编译,生成中间代码文件
  • 解释器实在运行时进行及时解释,并立即执行

JS运算符

  • 也称为操作符,是用于实现赋值,比较和执行算数运算等功能的符号
  • 常用运算符:
    1,算数运算符
    2,递增递减运算符
    3,比较运算符
    4,逻辑运算符
    5,赋值运算符

算数运算符

		// +   加
        // -   减
        // *   乘
        // /   除
        // %   取余    判断一个数是否能被整除
  • 表达式和返回值
    表达式:是由数字,运算符,变量等以能求得数值的有意义的排列方法所得的组合
    表达式最终都会返回一个结果,我们称之为返回值

递增和递减运算符 ++ - -

必须和变量配合使用

  • 前置++,- - ,和后置++,- -单独使用,效果一样
  • 后置++,- - ,口诀:先返回原值,再加1

比较运算符

两个数据进行比较所使用的运算符,比较运算后,会返回一个布尔值作为比较运算的结果

		// >   大于号
        // <   小于号
        // >=  大于等于号
        // <=  小于等于号
        // ==  判等号(会转型)
        // !=  不等号
        // === !== 全等要求值和数据类型都一致

逻辑运算符

  • 概念:是用来进行布尔值运算的运算符,其返回值也是布尔值
		// &&  与  两侧都为true,结果才为true,一侧为false,结果为false
        // ||  或  两侧都为false,结果才为false,一侧为true,结果为true
        // !  非  也叫取反符,取一个布尔值相反的值
  • 短路运算(逻辑中断)
    原理:当有多个表达式(值)时,左边的表达式(值)可以确定结果时,就不在继续运算右边表达式的值

赋值运算符

		// =   直接赋值
        // += -=   加减一个数再赋值
        // *=,/=,%=  乘除取余再赋值

运算符的优先级

		// 1   小括号      ()
        // 2   一元运算符  ++,--,!
        // 3   算数运算符  先*,/,%,后加减
        // 4   关系运算符  >,>=,<,<=
        // 5   相等运算符  ==,!=,===,!==
        // 6   逻辑运算符  先&&后||
        // 7   赋值运算符  =
        // 8   逗号运算符  ,

流程控制

  • 简单理解:流程控制就是来控制我们的代码按照什么结构顺序执行
  • 三种结构:顺序结构,分支结构,循环结构

顺序结构流程控制

程序按照代码的先后顺序,依次执行

分支流程控制 if语句

由上到下执行代码过程中,根据不同的条件,执行不同路径的代码,从而获得不同结果
js提供两种分支结构语句:1.if语句 2.switch语句

  • if语句语法结构
//单分支
if(条件表达式){
//条件成立执行的代码
}

//双分支
if(条件表达式){
//如果条件成立执行的代码
}else{
//否则执行的代码
}

//多分枝
if(条件表达式1){
//语句1
}else if (条件表达式2){
//语句2
}else if (条件表达式3){
//语句3
}else if (条件表达式4){
//语句4
}
...
}else{
//上述条件都不成立,执行此行代码
}
  • 三元表达式
    语法结构:条件表达式 ? 表达式1 : 表达式2
    如果条件表达式为真,则返回表达式1的值,如果为假,则返回表达式2的值
  • 分支流程控制switch
    switch也是多分支语句,它基于不同的条件执行不同的代码,当要针对变量设置一系列的特定值的选项时,就可以使用switch
			switch (表达式) {
            case value1:
            //表达式等于value1时执行的代码
            break;
            case value2:
            //表达式等于value2时执行的代码
            break;
            case value3:
            //表达式等于value3时执行的代码
            break;
            default:
            //表达式不等于任何一个value时执行的代码
        }
			// 注意:表达式经常写成变量,表达式的值和value匹配时是全等
			//必须须值和数据类型一样才行
        	// 当case没有break,则不会退出switch,是继续执行下一个case
  • switc和if else if 的区别
    1,一般情况下,两个语句可以相互转换
    2,switch通常处理case为确定值的情况,而if更加灵活,常用于范围判断(大于,等于某个范围)
    3,switch进行条件判断后,直接执行到程序的条件语句效率高。而if有几种条件,就要判断多少次
    4,分支少,if执行效率比switc高
    5,分支多,switch语句执行效率比较高,而且结构更清晰

循环结构

三种类型循环
1.for循环
2.while循环
3.do while循环

  • for循环
    在循环中,一组被重复执行的代码被称为循环体,能否继续重复执行,取决于循环的终止条件。由循环体及循环的终止条件组成的语句,被称之为循环语句

    语法结构

for(初始化变量;条件表达式;操作表达式){
//循环体
}
// 初始化变量就是用var声明的一个普通变量,通常做为计数器
// 条件表达式,用来决定每一次循环是否继续执行,就是终止的条件
// 操作表达式是每次循环最后执行的代码,用于计数器变量更新

//执行过程
for(var i = 1; i <= 100; i++){
console.log('贝贝')
}
//  1.var i = 1;	**注意在for循环里面只执行一次**
//  2.然后判断 i是否小于等于100	i <= 100;
//  3.结果为true	执行循环体,结果为false结束循环
//  4.最后执行	i++
//  5.然后继续判断i是否小于等于100,直到结果为false,才终止循环
  • while循环
    while语句可以在条件表达式为真的前提下,循环执行指定的一段代码,知道表达式不为真
    语法结构
while(条件表达式){
//循环体代码
}

//  执行思路
//  1.先执行条件表达式,结果为true执行循环体,结果为false,退出循环
//  2.执行循环体代码
//  3.循环体执行完毕后,程序会继续判断执行表达式,如条件仍然为true,继续执行
//  循环体,知道循环条件为false,整个过程才结束
  • do while循环
    该循环先执行一次代码块,然后对条件进行判断,如果条件为真,就重复执行循环体,否则退出循环
    语法结构
do{
//循环体
}while(条件表达式)

**注意**while不同的地方在于,do while先执行一次循环体,再判断条件
  • continue关键字
    用于立即跳出本次循环,继续下一次循环
    (本次循环体中continue后面的代码会少执行一次)
  • break关键字
    用于立即跳出本次循环,循环结束

循环小结
三个循环很多情况下都可以相互替代使用
用来计数,跟数字相关的,更喜欢用for
while和do while可以做更复杂的判断条件,比for灵活

练习

         for (var i = 1; i <= 100; i++) {
            if (i == 1) {
                console.log('一岁了');
            } else if (i == 100) {
                console.log('100岁了');
            } else {
                console.log('这个人' + i + '岁了');
            }
        } 

        //1+到100的累加和
         var result = 0;
        for (var i = 1; i <= 100; i++) {
            result = result + i;
            console.log(result);
        } 

        //求1~100之间所有数的平均值
         var sum = 0;
        var pinjun = 0;
        for (var i = 1; i <= 100; i++) {
            sum += i;
        }
        pinjun = sum / 100;
        console.log(pinjun); 

        //求1~100所有偶数和奇数的和
        var oushu = 0;
        var jishu = 0;
        for (var j = 1; j <= 100; j++) {
            if (j % 2 == 0) {
                oushu = oushu + j;
            } else {
                jishu = jishu + j;
            }
        }
        console.log(oushu);
        console.log(jishu);

        //求1~100之间所有能被3整除的数
         for (var k = 1; k <= 100; k++) {
             if (k % 3 == 0) {
                 console.log(k);
             }
         }

        //要求用户输入班级人数,之后依次输入每个学生的成绩
        //最后打印出班级总的成绩以及平均成绩
        var renshu = parseInt(prompt('请输入班级总人数'));
        var sum = 0;
        var pinjun = 0;
        for (var i = 1; i <= renshu; i++) {
            var j = parseInt(prompt('请输入第' + i + '个人的成绩'));
            sum = sum + j;
        }
        pinjun = sum / renshu;
        alert('班级总成绩' + sum);
        alert('班级成绩的平均值' + pinjun);

        //一行打印五个星星
         var num = prompt('请输入星星的个数:');
         var str = '';
         for (var i = 1; i <= num; i++) {
             str = str + '*';
         }
         console.log(str);

        //打印五行五列星星★
         var str = '';
         for (var i = 1; i <= 5; i++) {
             for (var j = 1; j <= 5; j++) {
                 str = str + '★';
             }
             str += '\n';
         }
         console.log(str);

        //打印n行n列的星星
        var hangshu = prompt('请输入行数:');
        var lieshu = prompt('请输入列数:');
        var str = '';
        for (var i = 1; i <= hangshu; i++) {
            for (var j = 1; j <= lieshu; j++) {
                str += '★';
            }
            str += '\n';
        }
        console.log(str);

        //打印倒三角形
        var str = '';
        for (var i = 1; i <= 10; i++) {
            for (var j = i; j <= 10; j++) {
                str += '★';
            }
            str += '\n';
        }
        console.log(str);

        //打印正三角形
         var str = '';
        for (var i = 1; i <= 10; i++) {
            for (var j = 1; j <= i; j++) {
                str += '★';
            }
            str += '\n';
        }
        console.log(str); 

        //打印九九乘法表
        var str = '';
        for (var i = 1; i <= 9; i++) {
            for (var j = 1; j <= i; j++) {
                str += j + 'x' + i + '=' + i * j + '\t';
            }
            str += '\n';
        }
        console.log(str);







        //while 循环

        //打印人的一生,从一到100岁
        var i = 1;
        while (i <= 100) {
            console.log(i);
            i++;
        }

        //计算1到100所有整数的和
        var i = 1;
        var sum = 0;
        while (i <= 100) {
            sum = sum + i;
            i++;
        }
        console.log(sum);

        //弹出一个提示框,你爱我吗,如果输入我爱你就结束,否则一直询问
        var ai = prompt('你爱我吗?');
        while (ai !== '我爱你') {
            ai = prompt('你爱我吗');
        }
        alert('我也爱你啊');


        //do while 循环

        //打印人的一生1~100岁
        var i = 1;
        do {
            console.log(i);
            i++
        } while (i <= 100)

        //计算1~100的整数和
        var i = 1;
        var sum = 0;
        do {
            sum += i;
            i++;
        } while (i <= 100)
        console.log(sum);

        //弹出一个提示框,你爱我吗,如果输入我爱你就结束,否则一直询问
        do {
            var ai = prompt('你爱我吗?');
        } while (ai != '我爱你')



        //continue关键字
        //只要遇见continue就退出本次循环,直接跳到i++
         for (var i = 1; i <= 5; i++) {
             if (i == 3) {
                 continue;
             }
             console.log('我正在执行第' + i + '次循环');
         }

        //求1~100之间,除了能被7整除之外的整数和
         var sum = 0;
         for (var i = 1; i <= 100; i++) {
             if (i % 7 == 0) {
                 continue;
             }
             sum += i;
         }
         console.log(sum);


        //break关键字
        //break 退出整个循环
        for (var i = 1; i <= 5; i++) {
            if (i == 3) {
                break;
            }
            console.log('这是我执行的第' + i + '次循环');
        }





        // 练习
        // 求1~100之间所有数的总和与平均值
        var sum = 0;
        var pinjun = 0;
        for (var i = 1; i <= 100; i++) {
            sum += i;
        }
        console.log(sum);
        console.log(sum / 100);

        //求1~100之间所有偶数的和
        var sum = 0;
        for (var i = 1; i <= 100; i++) {
            if (i % 2 == 0) {
                sum += i;
            }
        }
        console.log(sum);

        //求100以内7的倍数的总和
        var sum = 0;
        for (var i = 1; i <= 100; i++) {
            if (i % 7 == 0) {
                sum += i;
            }
        }
        console.log(sum);

        //使用for循环打印矩形,要求每次只能输出一个❤
        var str = ''
        for (var i = 1; i <= 4; i++) {
            for (var j = 1; j <= 5; j++) {
                str = str + '❤';
            }
            str += '\n';
        }
        console.log(str);

        //使用for打印三角形
        var str = '';
        for (var i = 1; i <= 5; i++) {
            for (var j = 1; j <= i; j++) {
                str += '❤';
            }
            str += '\n';
        }
        console.log(str);

        //使用for循环打印99乘法表
        var str = '';
        for (var i = 1; i <= 9; i++) {
            for (var j = 1; j <= i; j++) {
                str += j + 'x' + i + '=' + i * j + '\t';
            }
            str += '\n';
        }
        console.log(str);

        //接收用户输入的用户名和密码,若用户名为admin,密码为123456
        //则提示用户登录成功,否则让用户一直输入
        var name1 = prompt('请输入用户名:');
        var passd = prompt('请输入密码:');
        while (name1 !== 'admin' && passd !== '12346') {
            name1 = prompt('请输入用户名:');
            passd = prompt('请输入密码:');
        }
        alert('登录成功');

        //求1~100的累加值,但要求跳过个位为3的数
        var sum = 0;
        for (var i = 1; i <= 20; i++) {
            if (i == 3 || ((i % 10) == 3)) {
                continue;
            }
            sum += i;
        }
        console.log(sum);

数组

数组是一组数据的集合,其中每个数据被称作元素,在数组中可以存放任意类型的元素。数组是一种将一组数据存储在单个变量名下的优雅方式

  • 利用new创建数组
var 数组名 = new Array();	//创建了一个空数组
  • 利用字面量创建数组
var 数组名 = []	//数组的字面量是[],声明数组并赋值称为数组的初始化
  • 索引(下标):用来访问数组的序号(从0开始
  • 遍历数组:就是把数组中的元素从头到尾访问一遍,使用"数组名.length"可以访问数组元素的数量(数组长度)
  • 数组新增元素
    可以通过修改length长度以及索引号添加数组元素
    不要给数组名赋值,否则会覆盖掉原来的数据

练习

 		var arr = [1, 'si', 'beibei', 4, 6]
        console.log(arr[2]);
        var arr = ['星期1', '星期2', '星期3', '星期4', '星期5', '星期6', '星期日'];
        for (var i = 0; i < 7; i++) {
            console.log(i);
        }


        //求数组[2,6,1,7,4]里面所有元素的和及平均值
        var arr = [2, 6, 1, 7, 4];
        var sum = 0
        var pinjun = 0;
        for (var i = 0; i < arr.length; i++) {
            sum = sum + arr[i];
        }
        pinjun = sum / arr.length;
        console.log(sum, pinjun);



        //求数组[2,6,1,77,52,25,7]的最大值
        var arr = [2, 6, 1, 77, 52, 25, 7];
        var max = arr[0];
        for (var i = 0; i < arr.length; i++) {
            if (max < arr[i]) max = arr[i];
        }
        console.log(max);


        //新建数组,里面存放1~10
        var arr = [];
        for (var i = 0; i < 10; i++) {
            arr[i] = i + 1;
        }
        console.log(arr);


        // 把数组[2,0,6,1,77,0,52,0,25,7]中大于等于10的元素选出来放进新数组
        var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7];
        var arr1 = [];
        //刚开始arr1.length就是0
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] >= 10) {
                arr1[arr1.length] = arr[i];
            }
        }
        console.log(arr1);


        //删除指定数组元素
        //将数组[2,0,6,1,77,0,52,0,25,7]中的0去掉组成新数组
        var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7];
        var arr1 = [];
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] != 0) {
                arr1[arr1.length] = arr[i];
            }
        }
        console.log(arr1);


        //翻转数组
        //将数组['red','green','blue','pink','purple']内容反过来存放
        var arr = ['red', 'green', 'blue', 'pink', 'purple'];
        var arr1 = [];
        for (var i = arr.length - 1; i >= 0; i--) {
            arr1[arr1.length] = arr[i];
        }
        console.log(arr1);


        //冒泡排序
        var arr = [5, 4, 3, 2, 1];
        var temp;
        for (var i = 0; i < arr.length - 1; i++) {
            for (var j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        console.log(arr);

函数

概念:js里面,可能会定义非常多相同的代码,或功能相似的代码,这些代码可能需要大量重复使用,这时就可以使用js的函数
函数:就是封装了一段可以被重复执行的代码块

  • 函数的使用:声明函数和调用函数
//1.声明函数
function 函数名 (){
//函数体
}
//2.调用函数
函数名();

function 声明函数的关键字
函数是做某件事情,函数名一般是动词
函数不调用,自己不执行

函数的封装:就是把一个或多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口
简单理解:封装类似于将电脑配件整合装到机箱中

  • 函数的参数
    声明函数时,可以在函数名后面的小括号添加一些参数,这些参数叫做形参,而在调用该函数时,同样也需要传递相同的参数,这些参数被称为实参

形参:形式上的参数,函数定义的时候传递的参数,当前并不知道是什么
实参:实际上的参数,函数调用时传递的参数,实参时传给形参的
参数的作用:在函数内部某些值不固定,我们可以通过参数在调用函数时传递不同的参数

  • 函数形参和实参个数不匹配的情况
    实参个数=形参个数 //输出正确结果
    实参多于形参 //只取到形参个数
    实参少于形参 //多的形参定义为undefind,结果为NaN
    注意:在js中,形参默认值是undefind

函数可以调用另外一个函数

  • 函数的另外一种声明方式
    函数表达式(匿名函数)
var 变量名 = function(){}


var fun = function (){
  console.log('我是匿名函数')
}
fun();
**注意**
fun是变量名,不是函数名
声明方式和变量差不多,变量里存的是值,函数表达式存的是函数
函数表达式也可以进行传递参数

return语句

1.函数只是实现某种功能,最终的结果需返回给函数的调用者,通过reurn
2.只要函数遇到return,就把后面的结果返回给函数调用者
3.函数名 () = return后面的结果

  • return终止函数
    return语句之后的代码不执行
    return只能返回一个值,如果用逗号隔开多个值,以最后一个为准
    函数没有return返回udefind
  • arguments的使用
    当我们不确定有多少参数来传递时,可以用arguments来获取,在js中,arguments实际上它是当前函数的一个内置对象,所有函数都内置了这个对象,对象中存储了传递的所有实参

(1).arguments的展示形式是一个伪数组,所以可以遍历
伪数组具有以下特点
1.具有length属性
2.按索引方式存储数据
3.不具有数组的push,pop等方法

练习

		//计算1~100的累加和
        function getsum(num1, num2) {
            var sum = 0;
            for (var i = num1; i <= num2; i++) {
                sum += i;
            }
            console.log(sum);
        }
        getsum(1, 99);


        // 求任意两数的和
        function getsum(num1, num2) {
            return num1 + num2;
        }
        console.log(getsum(1, 5));


        //求两个数的最大值
        function getmax(num1, num2) {
            if (num1 > num2) {
                return num1;
            } else {
                return num2;
            }
            //return num1 > num2 ? num1 : num2;
        }
        console.log(getmax(78, 798));


        //求数组中的最大值
        function getmax(num) {
            var max = num[0];
            for (var i = 1; i < num.length; i++) {
                if (num[i] > max) {
                    max = num[i]
                }
            }
            return max;
        }
        var re = getmax([4, 8, 78, 9, 6]);
        console.log(re);


        //用户输入任意两个数字的任意运算,并且弹出结果
        function yunsuan() {
            var num1 = parseInt(prompt('请输入第一个数'));
            var num2 = parseInt(prompt('请输入第二个数'));
            var sum;

            parseInt(num2);
            var suanfa = prompt('您想进行何种运算?\n1.加法\n2.减法\n3.除法\n4.乘法')
            if (suanfa == 1) {
                sum = num1 + num2;
            } else if (suanfa == 2) {
                sum = num1 - num2;
            } else if (suanfa == 3) {
                sum = num1 / num2;
            } else if (suanfa == 4) {
                sum = num1 * num2;
            }
            return sum;
        }
        alert('运算结果为' + yunsuan());


        //用户输入任意两个数的最大值
        function max() {
            var num1 = parseInt(prompt('请输入第一个数'));
            var num2 = parseInt(prompt('请输入第二个数'));
            var max;
            if (num1 > num2) {
                max = num1;
            } else {
                max = num2;
            }
            return max;
        }
        alert('最大值为' + max());


        //用户输入任意三个数的最大值
        function maxnum() {
            var num1 = parseInt(prompt('请输入第一个数'));
            var num2 = parseInt(prompt('请输入第二个数'));
            var num3 = parseInt(prompt('请输入第二个数'));
            var max;
            if (num1 > num2 && num1 > num3) {
                max = num1;
            } else if (num2 > num1 && num2 > num3) {
                max = num2;
            } else if (num3 > num1 && num3 > num2) {
                max = num3;
            }
            return max;
        }
        alert('最大值为' + maxnum());


        //判断一个数是否为质数或者质数(只能被1和自身整除的数)
        function zhishu() {
            var num = parseInt(prompt('请输入一个正整数'));
            var panduan = false;
            var content = 0;
            for (var i = 1; i <= num; i++) {
                if (num % i == 0) {
                    content++;
                }
            }
            if (content == 2) {
                panduan = true;
            }
            return panduan;
        }
        alert(zhishu());


        //arguments的使用
        //求任意个数的最大值
        function maxnum() {
            var maxnum = arguments[0]
            for (var i = 0; i < arguments.length; i++) {
                if (maxnum < arguments[i]) {
                    maxnum = arguments[i]
                }
            }
            return maxnum;
        }
        var re = maxnum(45, 781, 451, 64, 264);
        console.log(re);


        //翻转数组
        var arr = [1, 2, 3, 4, 5, 6];
        var arr1 = [];

        function fanzhuan() {
            for (var i = arr.length - 1; i >= 0; i--) {
                arr1[arr1.length] = arr[i];
            }
            return arr1;
        }
        var re = fanzhuan(arr);
        console.log(re);


        //冒泡排序
        function maopao(arr) {
            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;
                        temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
            return arr;
        }
        var re = maopao(t = [5, 4, 3, 2, 1]);
        console.log(re);


        //判断闰年
        function eryue() {
            var year = prompt('请输入年份:');
            if (panduan(year)) {
                alert('是闰年有29天');
            } else {
                alert('不是闰年有28天')
            }

        }
        eryue();

        function panduan(num) {
            var flag = false;
            if (num % 4 == 0 && num % 100 != 0 || num % 400 == 0) {
                flag = true
            }
            return flag;
        }

作用域和预解析

作用域

通常来说,一段程序代码中用到的名字并不是总是有效和可用的,而限定这个名字的可用性范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突

js作用域:就是代码变量名字在某个范围内起作用和效果
es6之前:全局作用域和局部作用域

  • 全局作用域:整个script标签,或者是一个单独的js文件
  • 局部作用域:(函数作用域)在函数内部就是局部作用域,这个代码的名字只在函数内部起效果和作用

根据作用域的不同,我们变量分为全局变量和局部变量
注意:如果在函数内部没有声明赋值的变量也属于全局变量
函数的形参也可以看作局部变量

从执行效率来说
1.全局变量只有在浏览器关闭时才会销毁,比较占内存资源
2.局部变量当我们程序执行完毕就会销毁,比较节约内存

  • 作用域链(就近原则)
  1. 只要是代码就至少有一个作用域
  2. 写在函数内部的叫局部作用域
  3. 如果函数中还有函数,那么这个作用域中就又可以诞生一个作用域
  4. 根据内部函数可以访问外部函数变量这种机制,用链式查找决定哪些数据能被内部函数访问,就叫做作用域链

预解析

js代码由浏览器的js解析器执行,其运行时分为两步:预解析和代码执行

预解析:js引擎会把里面所有的var 和function提升到当前作用域的最前面
代码执行:从上往下

预解析分为变量预解析(变量提升)和函数预解析(函数提升)
变量提升:把所有变量声明提升到当前作用域的最前面,但是不赋值
函数提升:把所有函数声明提升到当前作用域最前面,不调用函数

对象

对象

对象是一个具体的事物
js中对象是一组无序的相关属性和方法的集合
属性:事物的特征,在对象中用属性来表示(常用名词)
方法:事物的行为,在对象中用方法来表示(常用动词)

三种方式创建对象(object)
1.利用字面量创建对象
2.利用new Object创建对象
3.利用构造函数创建对象

利用字面量创建对象

对象字面量:就是{}里面包含了这个具体事物的属性和方法

var obj = {}	//创建了一个空对象

var obj = {
uname:'贝贝',
age:18,
sex:'',
say: function (){
	console.log('我是贝贝');
	}
}

// **注意**
// 多个属性和方法之间用逗号隔开
// 方法后面跟的是一个匿名函数
// 里面的属性或方法采取键值对的形式:键 属性名 :值 属性值

// **使用对象**
// 1.	调用对象的属性	对象名.属性名
// console.log(obj.uname)
// 2.	调用对象属性的另一种方法	对象名['属性名']
// console.log(obj['age']);
// 3.	调用对象的方法	对象名.方法名()
// obj.say();

利用new Object创建对象

var obj = new Object();		//创建了一个空对象
obj.name = '贝贝';
obj.age = 18;
obj.sex = '男';
obj.say = function(){
	console.log('我是贝贝');
}
// **注意**
// 1.	利用等号赋值的方法添加对象的属性和方法
// 2.	每个属性和方法用分号隔开
// 3.	调用方法和字面量创建对象一致

利用构造函数创建对象

为什么需要构造函数?
因为前面两种创建对象的方式一次只能创建一个对象
构造函数:是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与new一起使用。我们可以把对象中的一些公共的属性和方法抽取出来,然后封装到这个函数里

语法格式

function 构造函数名(){
	this.属性 =this.方法 = function(){
	}
}
new 构造函数名();
function Star() {
	//必须添加this
	this.name = name;
	this.ages = ages;
	this.sex = sex;
	this.say = function(h){
		console.log(h);
	}
}
//不需要return就能返回结果
var beibei = new Star('贝贝',18,'男');
//调用函数返回一个对象
//调用构造函数必须使用new
console.log(beibei.name);
console.log(beibei['ages']);
console.log(beibei.sex);
beibei.say('我是贝贝');

1.构造函数:泛指的某一大类 明星
2.对象:特指的一个具体事物 周柏豪

  • new关键字执行过程
  1. new构造函数可以在内存中创建一个空对象
  2. this就会指向刚才创建的空对象
  3. 执行构造函数里面的代码,给这个空对象添加属性和方法
  4. 返回这个新对象(所以构造函数不需要return)

遍历对象
for in 语句:用来对数组或者对象属性进行循环操作
语法

for(变量 in 对象){}
for(k in obj){
	console.log(k);	// k变量输出得到属性名
	console.log(obj[k]);	//obj[k]得到属性值
}

练习

			var keke = {
            name: '可可',
            type: '阿拉斯加犬',
            ages: 5,
            color: '中红色',
            bark: function () {
                console.log('汪汪汪');
            },
            showFilm: function () {
                console.log('演电影');
            }
        }
        console.log(keke.ages);
        console.log(keke['color']);
        keke.bark();

        var mingren = new Object();
        mingren.name = '鸣人';
        mingren.sex = '男';
        mingren.age = 19;
        mingren.skill = function () {
            console.log('影分身术');
        }
        console.log(mingren.name);
        console.log(mingren['age']);
        mingren.skill();



        function Hero(name, type, blood) {
            this.name = name;
            this.type = type;
            this.blood = blood;
            this.attack = function (attack) {
                console.log(attack);
            }
        }
        var lianpo = new Hero('廉颇', '力量型', 500);
        console.log(lianpo.name);
        console.log(lianpo.type);
        console.log(lianpo.blood);
        lianpo.attack('近战');
        var houyi = new Hero('后羿', '射手型', 100);
        console.log(houyi['name']);
        console.log(houyi['type']);
        console.log(houyi['blood']);
        houyi.attack('远程');



        var diannao = {
            color: 'red',
            zhong: '25斤',
            pingpai: 'daier',
            xinghao: '3000',
            kandianying: function () {
                console.log('看电影');
                console.log('敲代码');
                console.log('听音乐')
                console.log('打游戏')
            }

        }
        for (k in diannao) {
            console.log(diannao[k]);
        }





        var anniu = new Object();
        anniu.kuan = 20;
        anniu.gao = 22;
        anniu.bg = 'red';
        anniu.dianji = function () {
            console.log('hi');
        }
        for (k in anniu) {
            console.log(anniu[k]);
        }




        var che = {
            zhongliang: '12',
            color: 'red',
            paizi: 'bentian',
            xingwei: function () {
                console.log('载人')
                console.log('拉货')
                console.log('耕田')
            }
        }
        for (k in che) {
            console.log(che[k]);
        }


        //翻转任意数组的函数
        var arr = ['red', 'blue', 'yellow', 'green', 'pink']
        var newArr = [];

        function fanzhuan(arr) {
            for (var j = arr.length - 1; j >= 0; j--) {
                newArr[newArr.length] = arr[j];
            }
            return newArr;
        }
        var re = fanzhuan(arr);
        console.log(re);

        //排序
        var arr = [4, 5, 7, 45, 21, 3, 14, 12, 124];

        function paixu(arr) {
            var fangfa = prompt('1.从小到大\n2.从大到小');
            if (fangfa == 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;
                            temp = arr[j];
                            arr[j] = arr[j + 1];
                            arr[j + 1] = temp;
                        }
                    }
                }
                return arr;
            } else if (fangfa == 2) {
                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;
                            temp = arr[j];
                            arr[j] = arr[j + 1];
                            arr[j + 1] = temp;
                        }
                    }
                }
                return arr;
            }
        }
        var re = paixu(arr);
        console.log(re);


        //简易计算器

        function suanfa() {
            var xuanxiang = 1;
            var resual = 0;
            while (xuanxiang >= 1 && xuanxiang <= 5) {
                var xuanxiang = prompt('欢迎使用简易计算器:\n1.加法运算\n2.减法运算\n3.乘法运算\n4.除法运算\n5.退出\n请输入您的选项');
                if (xuanxiang == 1) {
                    var num1 = parseInt(prompt('请输入第一个数'));
                    var num2 = parseInt(prompt('请输入第二个数'));
                    resual = num1 + num2;
                    alert(resual);
                    continue;
                } else if (xuanxiang == 2) {
                    var num1 = prompt('请输入第一个数');
                    var num2 = prompt('请输入第二个数');
                    resual = num1 - num2;
                    alert(resual);
                    continue;
                } else if (xuanxiang == 3) {
                    var num1 = prompt('请输入第一个数');
                    var num2 = prompt('请输入第二个数');
                    resual = num1 * num2;
                    alert(resual);
                    continue;
                } else if (xuanxiang == 4) {
                    var num1 = prompt('请输入第一个数');
                    var num2 = prompt('请输入第二个数');
                    resual = num1 / num2;
                    alert(resual);
                    continue;
                } else if (xuanxiang == 5) {
                    alert('正在退出');
                    break;
                } else if (xuanxiang > 5) {
                    alert('输入有误,请重新输入');
                    suanfa();
                }
            }

        }
        suanfa();
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值