函数概念+任意数求和函数+获取时间字符串函数

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     <script type="text/javascript">
 7     /*
 8     函数function
 9     函数中可以封装一些功能(代码),在需要时可以执行这些功能
10     函数中可以保存一些代码在需要的时候调用
11     使用typeof检查一个函数对象时,会返回function
12  
13 
14     1.可以将要封装的代码以字符串的形式传递给构造函数
15     */
16      var fun=new Function("console.log("hello")");
17      console.log(fun);
18      /*
19      2.使用函数声明来创建一个函数
20      语法 function 函数名(形参1,形参2){语句}
21      
22      3.使用函数表达式来创建一个函数 创建匿名函数将匿名函数赋值给一个变量
23      var 函数名= function([形参1,形参2···形参N]){
24          语句···
25      }
26      
27      调用函数时,解析器也不会检查实参的数量
28      多余实参不会被赋值
29      如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined
30      
31      */
32     function sum(a,b,c){
33         var d=a+b+c;
34         return d;
35         //return后可以跟任意类型的值 return;相当于return undefined;
36     }
37     var f=function(){
38         console.log("我是匿名函数封装的代码");
39         }
40     var result=sum(5,7,8);//20
41     /*
42     实参可以是任意的数据类型,也可以是一个变量
43     当我们的参数过多时,可以将参数封装到一个对象中,然后通过对象传递
44     */
45    function hello(o){
46        console.log("我是"+o.name+",今年我"+o.age+"岁,住"+o.address);
47    }
48    var obj={
49        name:"wxy",
50        age:"18",
51        address:"zzz"
52    }
53    hello(obj);
54    /*
55    实参可以是一个对象,也可以是一个函数(函数也是一个对象)
56    */
57    function fun(a)
58    {
59        a(obj);
60    }
61    fun(hello);
62    /* 将一个匿名函数作为实参传递给函数 */
63    fun(function(){alert("hello")});
64     </script>
65     <head>
66     <body>
67     </body>
68 </html>

 

 

 

/* // ES6中的形参赋值默认值:设定形参不传递值,走等号后面的默认值,但是一旦传递值了(undefined除外),不论传递什么都不会走默认值
function sum(x = 0, y = 0) {
    var total = x + y,
        average = total / 2;
    average = average.toFixed(2);
    // 在函数体中一定可以拿到处理完成的结果的
    // console.log(average); //"15.00"
}
sum(10, 20);
console.log(average); //Uncaught ReferenceError: average is not defined 但是在函数外面,是不能直接访问函数体中的内容的(闭包的机制:当前上下文中的私有变量是受到保护的,不能在上下文以外直接的访问) */

// 函数的出口:返回值机制
function sum(x = 0, y = 0) {
    var total = x + y,
        average = total / 2;
    average = average.toFixed(2);

    // return
    //   + 不写return或者return后面啥都没有,默认返回值都是undefined
    //   + return后面是啥,返回值就是啥
    //   + return的一定是一个值,return average也不是返回变量,而是把变量存储的结果返回 -> return '15.00';
    return average;

    // 函数体中只要遇到return,函数体中,return下面的代码都不会再执行的
    console.log('OK');
}

 

 

任意数求和

 1 // ========for循环
 2 // 循环:一轮轮的重复做一些事情
 3 // for(「1.设定初始值」;「2.设定或者验证循环执行的条件」;「4.步长的累计」){
 4 //     「3.执行循环体中的代码」
 5 // }
 6 // i++ => i+=1 => i=i+1 自身基础上累加1
 7 // 区别:i++/++i一定是数学运算   i+=1/i=i+1可能是字符串拼接
 8 /* for (var i = 0; i < 5; i++) {
 9     console.log(`循环内:${i}`);
10 }
11 console.log(`循环外:${i}`); */
12 
13 //=========
14 // 需求:任意数求和
15 function sum() {
16     var args = arguments;
17     // 思路:依次循环(遍历/迭代)集合中的每一项,把取出来的每一项进行累加
18     var total = 0;
19     for (var i = 0; i < args.length; i++) {
20         // i=0 第一轮循环 args[0]集合中的第一项 i++
21         // i=1 第二轮循环 args[1]集合中的第二项 i++
22         // i=2 循环结束
23         // 循环的变量i从零开始,args这个集合中的每一项也是从索引零开始 => 每一轮循环的时候,i存储的值正好是我们需要获取集合中当前项的索引
24          => 每一轮循环 args[i] 获取的就是当前这一轮循环,从集合中取出来的当前项,i等价于当前项的索引
25         var item = Number(args[i]);
26         if (!isNaN(item)) { //isNaN(item) === false 有效数字
27             total += item;
28         }
29     }
30     return total;
31 } 
32 
33 var sum = (...args) => {
34     var total = 0;
35     for (var i = 0; i < args.length; i++) {
36         var item = Number(args[i]);
37         if (!isNaN(item)) {
38             total += item;
39         }
40     }
41     return total;
42 };
43 
44 var sum = (...args) => {
45     // 利用数组的方法实现求和
46     var total = 0;
47     args.forEach(item => {
48         item = Number(item);
49         if (!isNaN(item)) {
50             total += item;
51         }
52     });
53     return total;
54 }; 
55 
56  var sum = (...args) => {
57     return args.reduce((total, item) => {
58         item = Number(item);
59         isNaN(item) ? item = 0 : null;
60         return total + item;
61     }, 0);
62 }; 
63 
64 var res = sum(10, 20);
65 console.log(res); //=>30
66 
67 res = sum(10, 20, '30');
68 console.log(res); //=>60  把字符串转换为数字,防止出现字符串拼接
69 
70 res = sum(10, 20, '30', 'AA');
71 console.log(res); //=>60  非有效数字不进行任何的累加操作

 

