ES6标准---【三】【学习ES6看这一篇就够了!!!】

目录

ES6以往文章

ES6之前函数默认值参数的处理方法

ES6函数参数的默认值

与结构赋值默认值结合使用

参数默认值的位置:

函数的length属性

作用域

参数的默认值是一个函数

正确理解函数默认值的例子

应用

指定某一个函数参数不得省略,如果省略就抛出一个错误

将函数默认值设为undefined,表明这个参数是可以省略的:

ES6以往文章

ES6标准---【一】【学习ES6看这一篇就够了!!】-CSDN博客

ES6标准---【二】【学习ES6看这一篇就够了!!】-CSDN博客

ES6之前函数默认值参数的处理方法

ES6之前,不能直接作为函数的参数指定默认值,只能采用变通的方法

function log(x, y) {
  y = y || 'World';
  console.log(x, y);
}
log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello World

上面代码检查函数log的参数y有没有赋值,如果没有,则指定默认值为“World”

这种写法缺点在于,如果y被赋值,但对应的布尔值为False(如0),则该赋值不起作用

就像上面代码最后一行,参数y等于空字符,结果被改为默认值

ES6函数参数的默认值

ES6允许为函数的参数设置默认值,即直接写在参数定义的后面

function log(x, y = 'World') {
  console.log(x, y);
}
log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello

参数变量是默认声明的,所以不能用“let”或“const”再次声明

function foo(x = 5) {
  let x = 1; // error
  const x = 2; // error
}

但是使用“var”可以再次声明

function foo(x = 5){
    console.log(x);
    var x = 1;
    console.log(x);
}
foo();

  • 使用函数默认值时,函数不能有同名参数
  • 不使用函数默认值,函数可以有同名参数
<body>
	<script>
		//foo函数不报错
		function foo(x,x,z){
			return 1;
		}
		//bar函数报错,因为参数x重复了
		function bar(x,x=1){
			return 2;
		}
	</script>	
</body>

  • 如果有同名参数,则最后一个参数是会被正确读入
<body>
	<script>
		//foo函数不报错
		function foo(x,x,z){
			console.log(x,x,z);
		}
		foo(1,2,3);
	</script>	
</body>

效果:

参数默认值不是传值的,而是每次都重新计算默认值表达式的值

即:“参数默认值是惰性求值的

let x = 99;
function foo(p = x + 1) {
  console.log(p);
}
foo() // 100
x = 100;
foo() // 101

与结构赋值默认值结合使用

function foo({x, y = 5}) {
  console.log(x, y);
}
foo({}) // undefined 5
foo({x: 1}) // 1 5
foo({x: 1, y: 2}) // 1 2
foo() // TypeError: Cannot read property 'x' of undefined

上面代码只使用了对象的解构赋值默认值,没有使用函数参数的默认值。

当函数foo的参数是一个对象时,x,y才能正确生成

如果调用函数foo时没有提供参数,x,y就不会生成

解决办法是,提供函数参数默认值来避免这种情况:

function foo({x, y = 5} = {}) {
  console.log(x, y);
}
foo() // undefined 5

理解“解构赋值默认值”和“函数参数默认值”:

// 写法一
function m1({x = 0, y = 0} = {}) {
  return [x, y];
}
// 写法二
function m2({x, y} = { x: 0, y: 0 }) {
  return [x, y];
}

//函数没有参数时
m1(); //[0,0]
m2(); //[0,0]

//参数都有值时
m1({x:3,y:8}); //[3,8]
m2({x:3,y:8}); //[3,8]

//x有值,y无值时:
m1({x:3}); //[3,0]
m2({x:3}); //[3,undefined]

//x无值,y有值时:
m1({y:8}); //[0,8]
m2({y:8}); //[undefined,8]

//x,y都无值时:
m1({}); //[0,0]
m2({}); //[undefined,undefined]

参数默认值的位置:

通常,“默认值参数”应该放在“函数参数列表”的最后

如果“默认值参数”没有放在“函数参数列表”的最后,那么这个“默认值参数”将不能被省略

// 例一
function f(x = 1, y) {
  return [x, y];
}
f() // [1, undefined]
f(2) // [2, undefined]
f(, 1) // 报错
f(undefined, 1) // [1, 1]
// 例二
function f(x, y = 5, z) {
  return [x, y, z];
}
f() // [undefined, 5, undefined]
f(1) // [1, 5, undefined]
f(1, ,2) // 报错
f(1, undefined, 2) // [1, 5, 2]

函数的length属性

函数的length属性将返回“没有默认值的参数个数

(function (a) {}).length // 1
(function (a = 5) {}).length // 0
(function (a, b, c = 5) {}).length // 2
  • 如果“默认值参数”不在“参数列表”最后,那么length属性也不会计算后面的参数:
(function (a = 0, b, c) {}).length // 0
(function (a, b = 1, c) {}).length // 1

作用域

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)

等到初始化结束,这个作用域就会消失

