ES6(一部分)未完...

文章目录

  • ES6
      • 1.ES6 let声明变量
      • 2.ES6 const声明常量
      • 3.变量解构赋值
        • 3-1解构对象
        • 3-2解构数组
        • 3-3字符串解构
      • 4.模板字符串
      • 5.字符串扩展
        • 5-1 include函数
        • 5-2 repeat函数(重复)
      • 6.数值扩展
        • 6-1二进制和八进制表示法
        • 6-2isFinite 与 isNaN方法
        • 6-3islnteger方法
        • 6-4极小常量Number.EPSILON
        • 6-5Math.trunc
        • 6-6Math.sign
      • 7.数组扩展
        • 7-1扩展运算符
        • 7-2Array.from
        • 7-3Array.of
        • 7-4find findIndex() 方法
        • 7-5 fill方法(填充)
        • 7-6 flat() flatMap()
      • 8.对象扩展
        • 8-1 对象简写
        • 8-2对象属性 表达式
        • 8-3 扩展运算符 ES2018
        • 8-4 Object.assign(快速合并数组)
        • 8-5 Object.is
      • 9.函数扩展
        • 9-1.函数参数的默认值
        • 9-2.rest参数 剩余参数
        • 9-3. name属性
        • 9-4. 箭头函数*
      • 10.Symbol

ES6

1.ES6 let声明变量

1.块级作用域(只能在大括号内使用)
之前的var,可以在外部访问,容易污染到全局

  • let的经典案例:有一个ul,里面有三个li,功能是,遍历这个列表,然后分别给每个li绑定事件,绑完之后,点哪个,就弹出来哪个的索引值这样一个功能
<ul><li>11111</li><li>22222</li><li>33333</li>
<ul>
<script>//①用var写:👇var oli = document.querySelectorAll("ul li")for(var i=0;i<oli.length;i++){oli[i]onlick=function(){console.log(i)}}//②用let写:👇var oli = document.querySelectorAll("ul li")for(let i=0;i<oli.length;i++){oli[i]onlick=function(){console.log(i)}}</script>

2.不允许重复声明

3.变量提升没有了