获取时间字符串函数

  1 // 需求:真实项目中,我们从服务器获取到了时间字符串,但是格式并不是我们需要的,我们需要呈现在页面中的是 
  2 // => “yyyy年mm月dd日 hh时mm分ss秒”
  3 // 此时就需要客户端基于JS完成时间格式字符串的数据解析
  4 var time = "2020-9-18 9:55:12";
  5 time = "2020/9/18";
  6 
  7 // supplyZero:传递一个值给我,我们较验其是否符合两位,如果不符合,我们在前面补充零
  8 function supplyZero(value) {
  9     // 不论什么值加字符串都会变为字符串拼接:把value转换为字符串  String(value)/value.toString()
 10     value += '';
 11     return value.length < 2 ? `0${value}` : value;
 12 }
 13 
 14 /*
 15  * 思路4:JS中关于字符串的处理,往往最强大的方案“正则”
 16  */
 17 String.prototype.formatTime = function formatTime(template = '{0}年{1}月{2}日 {3}时{4}分{5}秒') {
 18     // this -> time时间字符串
 19     var arr = this.match(/\d+/g); //["2020", "9", "18", "9", "55", "12"]
 20     return template.replace(/\{(\d+)\}/g, function (_, index) {
 21         var item = arr[index] || "00";
 22         item.length < 2 ? item = `0${item}` : null;
 23         return item;
 24     });
 25 };
 26 time = time.formatTime();
 27 console.log(time);
 28 
 29 time = time.formatTime('{0}/{1}/{2}');
 30 console.log(time);
 31 
 32 time = time.formatTime('{1}-{2} {3}:{4}');
 33 console.log(time);
 34 
 35 
 36 
 37 
 38 
 39 /*
 40  * 思路3:利用标准日期对象中提供的方法,获取“年月日”等信息
 41  */
 42 /* time = new Date(time);
 43 var year = time.getFullYear(),
 44     month = time.getMonth() + 1, //0~11 => 1月~12月
 45     day = time.getDate(),
 46     weekday=time.getDay(),//获取星期几0~6
 47     hours = time.getHours(),
 48     minutes = time.getMinutes(),
 49     seconds = time.getSeconds();
 50 time = `${year}年${supplyZero(month)}月${supplyZero(day)}日 ${supplyZero(hours)}时${supplyZero(minutes)}分${supplyZero(seconds)}秒`;
 51 console.log(time);
 52     new Date().getTime()//获取日期距离1970-1-1 00:00:00之间的毫秒差 日期计算时经常用到
 53 
 54 */
 55 
 56 // var nowTime = new Date(); //获取当前客户端的时间
 57 // console.log(nowTime);
 58 // typeof nowTime => "object"
 59 // time = new Date(time); //把一个时间格式的字符串,转换为标准的日期对象  自己扩展:支持的时间字符串格式
 60 
 61 /*
 62  * 思路2:按照指定的分割符号和规律各种拆,最后获取到“年月日”等信息
 63  *   + split([char]):按照指定的分割符号,把字符串中拆出来的每一项存放到数组中
 64  */
 65 /* var arr = time.split(' '), //["2020-9-18", "9:55:12"]
 66     arrLeft = arr[0].split('-'), //["2020", "9", "18"]
 67     arrRight = arr[1].split(':'); //["9", "55", "12"] */
 68 // 优化:加入正则的辅助 \s一个空白字符 |或者  ?:只匹配不捕获
 69 /* var arr = time.split(/(?:\s|-|:)/); //["2020", "9", "18", "9", "55", "12"] */
 70 /* var year = arr[0],
 71     month = arr[1],
 72     day = arr[2],
 73     hours = arr[3],
 74     minutes = arr[4],
 75     seconds = arr[5]; */
 76 // 优化:基于ES6的解构赋值快速获取每一项的信息
 77 /* var [year, month, day, hours, minutes, seconds] = arr;
 78 time = `${year}年${supplyZero(month)}月${supplyZero(day)}日 ${supplyZero(hours)}时${supplyZero(minutes)}分${supplyZero(seconds)}秒`;
 79 console.log(time); */
 80 
 81 /*
 82  * 思路1:根据字符串截取的办法,获取到字符串中“年月日”等数据信息
 83  *   + substr(n,m)  从索引n开始截取m个
 84  *   + substring(n,m) 从索引n开始截取到索引m处,不包含m
 85  *   + slice(n,m) 和substring类似,可以支持负数作为索引的
 86  *   + indexOf/lastIndexOf([char]) 获取字符在字符串中第一次或者最后一次出现位置的索引,如果没有这个字符,返回索引-1
 87  */
 88 /* var indexBar1 = time.indexOf('-'),
 89     indexBar2 = time.lastIndexOf('-'),
 90     indexSpace = time.indexOf(' '),
 91     indexColon1 = time.indexOf(':'),
 92     indexColon2 = time.lastIndexOf(':');
 93 var year = time.substring(0, indexBar1),
 94     month = time.substring(indexBar1 + 1, indexBar2),
 95     day = time.substring(indexBar2 + 1, indexSpace),
 96     hours = time.substring(indexSpace + 1, indexColon1),
 97     minutes = time.substring(indexColon1 + 1, indexColon2),
 98     seconds = time.substring(indexColon2 + 1);
 99 time = `${year}年${supplyZero(month)}月${supplyZero(day)}日 ${supplyZero(hours)}时${supplyZero(minutes)}分${supplyZero(seconds)}秒`;
100 console.log(time); */

 

posted @ 2019-07-20 23:57  zuiaimiusi  阅读(214)  评论(0编辑  收藏  举报