JavaScript 中函数的参数
functionName(parameter1, parameter2, parameter3) {
// 要执行的代码……
}
参数规则
JavaScript 函数定义时形参没有指定数据类型。
JavaScript 函数不会对实参的类型进行检测。
JavaScript 函数不会对实参的个数进行检测。
默认参数
如果调用函数时未传入足够多的实参,未提供的参数会被默认设置为: undefined.
所以我们最好为参数设置一个默认值。
function myFunction(x, y) {
console.log(x);
console.log(y);
console.log(typeof y);
y = y || 1; //为 y 参数设置默认值
console.log(y);
}
myFunction(2);
如果传入了 y 参数,y = y || 1 会返回 y;如果没有传入 y 参数,y = y || 1 会返回我们设置的默认值 1,因为 undefined 为 false.
JS不同于其他语言,方便起见它通过第一个值求 “||”,第一个值为“true”,则返回第一个值;第一个值为“false”,则返回第二个值。
Arguments 对象
如果调用函数时传入了过多的实参,参数将无法被引用,因为无法找到对应的参数名。 只能使用 arguments 对象来调用实参。
JavaScript 函数有个内置的对象 arguments 对象。argument 对象包含了调用函数时传入的参数数组,它是一个类数组对象。
我们可以通过 arguments 对象的属性和方法让函数实现很多特殊的功能。
1、js不检测实参的个数,但是我们可以用 argument 对象的 length 属性检测实参的个数。
function add() {
if( arguments.length == 2 ){
return arguments[0] + arguments[1];
}else{
return '传入的参数不合法';
}
}
console.log( add(2,3) );
console.log( add(1,2,3) );
2、重载函数。
js是一种弱类型的语言,没有重载机制,当我们重写函数时,会将原来的函数直接覆盖掉。
但是我们可以通过 arguments 对象判断传入实参的类型与数量,进行不同的操作,然后返回不同的数值,以实现重载。
function sumAll() {
var i, sum = 0;
for (i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return sum;
}
console.log( sumAll(1,2,3,4,5) ); //
console.log( sumAll(1,3,5,7,9,11,13) ); //
3、定义一个函数来连接字符串。
你可以传递任意数量的参数到该函数,第一个参数指定一个字符作为衔接点来连接字符串。
function myConcat(separator) {
var args = Array.prototype.slice.call(arguments, 1); //从第二个参数开始将参数列表转换成参数数组
return args.join(separator);
}
var x = myConcat(", ", "red", "orange", "blue"); //"red, orange, blue"
var y = myConcat("; ", "elephant", "giraffe", "lion", "cheetah"); //"elephant; giraffe; lion; cheetah"
console.log(x);
console.log(y);
附:转成数组的通用函数(可以将 arguments 对象转换成数组)
var toArray = function(s){
try{
return Array.prototype.slice.call(s);
} catch(e){
var arr = [];
for(var i = 0,len = s.length; i < len; i++){
//arr.push(s[i]);
arr[i] = s[i]; //据说这样比push快
}
return arr;
}
}
参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments
JavaScript 中函数的参数的更多相关文章
- JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域
一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){ var bar = 1; fn(); } var bar = 99; test(fun ...
- 如何理解javaSript中函数的参数是按值传递
本文是我基于红宝书<Javascript高级程序设计>中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式. (结合资料的个人 ...
- Javascript中函数的四种调用方式
一.Javascript中函数的几个基本知识点: 1.函数的名字只是一个指向函数的指针,所以即使在不同的执行环境,即不同对象调用这个函数,这个函数指向的仍然是同一个函数. 2.函数中有两个特殊的内部属 ...
- JavaScript中函数的形参和实参的实现原理剖析
我们都知道JS里面参数的传递是可以不一样的,比如我们有一个函数: <script type="text/javascript"> function one(a,b,c) ...
- JavaScript中函数的调用
JavaScript中函数的调用 制作人:全心全意 在JavaScript中,函数定义后并不会自动执行,要执行一个函数需要在特定的位置调用该函数,调用函数需要创建调用语句,调用语句包含函数名称和参数. ...
- JavaScript中函数的定义
JavaScript中函数的定义 制作人:全心全意 在JavaScript中,函数是由关键字function.函数名加一组参数以及置于大括号中需要执行的一段代码定义的.定义函数的基本语法格式如下: f ...
- javascript中函数声明、变量声明以及变量赋值之间的关系与影响
javascript中函数声明.变量声明以及变量赋值之间的关系与影响 函数声明.变量声明以及变量赋值之间有以下几点共识: 1.所有的全局变量都是window的属性 2.函数声明被提升到范围作用域的顶端 ...
- 改变JavaScript中函数的内部this指向!
改变JavaScript中函数的内部this指向! 第一种方法 call call 可以 调用函数 + 改变函数内的this指向! var obj = { name: 'lvhang' } funct ...
- JavaScript中函数的调用!
JavaScript中函数的调用! 1 普通函数 // 1 普通函数 function fn() { console.log(123); } // 函数名 + 一个小括号! 或者 函数名.call() ...
随机推荐
- array详解
array和vector大致是相同的,区别在于array的大小是固定的.不能增加和缩小.另外array的swap()函数和vector的swap()函数在算法复杂度上是有区别的,array.swap( ...
- nginx发布antd-pro项目(别人发的,未测试)
server { listen ; server_name localhost; #charset koi8-r; charset utf-; #access_log logs/host.access ...
- ASP.Net GridView 基础 绑定字段
通过以前的学习,我们实现了效果如下: 现在我想修改显示/隐藏部分列,有两种做法: 一.在配置数据源的时候不是有查询哪些字段的吗,去除不需要的字段,重新绑定. 二.就是直接编辑列 下面是分析每种字段类型 ...
- Shell笔记-02
Shell支持自定义变量. 定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编 ...
- vlc源码分析(六) 调用OpenMAX硬解码H.265
H.265(HEVC)编码格式能够在得到相同编码质量视频的前提下,使用相当于H.264(AVC)一半的存储容量,虽然H.265的算法复杂度比H.264高一个数量级,但是硬件水平在不断提高,因此H.26 ...
- 多线程系列之 java多线程的个人理解(二)
前言:上一篇多线程系列之 java多线程的个人理解(一) 讲到了线程.进程.多线程的基本概念,以及多线程在java中的基本实现方式,本篇主要接着上一篇继续讲述多线程在实际项目中的应用以及遇到的诸多问题 ...
- Java上机试题1
1. 有一串字符串String s = "ababab", 这个字符串可以看做由3个"ab"构成,即n=3, L = "ab", s = n ...
- duplicate symbol _OBJC_IVAR
duplicate symbol _OBJC_IVAR - Kingdev - 博客园 代码合并问题 git合并提示冲突文件为project.pbxproj,先去掉所有冲突提示<<< ...
- c#网络传输
接着前面简单讲的,给大家聊聊服务开发. 网络传输 先说网络传输开发,总体来说,可以看成4中模型 我们把传输过程看做网线,那么在通过传输的过程中.2边就涉及池化问题,也就是我们常见的异步传输. 在业务端 ...
- docker 入门 (二)基本操作
这一篇讲docker的基本操作. 请自行安装docker到自己的电脑上. 镜像的获取 要获取镜像,最简单的当然是从仓库去获取,docker的官方网站很不好练,其他的可选项有docker中国官网,阿里镜 ...