<script>let name = "zxy"function test(){//conosle.log(myname)let name = "tiechui"}test()
</script>

4.不与顶层对象挂钩

<script>let myage = 100console.log(myage)
</script>

2.ES6 const声明常量

<script>//1.常量const myname = "zxy"//常量一开始必须要进行初始化myname = "tiechui"//执行错误,不能赋值给常量//2.不能重复定义const myname = "tiechui"//上面定义过了,所以这里执行会出错//3.块级{const myname = "zxy"}console.log(myname)//4.声明不提升const name = "zxy"function test(){//conosle.log(myname)const name = "tiechui"}test()//5.不与顶层对象挂钩const myage = 100console.log(window.myage)//undefined
</script>
  • const经典例子
<script>const myobj = {//myobj是指向下面这些复杂数据类型的地址name:"zxy",age:100}myobj.name = "tiechui"console.log(myobj)//地址里面的数据是可以改的,不影响const/*如果就是不让修改,那可以使用freeze,然后用“()”括起来(冻住了)[但是只能冻住一级属性,如果里面还有复杂数据类型的话,是冻不住的]*/const myobj = Object.freeze({name:"zxy",age:100})myobj.name = "tiechui"console.log(myobj)
</script>

3.变量解构赋值

  • 解构赋值,就是快速的从对象或者数组中取出成员的一个语法方式
3-1解构对象
  • 快速的从对象中获取成员
<script>
// ES6 的方法向得到对象中的成员const obj = {name:"zxy",age:100,gender:'女'}let name = obj.namelet age = obj.agelet gender = obj.gender//解构赋值的放大从对象中获取成员const obj = {name:"zxy",age:100,gender:'女'}</script>

对象解构赋值👇

<script>let obj = {name:"zxy",age:100}let {name,age} = obj//name和age可以交换顺序(数组解构不可以)console.log(name,age)let code = "AAAA"let res = {code:200,//①  date:"1111"//②如果date的内容变复杂,是一个列表👇date:{list:["aaa","bbb","ccc"]}}//①let {date,code:co,err="2222"} = res/*内层函数,和外部变量有重名,可以用xxx:xx(不重名的话会报错)*/console.log(date,co,err)//②let {date{list:[x,y,z]},code:co,err=:"3333"} = resconsole.log(x,co,err)
</script>

传参
在这里插入图片描述

3-2解构数组

在这里插入图片描述
数组解构赋值👇

<script>
//最简单的数组解构赋值:let arr = [1,2,3]//console.log(arr[1])let [a,b,c] = arr//运行之后,输入a拿到1,b拿到2,c拿到3//如何快速交换两个数的值,不借助第三个变量	let x=1;let y=2;[y,x]=[x,y]//x,y的值交换了let arr = [1,2,3]//console.log(arr[1])let [,,a] = arr//console.log(a)//执行之后拿到的是3//如果一个数组里又嵌套了一个数组,那该怎么拿呢let arr = [1,[2,3,4],5,6]let [a,[b,,d],c] = arrconosle.log(b,d)//执行拿到的是b和d//如果返回了一个数组,这个数组是空的,第一个元素上来就是undefined,那么就可以给它一个初始值let [x=1] = [100]
</script>
3-3字符串解构

在这里插入图片描述

4.模板字符串


<style>.active{color:red;}
</style><ul></ul>
<script>let name = "tiechui"let oli = "<li>\<b>"+name+"<b>\</li>"let oli = `<li><b>${name}</b></li>`console.log(oli)let arr =["tiechui","zxy","gangdan"]//map为数组中的映射let newlist = arr.map(function(item){return `<li><b>aaaa<b></li>`})console.log(newlist)//执行结果如下图👇
</script>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<head><style>.active{color:red;}</style>
</head>
<ul></ul>
<script>function test(){return"返回函数结果"}let arr =["tiechui","zxy","gangdan"]//map为数组中的映射let newlist = arr.map(function(item,index){//让li的第0行元素是红色return `<li class="${index===0?'active':''}"><b>${item}<b>${test()}</li>`})console.log(newlist)//
//最后,要把上面的li追加到ul里面//所以在这里,可以首先获取这个ul这个节点 let oul = document.querySelector("ul")oul.innerHTML = newlist.join("")/*给ul的HTML附上值,在这里直接把newlist给它附上如果不加“.join("")”的话,它会被强行转为字符串,用逗号分割*/
</script>

在这里插入图片描述
在这里插入图片描述

最终正确执行结果👇
在这里插入图片描述

5.字符串扩展

5-1 include函数

判断字符串中是否存在指定字符

<script>let mayname = "zxy"console.log(myname.includes("x"))//(是否包含)true(如果是“zy”的话,就是false,因为zy不连在一起)console.log(myname.startswith("z"))//(是否在开头位置)trueconsole.log(myname.endswith("e"))//(是否在结尾)trueconsole.log(myname.includes("e",1))console.log(myname.startsWith("e",1))console.log(myname.endsWith("z",1))//意思是,1为下标的字符往前的最后一个字符是不是‘z’
</script>
<script>let myname = "zxy"console.log(myname.includes("z"))//其中包含z吗,包含,所以true
</script>
5-2 repeat函数(重复)

repeat()方法返回一个新字符串,表示将源字符串重复n次

<script>let myname = "zxy"conosle.log(myname.repeat(3))//zxyzxyzxyconosle.log(myname.repeat(0))//""conosle.log(myname.repeat(3.5))//zxyzxyzxyconosle.log(myname.repeat("3"))//zxyzxyzxy(把字符串转化成一个数值重复3次)
</script>

6.数值扩展

6-1二进制和八进制表示法
<script>let count1 = 100let count2 = 0x100//十六进制打印出来,变成十进制的显示是256let count3 = 0o100//转换成八进制,为64let count4 = 0b100//二进制打印出来,变成十进制为4
</script>
<script>//1-二进制八进制的写法</script>
6-2isFinite 与 isNaN方法

减少全局性方法,使得语言逐步模块化

<script>let num1 = Number.isFinite(100)//truelet num2 = Number.isFinite(100/0)//falselet num3 = Number.isFinite(Infinity)//falselet num4 = Number.isFinite("100")//false
</script>
<script>let num1 = Number.isNaN(100)//falselet num2 = Number.isNaN(NaN)//truelet num3 = Number.isNaN("zxy")//falselet num4 = Number.isNaN("100")//false
</script>

它们与传统的全局方法isFinite()isNaN()的区别在于,传统的方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,Number.isFinite()对于非数值一律返回falseNumber,isNaN()只有对于NaN才返回ture,非NaN一律返回false
在这里插入图片描述

6-3islnteger方法

用来判断一个数值是否为整数

<script>let num1 = Number.islnteger(100)//truelet num2 = Number.islnteger(100.0)//truelet num3 = Number.islnteger("kerwin")//falselet num4 = Number.islnteger("100")//true
</script>
6-4极小常量Number.EPSILON

它表示1与大于1的最小浮点数之间的差。2.2204460492503131e-16

<script>function isEqual(a,b){return Math.abs(a-b)<NUmber.EPSILON}console.log(inEqual(0.1+0.2,0.3))//trueconsole.log(0.1+0.2===0.3)//false
</script>
6-5Math.trunc

将小数部分抹掉,返回一个整数

<script>console.log(Math.trunc(1.2))//1console.log(Math.trunc(1.8))//1console.log(Math.trunc(-1.8))//-1console.log(Math.trunc(-1.2))//-1
</script>
6-6Math.sign

Marg.sign方法用来判断一个数到底是正数、复数还是零,对于非数值,会先将其转为数值

<script>Math.sign(-100)//-1Math.sign(100)//+1Math.sign(0)//+0Math.sign(-0)//-0Math.sign("zxy")//NaN
</script>

7.数组扩展

7-1扩展运算符
<script>let arr1 = [1,2,3]let arr2 = [4,5,6]console.log([...arr1,...arr2])//合并1,2,3,4,5,6
</script>

在这里插入图片描述
在这里插入图片描述

7-2Array.from

将类数组对象转化为真正数组

<ul><li>111</li><li>111</li><li>111</li>
</ul>
<script>function test(){console.loh(Array.from(arguments))}test(1,2,3)let oli = document.querySelectorAll("li")//console.log(Arry.from(oli))//olis.map()//如果在这里做map的一些操作会立即报错,因为map并不是一个方法/*所以就可以利用,Array.from,把它转化成真数组,再调用map方法,再在map中做一些处理就可以了👇*/Array.from(olis).map(function(){//这种方法就是把类数组结构,转化为数组对象})</script>
7-3Array.of

将一组值转化为数组,即新建数组
帮你重新生成一个数组

<script>let arr1 = Array(3)console.log(arr1)//[..]let arr2 = Array.of(3)conosle.log(arr2)//[3]
</script>
7-4find findIndex() 方法

1)该方法主要应用于直接找查第一个符合条件的数组元素
2)它的参数是一个回调函数,在回调函数中可以写你要找查的元素的条件,当条件成立为true的时候,返回该元素,如果有符合条件的元素,返回值为undefined

