1. 函数的写法
//1.什么是函数?
// 把特点的代码片段,抽取成为独立运行的实体
//2.函数等于现实生活中'工具'
// 联想: 锤子,手机,电脑,车子...
// 冰箱,洗衣机,热水器
// 洗衣机:作用 提高洗衣服的效率
// 1.使用简单,方便
// 2.无须了解原理
// 3.不受时间的限制
//3.使用函数的好处?
// 1).重复使用,提供效率
// 2).提高代码的可读性
// 3).有利用程序的维护
//4.函数的分类
// 1.内置函数(系统函数) 已经提供的
// alert();
// var res = prompt("请输入一个数")
// confirm("您却定要删除吗?");
// print()
// document.write()
// console.log()
// isNaN();
// parseInt()
// parseFloat()
// Number();
// Boolean()
// toString()
// toFixed(2)
// ...
// 1.作用,2,参数,返回值
//
// 自定义方式
//定义语法
// function 函数名称(形参1, 形参2, ...) {
// //逻辑代码
// // return 结果
// }
// //函数的调用
// 函数名称(实参)
// //计算2个数相加
// function calc(num1, num2) {
// var res = num1 + num2;
// return res;
// }
// //使用
// var result = calc(100, 200);
// console.log(result);
//函数的定义有三种写法
//写法1 普通写法,调用的是,可以再定义函数的前面,后面使用
console.log(show("刘德华"));
function show(name) {
return "姓名为:" + name;
}
console.log(show("吴某凡"));
//写法2 匿名函数
show(); //不可以,必须在定义函数的后面调用
var show = function () {
console.log("我是匿名函数");
}
show();
//写法3 构造函数创建函数
// new Function的最后一个参数,是函数的代码体
var calc = new Function("a", "b", "c", "return a+b+c");
var res = calc(10, 20, 30);
console.log(res);
练习:
// function calc(num1, num2) {
// console.log(num1);
// console.log(num2);
// return 11
// }
// console.log(num1);
// var res = calc(10);
// console.log(res);
// 1, 写一个函数计算1到n的和,
//并返回结果打印出来;(n为函数参数)
function fn1(n) {
var sum = 0;
for (var i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
console.log(fn1(5));
// 2, 写一个函数计算n的阶乘,并返回结果打印出来
function fn2(n) {
var sum = 1;
for (var i = 1; i <= n; i++) {
sum *= i;
}
return sum
}
console.log(fn2(5));
console.log(fn2(10));
// 3, 写一个函数计算两个数的最小公倍数;
//并返回结果打印出来
//写法1
function fn3(n, m) {
var res = 0;
var max = n > m ? n : m;
for (var i = max; i <= n * m; i++) {
if (i % n == 0 && i % m == 0) {
res = i;
break;
}
}
return res;
}
console.log(fn3(6, 9));
//写法2
function fn4(n, m) {
var max = n > m ? n : m;
for (var i = max; i <= n * m; i++) {
if (i % n == 0 && i % m == 0) {
return i;
}
}
}
console.log(fn4(6, 9));
练习2:
// 1, 写一个函数判断一个年份是不是闰年
function isRun(year) {
var exp1 = year % 4 == 0 && year % 100 != 0;
var exp2 = year % 400 == 0;
return exp1 || exp2;
}
// 2, 写一个函数判断一个数是不是素数 (又称质数,除了1和本身以外不再有其他数整除)
function isSu(num) {
var res = true;//默认是 素数,就不是合数
for (var i = 2; i < num; i++) {
if (num % i == 0) {
res = false;
break;
}
}
return res;
}
// console.log(isSu(7));
// console.log(isSu(13));
// 3, 年月日分别为自定义函数的参数,判断某一个日期是否为合法的日期;
// 如: 2016年12月33日不是合法的日期
// 2016年11月13日是合法的日期
function checkDate(yyyy, mm, dd) {
var maxDay = 0;
if (isNaN(yyyy)) {
return false;//不是一个有效的年份
}
if (isNaN(mm)) {
return false;//不是数值的月份
}
if (isNaN(dd)) {
return false; //不是有效的日
}
if (!(mm >= 1 && mm <= 12)) {
return false; //输入月份不行是1~12
}
if (!(dd >= 1 && dd <= 31)) {
return false;
}
switch (Number(mm)) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
maxDay = 31;
break;
case 4:
case 6:
case 9:
case 11:
maxDay = 30;
break;
default:
maxDay = isRun(yyyy) ? 28 : 29;
break;
}
return dd <= maxDay
}
console.log(checkDate(2020, 12, 32));
2. arguments
//arguments 参数
//1.它是一个伪数组,有下标,不具备数据的方法
//2.它只能在函数内部出现
//作用:动态接受实参
function calc() {
var sum = 0
for (var i = 0; i < arguments.length; i++) {
// console.log(arguments[i]); // 通过索引取得对应位置的值,(下标取值)
sum += arguments[i];
}
return sum;
}
console.log(calc(10, 20, 10));
3. 作用域和作用域链
//1.什么时候函数的作用域和作用域链?
// 作用域:作用的范围
// 1).函数内部的是局部的
// 2).函数外部的是全局
// 作用域链?
// 当函数内部访问某一个变量时候,首先去函数内部查找,如果内部
// 没有,就想外出函数查找,如果外层函数,没有就向(浏览器像window)全局
// 在nodejs是像(global)上查找,这个"查找的过程"就叫做"作用域链"
//作用域
// var a = 100;//全局作用域
// function fn1() {
// var b = 200;//局部变量
// console.log(a);
// console.log(b);
// }
// function fn2() {
// console.log(a);
// console.log(b);
// }
// fn1();
// fn2();
// console.log(b);
//-----------------------------
function fn() {
//在函数内部,使用var关键字,声明的变量是局部变量 a
//在函数内部,没有使用var关键字的,是全局变量 b
var a = b = 100;
}
fn();
// console.log(a); // a is not defined
console.log(b); // 100
小练习:
var a = 10;
function fn1(a) {
// var a;
a = 20;
}
fn1();
console.log(a);// 20
4. 简单dom操作
<input id="num1" value="">
<select name="" id="opt">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
<option value="%">%</option>
</select>
<input id="num2">
<button id="btn">=</button>
<input id="num3">
var oNum1=document.getElementById("num1");
var oNum2=document.getElementById("num2");
var oNum3=document.getElementById("num3");
var oOpt=document.getElementById("opt");
var oBtn=document.getElementById("btn");
// 1.给按钮绑定点击事件
// 事件驱动编程
// 通过时间驱动函数的执行
// 通过事件执行函数
oBtn.onclick=function(){
var n1=Number(oNum1.value);
console.log(n1);
var n2=Number(oNum2.value);
var str=oOpt.value;
var res=calc(n1,n2,str);
oNum3.value=res;
console.log(res);
}
function calc(num1,num2,opt){
var result=0;
if(opt=="+"){
result=num1+num2;
}else if(opt=="-"){
result=num1-num2;
}else if(opt=="*"){
result=num1*num2;
}else if(opt=="/"){
result=num1/num2;
}else{
result=num1%num2
}
return result;
}
效果:
练习:
// 1, 一个新入职,月工资为2000元的员工,每年涨当年工资5%,20年后的月工资是多少?
var salary = 2000;
for (var i = 0; i < 20; i++) {
salary = salary * (1 + 0.05)
}
console.log(salary.toFixed(1));
// 2, 山上有一口缸可以装50升水,现在有15升水。
// 老和尚叫小和尚下山挑水,每次可以挑5升。
// 问:小和尚要挑几次水才可以把水缸挑满?
//通过编程解决这个问题。
var count = 0;
for (var i = 0; i < (50 - 15); i += 5) {
count++;
}
console.log(count);
// 3, 打印100–200之间所有能被3或者7整除的数
for (var i = 100; i <= 200; i++) {
if (i % 3 == 0 || i % 7 == 0) {
console.log(i);
}
}
// 4, 计算10的阶乘
//(1*2*3*4*5*6*7*8*9*10 n的阶乘1*2……*n)
var n = 10;
var sum = 1;
for (var i = 1; i <= n; i++) {
sum *= i;
}
console.log(sum);
// 5, 计算1+3+5+...+99的和
var sum = 0;
for (var i = 1; i <= 99; i += 2) {
// console.log(i);
sum += i;
}
console.log(sum);
// 6, 99乘法表
for (var i = 1; i <= 9; i++) {
for (var j = 1; j <= i; j++) {
document.write(j + "x" + i + "=" + j * i + " ")
}
document.write("<br>");
}
// 7, 输出20~80之间能被3整除的整数, 每行5个
document.write("<br>");
var n = 0;
for (var i = 20; i <= 80; i++) {
if (i % 3 == 0) {
//输出一次,累计一次
document.write(i + ", ");
n++;
if (n % 5 == 0) {
document.write("<br>")
}
}
}
// 8, 打印1000~2000年中所有的闰年, 每行4个
document.write("<br>")
var n = 0;
for (var i = 1000; i <= 2000; i++) {
var exp1 = i % 4 == 0 && i % 100 != 0;
var exp2 = i % 400 == 0;
if (exp1 || exp2) {
document.write(i + ", ");
n++;
if (n % 4 == 0) {
document.write("<br>")
}
}
}
// 9, 求: 1-1/2+1/3-1/4 … 1/100的和
var n = -1;
var sum = 0;
for (var i = 1; i <= 100; i++) {
// 1/i
// console.log(n *= -1);
n *= -1
1 / i * n;
sum += 1 / i * n;
}
console.log(sum);
// 9, 输入两个数,求两个数的最小公倍数(****)
// 如: 9和6的最小公倍数是18,
// 1, 先找出两个数中的最大数 // 9 -> 6*9
// 2, 最大数++,找出能被两个数整除的数(退出循环)
var a = 9, b = 6;
var max = a > b ? a : b;
for (var i = max; i <= a * b; i++) {
if (i % a == 0 && i % b == 0) {
console.log(i);
break;
}
}
// 10, 输入两个数n,a,如果n==3, a == 2;
// 输出 2 + 22 + 222 的值。
// (不用输出式子)(****)
// 如: n == 4, a == 3;
// 输出 3 + 33 + 333 + 3333的值。
// 提示: 1、n = 3,相加三次,每次相加比前一次相加的数,多一位
// 2、每次多的这个位数的值为a,
// 3, 3*10+3(33), 33*10+3(333),...
var n = 4, a = 3;
var num = 0;
var sum = 0;
for (var i = 0; i < n; i++) {
// 2,22,222
num = num * 10 + a;
// console.log(num);
sum += num;
}
console.log(sum); //3702
// 11, 五位数中,对称的数称为回文数,找出所有的回文数。
// 如: 12321 34043
for (var i = 10000; i <= 99999; i++) {
var a = i % 10; //个位
var b = parseInt(i / 10) % 10;//十位
var d = parseInt(i / 1000) % 10//千位
var e = parseInt(i / 10000)//万位
if (a == e && b == d) {
console.log(i);
}
}
// 13, 求1!+2!+3!+4!+5!
var res = 0;
for (var i = 5; i > 0; i--) {
var sum = 1;
for (var j = 1; j <= i; j++) {
sum *= j;
}
res += sum;
}
console.log(res); //153
// 14, 找出所有的水仙花数,三位数,各位立方和等于该数本身。
// 如: 153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3
for (var i = 100; i <= 999; i++) {
var a = i % 10;
var b = parseInt(i / 10) % 10;
var c = parseInt(i / 100) % 10;
if (a ** 3 + b ** 3 + c ** 3 == i) {
console.log(i);
}
}
// 15, 输入任意两个数,如果第一个数小,
//从第一个数打印到第二个数,如果第二个数小,
//从第二个数打印到第一个数
var a = 6;
var b = 9;
var min = a < b ? a : b;
var max = a > b ? a : b;
for (var i = min; i <= max; i++) {
console.log(i);
}
// 16, 输入两个数,求两个数的最大公约数(*****)
// 如: 12和8的最大公约数是4,
// 提示: 能够同时整除两个数的最大数
// 1, 先找出两个数中最小的那个数,
// 2, 最小数--, 找出能被两个数整除的数
// (退出循环break)
console.log("---------------");
var a = 12;
var b = 8;
var min = a < b ? a : b;
for (var i = min; i > 0; i--) {
if (a % i == 0 && b % i == 0) {
console.log(i);
break;
}
}
console.log("---------------");
// 1 2 4 8 16 32 64 128...
// var n = 1;
// var sum = 0;
// for (var i = 0; i < 63; i++) {
// n *= 2;
// // console.log(n);
// sum += n;
// }
// console.log(sum + 1);
//bigInt 大整型
// 大整型只能和大整型进行运算
// var n = 100n;
// console.log(Number(n + 1n));
// console.log((n + 1n).toString());
var n = 1n;
var sum = 0n;
for (var i = 0; i < 63; i++) {
n = n * 2n;
// console.log(n);
sum += n;
}
console.log((sum + 1n));
console.log(typeof 100n); //bigint
// string ,number,bigint,null,undefined,object js数据类型
//boolean;