var x = 1;
function f(x, y = x) {
  console.log(y);
}
f(2) // 2

let x = 1;
function foo(y = x) {
  let x = 2;
  console.log(y);
}
foo() // 1
  • 调用函数f时,参数形成一个单独的作用域,y的默认值等于参数列表中的x的值(2)
  • 调用函数foo时,参数形成一个单独的作用域,y的默认值等于x的值,由于当前作用域没有x,转而在“函数所在作用域”中寻找x(1)

下面这样写,也会报错(由于暂时性死区,会报错“x未定义”):

var x = 1;
function foo(x = x) {
  // ...
}
foo() // ReferenceError: x is not defined

参数的默认值是一个函数

如果参数的默认值是一个函数,该函数的作用域也遵守“单独形成一个作用域”的规则

let foo = 'outer';
function bar(func = () => foo) {
  let foo = 'inner';
  console.log(func());
}
bar(); // outer

如果写成下面这样,就会报错:

function bar(func = () => foo) {
  let foo = 'inner';
  console.log(func());
}
bar() // ReferenceError: foo is not defined

正确理解函数默认值的例子

var x = 1;
function foo(x, y = function() { x = 2; }) {
  var x = 3;
  y();
  console.log(x);
}
foo() // 3
x // 1

函数foo的参数形成一个单独作用域

在这个作用域里,y的默认值是一个匿名函数,函数内部的变量x指向同一个作用域的第一个参数x

函数foo内又声明一个内部变量x该变量与第一个参数x由于不是同一个作用域,所以不是同一个变量,因此执行y后,内部变量x和全局变量x的值都没变

应用

指定某一个函数参数不得省略,如果省略就抛出一个错误

<body>
	<script>
		function throwError() {
			throw new Error('Something went wrong');
		}
		function foo(mustParams=throwError()){
			console.log(mustParams);
		}
		foo();
	</script>	
</body>

效果:

将函数默认值设为undefined,表明这个参数是可以省略的:

function foo(optional = undefined) { ··· }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/874470.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型LLM:合成训练样本的数据分布问题

近几天在研究大模型LLM数数问题时&#xff0c;使用合成数据集来训练LLM“统计字符串&#xff08;100个单词以内&#xff09;中字母的个数”的能力&#xff0c;基于Word进行分词。原始的合成代码在生成随机字符串时&#xff0c;采用如下代码&#xff1a; # self.words为常见英文…

Python安装llama库出错“metadata-generation-failed”

Python安装llama库出错“metadata-generation-failed” 1. 安装llama库时出错2. 定位问题1. 去官网下载llama包 2.修改配置文件2.1 解压文件2.2 修改配置文件 3. 本地安装文件 1. 安装llama库时出错 2. 定位问题 根据查到的资料&#xff0c;发现时llama包中的execfile函数已经…

在职研生活学习--20240907

开学第一天 9月7日&#xff0c;中南大学商学院迎来了一支充满活力的队伍——2024级MBA新生集体整装待发&#xff0c;我们满怀期待地登上了前往长沙望城柏乐园的大巴&#xff0c;准备开启一场为期两天一夜的素质拓展与团队建设之旅。 迎新幼儿园PPT 出发 抵达柏乐园&#xff0c;…

Kubernetes------Service

目录 一、属性说明 二、定义和基本配置 1、定义 2、创建Service 2.1、typeClusterIP 2.2、typeNodePort 2.3、固定IP访问 三、Service、EndPoint、Pod之间的关系 四、服务发现 1、基于Service中IP访问外部服务 2、基于Service中域名访问外部服务 五、Ingress的安装和使…

Caffenie配合Redis做两级缓存

一、什么是两级缓存 在项目中。一级缓存用Caffeine&#xff0c;二级缓存用Redis&#xff0c;查询数据时首先查本地的Caffeine缓存&#xff0c;没有命中再通过网络去访问Redis缓存&#xff0c;还是没有命中再查数据库。具体流程如下 二、简单的二级缓存实现-v1 目录结构 2…

合宙低功耗4G模组AIR780EX ——开发板使用说明

EVB-AIR780EX 开发板是合宙通信推出的基于 Air780EX 模组所开发的&#xff0c;包含电源&#xff0c;SIM 卡&#xff0c;USB&#xff0c;天线&#xff0c;等必要功能的最小硬件系统。 以方便用户在设计前期对Air780E模块进行 性能评估&#xff0c;功能调试&#xff0c;软件开发…

请教一下,安恒信息为什么2024年上半年巨亏2.76亿元?

【科技明说 &#xff5c; 科技热点关注】 根据公开的财务报告来看&#xff0c;安恒信息2024年上半年实现营业总收入6.98亿元&#xff0c;同比增长0.29%。尽管公司在数据安全、商用密码和信创安全等核心业务领域实现了较快增长&#xff0c;但整体上仍然面临亏损。 目前来看&…

blender云渲染来了,blender云渲染教程!