<script>
//find是从前开始找的let arr = [11,12,13,14,15]let res1 = arr.find(function(item){return item>13//find是找值})let res2 = arr.findIndex(function(item){return item>13//findIndex是找下标(索引值)})console.log(res1)//14console.log(res2)//3//findLast  findLastIndex() 是从后面开始找的(ES13)let res = arr.findLast(function(item){return item>13/*大于13从后面开始查,所以15,从后往前,第一个就查到了,所以打印后是15,所以findLastIndex就是4*/})</script>
7-5 fill方法(填充)

初始化数组,或者把数组中的某几个元素进行替换的一个作用

<script>let arr = new Array(3).fill("zxy")//创建一个长度为3的空数组,然后.fill,相当于空的内容都填充上zxy这样一个字符串console.log(arr)//['zxy','zxy','zxy']let arr1 = [11,22,33]console.log(arr1.fill("zxy",1,2))/*1,2的意是,初始化位置开始,到2结束,也就是把22替换成zxy,如果没有1,2的话,那就是11,22,33全都变成zxy*/
</script>
7-6 flat() flatMap()

扁平化方法,就是变成“一维”

<script>let arr = [1,2,3,[4,5,6]]/*里面有个数组[4,5,6],想要把它扁平化,就是把大括号破掉👇*/let arr1 = arr.flat()console.log(arr1)//flatlet arr = [["安庆""安阳","鞍山"]["北京""保定","包头"]]conosole.log(arr.flat() )//flatMaplet arr = [{name:"A",list:["安庆""安阳","鞍山"]},{name:"B",list:["北京""保定","包头"]}]let res = arr.flapMap(function(item){return item.list})conosle.log(res  )
</script>

