语言特性-函数重载与类型检查

函数重载要依赖于两点:判断传入参数数量的能力和判断传入参数类型的能力。

JS函数的参数列表,参数仅在函数内有效。参数列表是一个伪数组,可以访问其中的元素,具有.length属性,但是不能push()

<script language="javascript" type="text/javascript">

        function sendMessage(msg, obj) {

            if (arguments.length == 2) {

                obj.handleMsg(msg); //参数为函数的第一个参数

            }

            else {

                alert(msg);

            }

        }

 

        sendMessage("hello,javascript!"); //输出hello,javascript!

        //将我们写好的对象传入,用handleMsg方法调

        sendMessage("hello", {

            handleMsg: function(msg) { //此处方法必须和obj.handleMsg相同

                alert("print:  " + msg);

            }

        }

              );

        //--------------------------------------

        //一个接受任意数量参数,并将参数转化为数组的函数

        function makeArray() {

            var arr = [];

            for (var i = 0; i < arguments.length; i++) {

                arr.push(arguments[i]);

            }

            return arr;

        }

        //将makeArray函数实例化,并输出数组的每个值

        function printArray() {

            var array = makeArray("asd", "42", 90, "bj", 900);

            for (var i = 0; i < array.length; i++) {

                alert(array[i]);

            }

        }

        printArray();

        //------------------------------------

        //在函数中判断参数类型的时候,如果没有参数,那么其类型必定为undefined.

        function displayError(msg) {

            if (typeof msg == undefined) {

                msg = "undefined";

            }

            msg = typeof msg;

            alert(msg);

        }

        displayError("rxm");

        //------------------------------------

        //判断类型的时候有两张方法,

        //一:typeof eg:typeof msg[当变量不是object或array时,这种方法很完美]

        //二:引用所有JS对象都拥有的一个属性,这个属性引用的是构造该对象时候的函数[构造函数]

        var msg = "rxm,ru,rem";

        var arr = new Array();

        if (msg.constructor ==

        String) {

            arr = msg.split(","); //如果变量是字符串,将其切成数组

        }

        //------------------------------------

        //用变量类型列表检查参数列表

        function strict(types, args) {

            if (types.length != args.length) {

                throw "变量参数的个数与函数列表不符!";

            }

            for (var i = 0; i < args.length; i++) {

                if (args[i].constructor != types[i]) {

                    throw "参数类型不符要求!";

                }

            }

        }

 

        function book(name, price, content) {

            strict([String, Number, Array], arguments);

            for (var i = 0; i < content.length; i++) {

                alert(content[i]);

            }

        }

        // book("", "", "sd");//抛出异常

        book("语文", 90, ["春", "夏", "秋", "冬"]);

    </script>

posted @ 2013-07-15 16:09  hometown  阅读(143)  评论(0编辑  收藏  举报