zoukankan      html  css  js  c++  java
  • 原生js函数的伪重载

    一、我们在学习java的时候,其中方法有一个比较的重要的特性重载,根据传入的参数的个数来执行不同的方法,而方法其根据签名来判断,而JavaScript却不能根据方法的签名来进行重载,只能通过参数的个数的来进行实现伪重载。

    在函数体中有个对象arguments,记录调用函数的传入的参数的对象:

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4     <title></title>
     5 </head>
     6 <body>
     7 <script type="text/javascript">
     8     function reloadFunc(ar1,ar2,ar3){
     9             console.log(arguments);
    10             console.log(typeof arguments);
    11     };
    12     reloadFunc('a','b')
    13 </script>
    14 </body>
    15 </html>

     输出:

    1 Arguments(2) ["a", "b", callee: ƒ, Symbol(Symbol.iterator): ƒ]0: "a"1: "b"callee: ƒ reloadFunc(ar1,ar2,ar3)length: 2Symbol(Symbol.iterator): ƒ values()__proto__: Object

     我们可以在定义函数函数的不显示的显示参数,通过传入arguments的长度来判断参数。

     1     function reloadFunc(){
     2         switch(arguments.length){
     3             case 1:
     4             console.log("一个参数!");
     5             break;
     6             case 2:
     7             console.log("两个参数!");
     8             break;
     9             case 3:
    10             console.log('三个参数!');
    11             break;
    12             default:
    13             console.log('未传入参数!')
    14         }
    15     };
    16     reloadFunc('a','b');
    17     reloadFunc();
    18     reloadFunc(1,2,3)

    等同于:

     1 <script type="text/javascript">
     2     function reloadFunc(ar1,ar2,ar3){
     3         switch(arguments.length){
     4             case 1:
     5             console.log("一个参数!");
     6             break;
     7             case 2:
     8             console.log("两个参数!");
     9             break;
    10             case 3:
    11             console.log('三个参数!');
    12             break;
    13             default:
    14             console.log('未传入参数!')
    15         }
    16     };
    17     reloadFunc('a','b');
    18     reloadFunc();
    19     reloadFunc(1,2,3)
    20 </script>

    注意:1、当我们显示定义了参数之后,如果传入的参数个数小于我们显示定义参数,默认缺省参数为undefined的。

       2、arguments的对象和函数的参数是不同的内存空间,我们可以通过arguments修改参数。

       3、通过arguments修改参数的时候,可以反射对应的变量,但是arguments的长度在调用该函数的时候,就已经决定了。如果我们修改arguments的不存在的索引的变量值并不能反射到对应变量,依然是undefined的:

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4     <title></title>
     5 </head>
     6 <body>
     7 <script type="text/javascript">
     8     function reloadFunc(ar1,ar2,ar3){
     9         arguments[3]=2;
    10         console.log(ar3);
    11     };
    12     reloadFunc('a','b');
    13 </script>
    14 </body>
    15 </html>

     输出:

    1 undefined

    我们可以通过下标访问arguments对象:

    1 <script type="text/javascript">
    2     function reloadFunc(ar1,ar2,ar3){
    3             console.log(arguments);
    4             console.log(typeof arguments);
    5             console.log(arguments[0],arguments[1])
    6     };
    7     reloadFunc('a','b')
    8 </script>

     我们可以通过判断该对象的长度来进行方法的重载。

     1 <script type="text/javascript">
     2     function reloadFunc(ar1,ar2,ar3){
     3         switch(arguments.length){
     4             case 1:
     5             console.log("一个参数!");
     6             break;
     7             case 2:
     8             console.log("两个参数!");
     9             break;
    10             case 3:
    11             console.log('三个参数!');
    12             break;
    13             default:
    14             console.log('未传入参数!')
    15         }
    16     };
    17     reloadFunc('a','b');
    18     reloadFunc();
    19     reloadFunc(1,2,3)
    20 </script>

     输出:

    1 两个参数!
    2 函数重载.html:20 未传入参数!
    3 函数重载.html:17 三个参数!

    我们可以判断传入的参数的长度来决定一个执行的不同的代码块。实现类似的java的伪重载。

  • 相关阅读:
    去除aspx生成的页面最开始的空行
    单个方框内图片垂直水平居中和等比例缩小(支持所有浏览器)
    .net里怎样在Main方法之前执行代码?
    WIN7系统盘空间不够用解决办法
    语音识别工具箱之HTK安装与使用
    一个VC中的DLL导出类的例子
    c++ 随机数 产生不重复的随机数
    android开发 NDK 编译和使用静态库、动态库
    c++指针 初识
    c++ UTF8和Unicode 互转
  • 原文地址:https://www.cnblogs.com/evilliu/p/9746012.html
Copyright © 2011-2022 走看看