8.对象扩展

8-1 对象简写
<script>let obj = {name:"moduleA",test1:function(){},test2:function(){}}
</script>

在这里插入图片描述

8-2对象属性 表达式
<script>let name = "a"let obj = {name:"zxy"}console.log(obj)
</script>

如果要把name变成变量
在这里插入图片描述
如果[name]里面再拼接→[name+"bc"],那执行结果就是{abc:'zxy'}

8-3 扩展运算符 ES2018

数组中...个点展开

<script>let obj = {name:"zxy"}//快速的进行复制👇let obj1 = {...obj//直接把obj展开在这里}obj1.name = "tiechui"//在这里改了内容,obj1改变了,但是obj不会受到影响console.log(obj1)
</script>
<script>
//把obj1和obj2合并到一起,用...破开let obj1 = {name:"zxy"}let obj2 = {age:100}console.log({...obj1,...obj2})
</script>

在这里插入图片描述

8-4 Object.assign(快速合并数组)

在对象中用Object.assign进行快速的合并数组

<script>let obj1 = {name:"kerwin"}let obj2 = {age:100}let obj3 = {name:"zxy"}console.log(Object.assign(obj1,obj2,obj3))/*obj1执行后跟8-3中的结果一样,只有第一项受到影响,obj2,obj3都是原样输出,如果希望1,2,3都不收到影响的话,可以加一个“let obj = {}”空的*/
</script>
8-5 Object.is

能够判断两个值是否相等

<script>
// ==:值相等
// ===:值相等,类型相同console.log(Object.is(5,5))//trueconsole.log(Object.is(5,"5"))//falseconsole.log(Object.is({},{}))//falseconsole.log(Object.is(NaN,NaN))//trueconsole.log(Object.is(parseInt("zxy"),NaN))//trueconsole.log(Object.is(+0,-0))/*false,它可以判断正0和负0是不相等的,但是下面的三个等于号就会认为它是相等的*/console.log(+0===-0)//true</script>

9.函数扩展

9-1.函数参数的默认值

参数默认值适用于任何形式的函数,而且非常有用(之前学解构的时候也用过,解构不出来,就用一个默认值)

<script>
/*有人分装了ajax这样一个方法,这个方法传了很多个属性,
有url地址、method方法(里面表示着get,post)、async
是否异步。正常使用的时候,里面可能传不同的地址,method
是get请求,异步的方式。*/function ajax(url,method,async){console.log(url,method,async)}ajax("/aaa","get",true)//以上代码这样,传了三个实参和三个形参
</script>

在这里插入图片描述

9-2.rest参数 剩余参数
<script>function test(...date){console.log(date)}test(1,2,3,4,5,6)
</script>

在这里插入图片描述

9-3. name属性
<script>conosole.log(text.name)//执行后拿到“test”
</script>
9-4. 箭头函数*

箭头函数:写法简洁

<script>function test(){}//这是声明式的//赋值式👇let test = function(){}
//箭头函数“=>”:写法上,省略的上面function单词的拼写(这是箭头函数最初是的一种写法)let test = ()=>{console.log("test")}test()
</script>

在这里插入图片描述
在这里插入图片描述

10.Symbol

ES6引入了一种新的原始数据类型Symbol,表示独一无二的值,它属于JS语言的原生数据类型之一,其他的数据类型是:undefined,null,布尔值(Boolean),字符串(String),数值(Number),对象(Object)。

1.使用Symbol作为对象属性名

<script>let name = Symbol()let age = Symbol()var obj = {[name]:"zxy",[age]:100}console.log(obj)
</script>

