javascript - js中函数的参数传递是值传递还是引用传递?怎么判断参数的类型?
ringa_lee
ringa_lee 2017-04-10 17:31:12
[JavaScript讨论组]
function initarr(n){
    var arr = [];
    for(var i=0;i<n;i++){
        arr[i] = parseFloat(prompt("第"+(i+1)+"个数"));
    }
    return arr;
}
function sumAndAvg(arr){
    var sum = 0;
    var avg = 0;
    for(var i in arr){
        sum = sum+arr[i];
    }
    avg = sum/arr.length;
    document.write("sum = "+sum);
    document.write("avg = "+avg);
}

一个简单的函数,比如我在此刻定义一个
var a = 10;
sumAndAvg(a);
实际函数是想要一个数组的参数的,但是这种情况下怎么判断穿进去的参数是什么类型?
这样的设计有什么优点或者有什么缺点应该怎么克服呢?

ringa_lee
ringa_lee

ringa_lee

全部回复(3)
怪我咯

js无法指定函数参数的类型,你如果想限制参数为array的话,就必须在函数内部判断 Array.isArray(arr)。

这个是动态类型语言无约束带来的问题,JS本身无法解决这个问题,你可以使用微软出的TypeScript语言,它带有类型系统,编译结果是JS。

如果只是想加一些类型约束而又不想换语言的话,可以试试facebook的flow.js,你可以这么写:

// @flow
function sumAndAvg(arr: Array<any>) {
  
}
var a = 10;
sumAndAvg(a);

这里的参数arr后面冒号部分就是flow.js加的类型约束,这样我们可以强制调用的时候使用数组。
然后运行flow做运行检查,就会提示类型不匹配

  7: sumAndAvg(a);
     ^^^^^^^^^^^^ function call
  7: sumAndAvg(a);
               ^ number. This type is incompatible with
  3: function sumAndAvg(arr: Array<any>) {
                             ^^^^^^^^^^ array type

而且在使用babel插件transform-flow-strip-types之后,这些额外的类型信息就会被去除掉,就可以正常的执行了。

这样我们可以在开发时检查类型,在生产环境下去除。

PHP中文网

原生不检查参数类型,这是由于js是弱数据类型的语言。
一般情况下,js作为浏览器端的支持的时候,输入参数类型是写代码的人预先就想好的了,所以一般不会出现这种问题。但是如果涉及用户输入或者交互产生数据的时候,就有可能会出现题主的情况。
做法就是通过自定义方法判断数据类型之后在进行处理。
下面是几个类型判断的方法,抛砖引玉:

/**
* 判断传入参数类型
*/
function isArray(obj){    //数组类型
  return (typeof obj=='object')&&obj.constructor==Array; 
};
function isString(obj){    //字符串类型
  return (typeof obj=='string')&&obj.constructor==String; 
};
function isNumber(obj){    //数值类型
  return (typeof obj=='number')&&obj.constructor==Number; 
};
function isDate(obj){    //日期类型
  return (typeof obj=='object')&&obj.constructor==Date; 
};

所以题主这样就好了:

function sumAndAvg(arr){
    if(!isArray(arr)){
        console.log("不是合法的数组")
        return null
    }
    ......
}
巴扎黑

javascript中的参数传递都采用 按值传递的方式
对于对象来说,这个值是指对象的内存地址
对基本类型,这个值是原始值

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号