js函数参数默认值注意点

函数参数默认值设置

js 复制代码
function foo(a,b=1,c=2){
    console.log(a,b,c);
 }
 foo(1,null,undefined);//1,null,2

默认值只有在参数传递undefined,或者不传(不传就是undefined)时候才会使用默认值。

由于上面给c传递undefined,所以会使用默认值。而给b传递null是可以成功的。

arguments

如果给参数赋值默认值,那么在函数内部修改了参数后,arguments内部的值也不会改变。如果没写默认值,或者不是严格模式,那么修改相应的参数,arguments相应也是会改变的。

不赋值默认值情况,改变函数参数

js 复制代码
function fn(a, b ) {
  console.log(arguments[1]);//4

  b = 111;
  console.log(arguments[1]);//111,会改变arguments的值
}

fn(1, 4);

赋值默认值情况,改变函数参数值

js 复制代码
function fn(a, b = 3) {
  console.log(arguments[1]);//4

  b = 111;
  console.log(arguments[1]);//4,不会改变arguments
}

fn(1, 4);

函数在严格模式下面,情况也会跟设置了参数默认值的情况一样 例如:

js 复制代码
function fn(a, b) {
  "use strict";
  console.log(arguments[1]); //4

  b = 111;
  console.log(arguments[1]); //4,不会改变arguments
}
fn(1, 4);

所以如果没有严格模式,也没有设置b的默认值,那么b在函数内部修改会改变arguments的值。

函数的length值

在没有给函数参数赋值默认值时,调用函数的length会返回函数的参数个数

js 复制代码
function fn(a, b, c) {}

console.log(fn.length); //1

如果给一个函数参数赋值默认值,那么使用length计算函数的参数个数时,会返回这个函数设置默认值的那个参数前的参数个数,例如下面

js 复制代码
function fn(a,b=1,c){}

console.log(fn.length);//1

function fn(a,b,c=1){}
console.log(fn.length);//2

默认值表达式

默认值表达式只有函数被调用,且用到这个默认值才会进行计算

js 复制代码
let num = 1;
function fn() {
  return num++;
}

function foo(a, b = fn()) {
  console.log(a, b);
}

foo(1, 2);//1 2
foo(1);//1 1   //这里开始fn才会调用
foo(1);//1 2

函数参数的暂时性死区

js 复制代码
function mul(num) {
  return num*2;
}

function foo(a, b = mul(a)) {
  console.log(a, b);
}

foo(1);//1 2

函数参数赋值的过程类似于下面这样

js 复制代码
let a=1
let b=mul(a);

再看看下面的例子,如果调换了a和b的位置

js 复制代码
function foo(b = mul(a),a) {
  console.log(a, b);
}
foo(undefined,1)//报错

上面参数赋值过程类似于下面,由于b还没声明所以会报错

js 复制代码
let a=mul(b);
let b=1;
相关推荐
freeWayWalker2 分钟前
Vue通用缩放容器
前端·javascript·vue.js
Hello--_--World9 分钟前
VUE:逻辑复用
前端·javascript·vue.js
陶甜也26 分钟前
3D智慧城市:blender建模、骨骼、动画、VUE、threeJs引入渲染,飞行视角,涟漪、人物行走
前端·3d·vue·blender·threejs·模型
患得患失94931 分钟前
【前端websocket】企业级功能清单
前端·websocket·网络协议
落魄江湖行31 分钟前
基础篇四 Nuxt4 全局样式与 CSS 模块
前端·css·typescript·nuxt4
禅思院32 分钟前
前端性能优化:从"术"到"道"的完整修炼指南
前端·架构·前端框架
叫我一声阿雷吧36 分钟前
JS 入门通关手册(43):async/await 原理与异常处理(实战 + 面试,彻底搞懂)
javascript·异常处理·promise·前端面试·async/await·generator·异步编程
架构师老Y2 小时前
003、Python Web框架深度对比:Django vs Flask vs FastAPI
前端·python·django
小陈工5 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
xiaotao1319 小时前
第九章:Vite API 参考手册
前端·vite·前端打包