2.Symbol()函数可以接受一个字符串作为参数,表示对Symbol实例的描述。比较容易区分

<script>let name = Symbol("name")let age = Symbol("age")var obj = {[name]:"zxy",[age]:100}console.log(obj)
</script>

关于Symbol的笔记如下👇***
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3+TS+Vite 构建自动导入开发环境

关注⬆️⬆️⬆️⬆️ 专栏后期更新更多前端内容 在一个使用 Vue 3、Vite 和 TypeScript 的项目中,配置 unplugin-auto-import 和 unplugin-vue-components 插件可以极大地提高开发效率,因为它们可以自动导入 Vue 相关的 API 和 Vue 组件,从而减少了手动导入的需要。 文章目…

FPGA UDP协议栈:基于88E1111,支持RGMII、GMII、SGMII三种模式,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案本协议栈的 1G-UDP版本本协议栈的 10G-UDP版本本协议栈的 25G-UDP版本1G 千兆网 TCP-->服务器 方案1G 千兆网 TCP-->客户端 方案10G 万兆网 TCP-->服务器客户端 方案 3、该UDP协议栈性能4、详细设计方案设…

Hyperledger Fabric 消息协议

Fabric 中大量采用了 gRPC 消息在不同组件之间进行通信交互&#xff0c;主要包括如下几种情况&#xff1a;客户端访问 Peer 节点&#xff0c;客户端和 Peer 节点访问排序节点&#xff0c;链码容器与 Peer 节点交互&#xff0c;以及多个 Peer 节点之间的 Gossip 交互。 消息结构…

Android 架构 - 模块化

参考文章 谷歌官方指南 一、概念 将大型、复杂问题拆解成一个个小的、简单问题&#xff0c;从而可以做到各个击破。模块化简单讲就是把多功能高耦合的代码逻辑拆散成多个功能单一职责明确的模块。模块指 Android 项目中的 module&#xff0c;通常会包含 Gradle 构建脚本、源代…

【Android Studio】创建第一个APP工程及生成APK安装包

&#x1f31f;博主领域&#xff1a;嵌入式领域&人工智能&软件开发 前言&#xff1a;本文详细介绍创建Android Studio第一个APP工程及打包生成APK安装包。 如下两个博客我记录了第一次创建项目时出现的问题&#xff0c;若你也遇见了同样的问题&#xff0c;可参考&#…