朋友们&#xff0c;成都渲染101农场blender云渲染上线了&#xff0c;继3DMAX/C4D/maya/UE5云渲染上线后&#xff0c;又上线了blender云渲染&#xff0c;今天&#xff0c;成都渲染101渲染农场用四步教会您blender云渲染&#xff01; 第一步&#xff0c;云渲码6666注册个渲染101…

【STM32 HAL库】IIC通信与CubeMX配置

【STM32 HAL库】IIC通信与CubeMX配置 前言理论IIC总线时序图IIC写数据IIC读数据 应用CubeMX配置应用示例AHT20初始化初始化函数读取说明读取函数 前言 本文为笔者学习 IIC 通信的总结&#xff0c;基于keysking的视频内容&#xff0c;如有错误&#xff0c;欢迎指正 理论 IIC总…

大模型备案,全程配合包过拿到备案号

本文详解备案流程&#xff0c;旨在帮助企业和开发者顺利完成备案&#xff0c;确保AI技术健康有序发展。 一、政策要求做大模型备案 大模型备案是中国国家互联网信息办公室为加强生成式人工智能服务的管理&#xff0c;确保用户权益得到充分保护&#xff0c;以及保障国家安全和…

web基础之SSRF

1、内网访问 题目提示&#xff1a;访问位于127.0.0.1的flag.php&#xff1b;直接利用ssrf漏洞访问?url127.0.0.1/flag.php 2、伪协议读取文件 &#xff08;1&#xff09;题目提示&#xff1a;尝试去读取一下Web目录下的flag.php吧 &#xff08;2&#xff09;什么是伪协议&a…

【网络】网络通信的传输方式

目录 1.网络通信中的两种基本通信模式 1.1.怎么理解连接 1.2.面向有连接类型 1.3.面向无连接类型 2.实现这两种通信模式的具体交换技术 2.1.电路交换 2.2.分组交换 3.根据接收端数量分类 单播&#xff08;Unicast&#xff09; 广播&#xff08;Broadcast&#xff09; …

使用C++编写一个语音播报时钟(Qt)

要求&#xff1a;当系统时间达到输入的时间时&#xff0c;语音播报对话框中的内容。定时可以取消。qt界面如上图所示。组件如下&#xff1a; countdownEdit作为书写目标时间的line_edit start_btn作为开始和停止的按钮 stop_btn作为取消的按钮 systimelab显示系统时间的lab tex…

火语言RPA流程组件介绍--鼠标拖拽元素

&#x1f6a9;【组件功能】&#xff1a;在开始位置上按下鼠标&#xff0c;拖动到结束坐标或指定元素上放下鼠标&#xff0c;实现目标元素的拖拽 配置预览 配置说明 丨拖动元素 支持T或# 默认FLOW输入项 开始拖动的元素,并从当前元素开始按下鼠标 丨拖动到 目标元素/目标位…

解锁Web3.0——Scaffold-eth打造以太坊DApp的终极指南

&#x1f680;本系列文章为个人学习笔记&#xff0c;目的是巩固知识并记录我的学习过程及理解。文笔和排版可能拙劣&#xff0c;望见谅。 目录 前言 一、快速部署 1、前期准备&#xff1a; 2、安装项目&#xff1a; ​ 二、配置部署运行环境 1、初始化本地链&#xff1a;…

html css网页制作成品

前言 在HTML和CSS中创建一个网页是一个简单的过程&#xff0c;但是要创建一个成品级的网页&#xff0c;你需要考虑更多的因素&#xff0c;例如&#xff1a; 响应式设计&#xff1a;确保你的网页在不同的设备和屏幕尺寸上都能良好显示。 访问性&#xff1a;确保你的网页对于大…

三天入门WebGIS开发:智慧校园篇

WebGIS开发听起来可能有点高大上&#xff0c;但其实只要掌握几个关键点&#xff0c;入门并不难。智慧校园作为WebGIS的一个热门应用场景&#xff0c;集成了地理信息与校园管理&#xff0c;为校园带来智能化革新。接下来的三天&#xff0c;我们将一步步带你入门WebGIS开发&#…

大数据-130 - Flink CEP 详解 - CEP开发流程 与 案例实践:恶意登录检测实现

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

8.10Laplacian算子

实验原理 Laplacian算子也是一种用于边缘检测的技术&#xff0c;它通过查找二阶导数的零交叉点来定位边缘。 cv::Laplacian()函数是OpenCV库提供的一个用于计算图像拉普拉斯算子的函数。拉普拉斯算子是一个二阶微分算子&#xff0c;常用于图像处理中检测边缘或突变区域。它通…

揭秘!全罐喂养值得吗?高性价比主食罐头推荐

家里的五岁的公猫&#xff0c;已绝育&#xff0c;不爱喝水&#xff0c;医生建议喂湿粮。一开始还是早干晚湿&#xff0c;干粮存货都处理完后&#xff0c;就开始全罐喂养了。身边也有许多铲屎官十分好奇全罐喂养到底值不值&#xff0c;那么今天就来分享一下全罐喂养的感想和经验…