QT上位机开发(会员充值软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所有的控件当中&#xff0c;除了label、edit、radio、combobox和button之外&#xff0c;另外一个用的比较多的控件就是grid&#xff0c;也可称之为…

数学的雨伞下:理解世界的乐趣

这本书没有一个公式&#xff0c;却讲透了数学的本质&#xff01; 《数学的雨伞下&#xff1a;理解世界的乐趣》。一本足以刷新观念的好书&#xff0c;从超市到对数再到相对论&#xff0c;娓娓道来。对于思维空间也给出了一个更容易理解的角度。 作者&#xff1a;米卡埃尔•洛奈…

WindowsServer安装mysql最新版

安装 下载相应mysql安装包&#xff1a; MySQL :: Download MySQL Installer 选择不登陆下载 双击运行下载好的mysql-installer-community-*.*.*.msi 进入类型选择页面&#xff0c;本人需要mysql云服务就选择了server only server only&#xff08;服务器&#xff09;&#x…

day11 有效的括号 删除字符串中的所有相邻重复项 逆波兰表达式求值

题目1&#xff1a;20 有效的括号 题目链接&#xff1a;20 有效的括号 题意 判断字符串是否有效&#xff0c;若有效&#xff1a; 1&#xff09;左括号必须用相应的右括号 2&#xff09;左括号的闭合顺序正确 ({)}顺序不正确&#xff0c;应该是&#xff08;{}&#xff09; …

如何使用GaussDB创建脱敏策略(MASKING POLICY)

目录 一、前言 二、GaussDB中的脱敏策略 1、数据脱敏的定义 2、创建脱敏策略的语法说明 三、在GaussDB中如何创建数据脱敏策略(示例) 1、创建脱敏策略的一般步骤 2、GaussDB数据库中创建脱敏策略的完整示例 1&#xff09;开启安全策略开关&#xff0c;以初识用户omm登录…

Qt/QML编程学习之心得:一个音频播放器的实现(29)

在window下&#xff0c;打开音乐播放器&#xff0c;然后打开一个.mp3文件&#xff0c;就可以实现播放了&#xff0c;那么在Qt/QML中如何实现呢&#xff1f;首先所有的设计都是基于音乐播放器的&#xff0c;嵌入式linux下同样也有音乐播放器&#xff0c;比如mplayer。其调用方法…

Python语法进阶学习--模块和包

在学习python进阶知识中的面向对象之前,还要了解一下当中几个概念:包、模块、类和函数。 一.模块和包 模块和包:用来组织Python代码的。 包 > 含有 __init__.py文件的文件夹模块 > py文件类 > class 【面向对象学习】函数&#xff08;方法&#xff09;> def 以上均…

Unity3D时间类Time和DateTime的用法

系列文章目录 Unity知识点 文章目录 系列文章目录前言一、Time和DataTime的区别1-1、命名空间不同 二、Time和DataTime的使用2-1、Time类2-2、代码解释如下&#xff1a;2-3、DataTime类2-4、代码解释如下&#xff1a; 三、实际应用3-1、Time类测试性能代码如下3-2、运行结果如…

小H靶场笔记:DC-7

DC-7 January 8, 2024 4:11 PM Tags&#xff1a;Drupal 8&#xff1b;Drush Owner&#xff1a;只惠摸鱼 信息收集 使用arp-scan和nmap扫描C段存活主机&#xff0c;探测到靶机ip&#xff1a;192.168.199.137&#xff0c;且开放80、22端口 探测22、80开放端口的服务、版本、操…

Mac电脑系统提速软件CleanmyMac X2024

Mac是现代人日常工作时必不可少的工具&#xff0c;尤其是在居家办公已经屡见不鲜的当下。视频会议、文档传送、视频剪辑等等。它在工作中扮演的角色越来越重要&#xff0c;所以也导致了它的流畅程度可以在很大程度上影响人们一整天的工作效率和心情。 CleanMyMac X全新版下载如…

Shiro框架:ShiroFilterFactoryBean过滤器源码解析

目录 1.Shiro自定义拦截器SpringShiroFilter 1.1 ShiroFilterFactoryBean解析 1.1.1 实现FactoryBean接口 1.1.2 实现BeanPostProcessor接口 1.2 SpringShiroFilter解析 1.2.1 OncePerRequestFilter过滤逻辑实现 1.2.2 AbstractShiroFilter过滤逻辑实现 1.2.2.1 创建Sub…

Alphalens 因子分析 - 以低换手率因子为例(1)

因子分析是量化研究的基本技能之一。通过因子分析,找出有效的因子,通过相关性去重后,就可以通过机器学习、线性回归等方法把因子组合起来,构成交易策略。 这一篇笔记我们就介绍如何使用 Alphalens 来进行单因子分析。我们使用的因子是低换手率因子。 股谚有一种说法,天量…

风速预测 | 基于深度学习的风速预测模型(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 风速预测 | 基于深度学习的风速预测模型&#xff08;Matlab&#xff09; 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复基于深度学习的风速预测模型&#xff08;Matlab&#xff09;。 参考资料 [1] htt…

【Flutter 开发实战】Dart 基础篇:常用运算符

在Dart中&#xff0c;运算符是编写任何程序的基本构建块之一。本文将详细介绍Dart中常用的运算符&#xff0c;以帮助初学者更好地理解和运用这些概念。 1. 算术运算符 算术运算符用于执行基本的数学运算。Dart支持常见的加、减、乘、除、整除以及取余运算。常见的算数运算符如…

智慧灯杆sip广播可视对讲解决方案

智慧灯杆sip广播可视对讲解决方案 智能路灯以城市公共设施的全面高效利用为出发点&#xff0c;根据路况加载智能照明、新能源汽车充电桩、城市广播、视频监控、WIFI热点、LED/LCD信息发布、环境监测、微型基站、停车场管理、井盖等。监控和USB手机充电灯功能&#xff0c;不仅能…