当前位置: 首页 > article >正文

ES6——编程风格

编程风格1、块级作用域1.1、Iet取代var1.2、全局常量和线程安全1.3、严格模式2、字符串3、解构赋值4、对象5、数组6、函数7、Map结构8、Class9、模块10、ESLint的使用1、块级作用域1.1、Iet取代varES6提出了两个新的声明变量的命令let和const。其中let完全可以取代var因为两者语义相同而且let没有副作用。use strict;if(true){letxhello;}for(leti0;i10;i){console.log(i);}上面的代码如果用var替代let实际上就声明了一个全局变量这显然不是本意。变量应该只在其声明的代码块内有效var命令做不到这一点。var命令存在变量提升效用let命令没有这个问题。use strict;if(true){console.log(x);//ReferenceErrorletxhello;}上面的代码如果使用var替代let那么console.log那一行就不会报错而是会输出undefined因为变量声明会提升到代码块的头部。这违反了变量先声明后使用的原则。所以建议不再使用var命令而是使用let命令取代。1.2、全局常量和线程安全在let和const之间建议优先使用const尤其是在全局环境不应该设置变量只应设置常量。这符合函数式编程思想有利于将来的分布式运算。//badleta1,b2,c3;//goodconsta1;constb2;constc3;//bestconst[a,b,c][1,2,3];const声明常量还有两个好处一是阅读代码的人立刻会意识到不应该修改这个值二是防止了无意间修改变量值导致错误。所有的函数都应该设置为常量。let表示的变量只应出现在单线程运行的代码中不能是多线程共享的这样有利于保证线程安全。1.3、严格模式V8引擎只在严格模式下支持let和const。结合前两点这实际上意味着将来所有的编程都是针对严格模式的。2、字符串静态字符串一律使用单引号或反引号不使用双引号。动态字符串使用反引号。//badconstafoobar;constbfooabar;//acceptableconstcfoobar;//goodconstafoobar;constbfoo${a}bar;constcfoobar;3、解构赋值使用数组成员对变量赋值优先使用解构赋值。constarr[1,2,3,4];//badconstfirstarr[0];constsecondarr[1];//goodconst[first,second]arr;函数的参数如果是对象的成员优先使用解构赋值。//badfunctiongetFullName(user){constfirstNameuser.firstName;constlastNameuser.lastName;}//goodfunctiongetFullName(obj){const{firstName,lastName}obj;}//bestfunctiongetFullName({firstName,lastName}){}如果函数返回多个值优先使用对象的解构赋值而不是数组的解构赋值。这样便于以后添加返回值以及更改返回值的顺序。//badfunctionprocessInput(input){return[screenLeft,right,top,bottom];}//goodfunctionprocessInput(input){return{left,right,top,bottom};}const{left,right}processInput(input);4、对象单行定义的对象最后一个成员不以逗号结尾。多行定义的对象最后一个成员以逗号结尾。//badconsta{k1:v1,k2:v2,};constb{k1:v1,k2:v2};//goodconsta{k1:v1,k2:v2};constb{k1:v2,k2:v2,};对象尽量静态化一旦定义就不得随意添加新的属性。如果添加属性不可避免要使用Object.assign方法。//badconsta{};a.x3;//if reshape unavoidableconsta{};Object.assign(a,{x:3});//goodconsta{x:null};a.x3;如果对象的属性名是动态的可以在创造对象时使用属性表达式定义。//badconstobj{id:5,name:San Francisco,};obj[getKey(enabled)]true;//goodconstobj{id:5,name:San Francisco,[getKey(enabled)]:true,};上面的代码中对象obj的最后一个属性名需要计算得到。这时最好采用属性表达式在新建obj时将该属性与其他属性定义在一起。这样一来所有属性就在一个地方定义了。另外对象的属性和方法尽量采用简洁表达法这样易于描述和书写。letrefsome value;//badconstatom{ref:ref,value:1,addValue:function(value){returnatom.valuevalue;},};//goodconstatom{ref,value:1,addValue(value){returnatom.valuevalue;}};5、数组使用扩展运算符(…)复制数组。//badconstlenitems.length;constitemsCopy[];leti;for(i0;ilen;i){itemsCopy[i]items[i];}//goodconstitemsCopy[...items];使用Array.from方法将类似数组的对象转为数组。constfoodocument.querySelectorAll(.foo);constnodesArray.from(foo);6、函数立即执行函数可以写成箭头函数的形式。((){console.log(Welcome to the Internet.);})();那些需要使用函数表达式的场合尽量用箭头函数代替。因为这样更简洁而且绑定了this。//bad[1,2,3].map(function(x){returnx*x;});//good[1,2,3].map((x){returnx*x;});箭头函数取代Function.prototype.bind不应再用self/_this/that绑定this。//badconstselfthis;constboundMethodfunction(...params){returnmethod.apply(self,params);}//acceptableconstboundMethodmethod.bind(this);//bestconstboundMethod(...params)method.apply(this,params);简单的、单行的、不会复用的函数建议采用箭头函数。如果函数体较为复杂行数较多还是应该采用传统的函数写法。所有配置项都应该集中在一个对象放在最后一个参数布尔值不可以直接作为参数。//badfunctiondivide(a,b,optionfalse){}//goodfunctiondivide(a,b,{optionfalse}{}){}不要在函数体内使用arguments变量使用rest运算符(…)代替。因为rest运算符显式表明你想要获取参数而且arguments是一个类似数组的对象而rest运算符可以提供一个真正的数组。//badfunctionconcatenateAll(){constargsArray.prototype.slice.call(arguments);returnargs.join();}//goodfunctionconcatenateAll(...args){returnargs.join();}使用默认值语法设置函数参数的默认值。//badfunctionhandleThings(opts){optsopts||{};}//goodfunctionhandleThings(opts{}){}7、Map结构注意区分Object和Map只有模拟实体对象时才使用Object。如果只是需要key:value的数据结构则使用Map。因为Map有内建的遍历机制。letmapnewMap(arr);for(letkeyofmap.keys()){console.log(key);}for(letvalueofmap.values()){console.log(value);}for(letitemofmap.entries()){console.log(item[0],item[1]);}8、Class总是用Class取代需要prototype的操作。因为Class的写法更简洁更易于理解。//badfunctionQueue(contents[]){this._queue[...contents];}Queue.prototype.popfunction(){constvaluethis._queue[0];this._queue.splice(0,1);returnvalue;}//goodclassQueue{constructor(contents[]){this._queue[...contents];}pop(){constvaluethis._queue[0];this._queue.splice(0,1);returnvalue;}}使用extends实现继承因为这样更简单不会有破坏instanceof运算的危险。//badconstinheritsrequire(inherits);constinHeritsrequire(inherits);functionPeekableQueue(constents){Queue.apply(this,contents);}inherits(PeekableQueue,Queue);PeekableQueue.prototype.peekfunction(){returnthis._queue[0];}//goodclassPeekableQueueextendsQueue{peek(){returnthis._queue[0];}}9、模块Module语法是JavaScript模块的标准写法要坚持使用这种写法。使用import取代require。//badconstmoduleArequire(moduleA);constfunc1moduleA.func1;constfunc2moduleA.func2;//goodimport{func1,func2}frommoduleA;使用export取代module.exports。//CommonJS的写法letReactrequire(react);letBreadcrumbsReact.createClass({render(){returnnav/;}});module.exportsBreadcrumbs;//ES6的写法importReactfromreact;constBreadcrumbsReact.createClass({render(){returnnav/;}});exportdefaultBreadcrumbs如果模块只有一个输出值就使用export default如果模块有多个输出值就不使用export default不要export default与普通的export同时使用。不要在模块输入中使用通配符。因为这样可以确保模块中有一个默认输出(export default)。//badimport*asmyObject./importModule;//goodimportmyObjectfrom./importModule;如果模块默认输出一个函数函数名的首字母应该小写。functionmakeStyleGuide(){}exportdefaultmakeStyleGuide;如果模块默认输出一个对象对象名的首字母应该大写。cosnt StyleGuide{es6:{}};exportdefaultStyleGuide;10、ESLint的使用ESLint是一个语法规则和代码风格的检查工具可用于保证写出语法正确、风格统一的代码。首先安装ESLint。$npmi-geslint然后安装Airbnb语法规则。$npmig eslint-config-airbnb最后在项目的根目录下新建.eslintrc文件配置ESLint。{extends:eslint-config-airbnb}现在就可以检查当前项目的代码是否符合预设的规则。index.js文件的代码如下。letunusuedI have no purpose!;functiongreet(){letmessageHello, World!;alert(message);}greet();使用ESLint检查这个文件。$ eslint index.js

相关文章:

ES6——编程风格

编程风格1、块级作用域1.1、Iet取代var1.2、全局常量和线程安全1.3、严格模式2、字符串3、解构赋值4、对象5、数组6、函数7、Map结构8、Class9、模块10、ESLint的使用1、块级作用域 1.1、Iet取代var ES6提出了两个新的声明变量的命令:let和const。其中&#xff0c…...

从源码到挂载:剖析NVIDIA Container Toolkit的GPU设备注入机制

1. 从零理解NVIDIA Container Toolkit的GPU挂载机制 第一次在容器里运行nvidia-smi命令时,那种"魔法般"的体验让我记忆犹新。明明宿主机上能正常使用的GPU设备,怎么在容器里就凭空出现了?这背后的秘密就藏在NVIDIA Container Toolk…...

SQL中JOIN类型选择的业务逻辑分析_根据业务需求选择连接

INNER JOIN 不能用于需保留主表所有记录的场景,如统计未下单用户;错误地在LEFT JOIN的WHERE中过滤右表字段会使其退化为INNER JOIN;RIGHT JOIN基本可被LEFT JOIN替代;FULL OUTER JOIN在MySQL中不支持,业务“并集”宜用…...

别只打补丁了!聊聊Oracle 11.2.0.4在Windows上维护的那些事儿:补丁管理、版本兼容与OPatch工具详解

Oracle 11.2.0.4 Windows环境下的补丁管理艺术:从基础操作到战略规划 在Oracle数据库运维领域,补丁管理往往被视为一项基础性工作,但实际上它远不止是简单的"下载-安装-重启"流程。特别是在Windows平台上运行的Oracle 11.2.0.4版本…...

CYBER-VISION零号协议入门指南:一键部署,开启智能助盲新篇章

CYBER-VISION零号协议入门指南:一键部署,开启智能助盲新篇章 1. 引言:当科技成为视障者的眼睛 想象一下,当你走在繁忙的街道上,眼前的世界突然变得模糊不清——路边的台阶、迎面而来的行人、突然出现的障碍物都成了潜…...

别再让扩展坞‘抢电’了!手把手教你用LDR6282 APP智能分配USB-C功率

别再让扩展坞“抢电”了!LDR6282芯片智能功率分配全攻略 每次连接扩展坞时,笔记本电量不增反减?外接硬盘频繁断开?这些困扰专业用户的“功率焦虑”问题,根源在于传统扩展坞的固定功率分配机制。本文将深度解析基于LDR…...

TCP连接管理实战:从CLOSE_WAIT与TIME_WAIT的根源到系统级调优

1. 从线上故障说起:当端口耗尽成为压测拦路虎 去年双十一大促前,我们团队在对核心交易系统做全链路压测时,突然发现服务端出现大量"Address already in use"错误。监控面板上TCP连接数曲线像坐了火箭一样直线上升,短短1…...

Redis持久化:从AOF到RDB,如何实现数据不丢失?芈

Qt是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本笔记将重点介绍QSpinBox数值微调组件的常用方法及灵活应用。…...

Windows优化神器:3步告别卡顿,让你的电脑飞起来

Windows优化神器:3步告别卡顿,让你的电脑飞起来 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhan…...

不只是部署:在 Windows 11 上用 Conda 玩转 KTransformers,深入对比 GGUF 与 Safetensors 模型加载的实战差异

在 Windows 11 上用 Conda 玩转 KTransformers:GGUF 与 Safetensors 模型加载的深度实战指南 当你已经成功在 Windows 11 上通过 Conda 环境部署了 KTransformers,接下来的问题往往是:如何根据不同的模型格式和硬件条件,选择最优的…...

别再只调API了!深入OpenCV手势识别:肤色检测算法全解析与实战对比(RGB/YCrCb/OTSU)

深入OpenCV手势识别:肤色检测算法全解析与实战对比 手势识别作为人机交互的重要技术,其核心挑战之一是如何在复杂环境中准确分割皮肤区域。本文将深入探讨四种主流肤色检测算法——RGB阈值法、椭圆模型法、CrCb范围筛选法以及OTSU自适应阈值法&#xff0…...

深度学习实战:用多尺度训练提升图像识别准确率(附TensorFlow代码)

深度学习实战:用多尺度训练提升图像识别准确率(附TensorFlow代码) 当你在街头用手机拍摄远处模糊的路牌时,是否好奇过AI如何识别不同尺寸的物体?这正是多尺度训练技术要解决的核心问题。在医疗影像分析中,从…...

R语言实战:用GEOquery和AnnoProbe搞定GEO芯片数据下载与ID转换(附避坑指南)

R语言实战:GEO芯片数据探针ID转换的深度解决方案与避坑实践 在生物信息学分析中,GEO数据库是研究者获取基因表达数据的金矿。但这座金矿的"矿石"——原始芯片数据,往往需要经过精细的"冶炼"过程才能转化为可分析的基因表…...

单片机I/O驱动与隔离电路的优化设计实践

1. 单片机I/O驱动电路设计的关键要点 我第一次接触单片机I/O驱动设计是在一个工业控制项目上,当时因为驱动电路设计不当导致整个系统频繁死机。后来才发现,I/O驱动电路就像单片机的"肌肉",如果设计不好,再强大的"大…...

大模型落地卡在哪?:SITS2026圆桌实录揭示工程化人才缺口已达47.6%(附企业真实JD对标清单)

第一章:SITS2026圆桌:大模型工程化人才需求 2026奇点智能技术大会(https://ml-summit.org) 工程化落地的核心能力断层 在SITS2026圆桌讨论中,来自头部AI基础设施厂商、金融与医疗垂类企业的CTO一致指出:当前大模型项目失败主因并…...

Jetson Orin NX + Ubuntu 22.04:基于Livox Mid360与FAST-LIO2的实时三维建图实战

1. 为什么选择Jetson Orin NX Mid360 FAST-LIO2组合 最近在给实验室的巡检机器人升级SLAM系统时,我测试了多种硬件组合方案。实测下来,Jetson Orin NX搭配Livox Mid360激光雷达,再跑FAST-LIO2算法,这个组合在室内复杂环境的表现…...

Armbian系统apt更新太慢?一个脚本搞定清华/阿里云等国内源(Ubuntu 22.04 Jammy实测)

Armbian系统国内软件源优化与磁盘挂载实战指南 引言:为什么需要优化Armbian系统? 对于国内开发者而言,使用Armbian这类基于Debian的轻量级Linux发行版时,最头疼的问题莫过于软件包更新速度缓慢。默认的国外软件源服务器远在海外&a…...

STM32WB55双核架构实战:基于CubeMX与IPCC/HSEM的蓝牙通信框架快速构建

1. STM32WB55双核架构设计解析 第一次拿到STM32WB55开发板时,我盯着芯片型号看了半天——这个"双核"到底该怎么用?后来在项目里摸爬滚打才发现,理解它的双核分工是开发蓝牙应用的关键。这颗芯片的M4核和M0核就像公司里的两个部门&a…...

用ESP32-S3和Minimax API,我花了一个周末做了个会聊天的桌面摆件(附完整代码)

用ESP32-S3和Minimax API打造智能语音聊天摆件全攻略 周末闲来无事,我决定把书桌上那个积灰的木质摆件改造成一个能聊天的AI伙伴。整个过程从硬件选型到代码调试,踩了不少坑也收获了很多乐趣。下面就把这个项目的完整实现过程分享给大家,希望…...

2025最权威的十大降重复率工具横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 设法降低AIGC也就是人工智能生成内容的检测率,得从文本特征着手。首先&#xff…...

Qwen3-TTS-12Hz-1.7B-VoiceDesign提示词工程:精准控制语音输出

Qwen3-TTS-12Hz-1.7B-VoiceDesign提示词工程:精准控制语音输出 用自然语言描述你心中的声音,让AI帮你实现 你有没有试过在脑子里想象一个特别的声音,却不知道怎么用技术参数来表达?比如想要一个"略带沙哑的成熟男声&#xff…...

这个键盘就算了------当二手的卖掉

因为按照法律:拆机键盘就是保修90天,现在100天就坏了,就是被人给算计了。但是也没有办法,为了避免在这个上面浪费时间,就不管了。当二手的卖掉。卖不掉就丢掉好了。但是1 拆机零件不能买------保修期短,价格…...

因为目前全世界对于人流的统计准确率都很低----所以这个东西只是先看一看

你说得对,现在图像识别技术确实已经非常成熟了。不过就像前面聊到的,"能识别"和"在真实场景下准确统计"之间,还隔着一整个工程化的距离。最近的一些学术研究正好能说明这个问题。当前的真实水平:85%–99% 不等…...

C#怎么实现批量邮件发送 C#如何用MailKit批量发送个性化邮件和HTML格式邮件【网络】

MailKit批量发送邮件卡在SendAsync因缺乏并发控制,需用SemaphoreSlim限流、复用SmtpClient、单建MimeMessage、用BodyBuilder构建HTML正文并内联样式,逐封捕获异常定位问题。MailKit 发送批量邮件时为什么总卡在 SmtpClient.SendAsync?因为默…...

ubuntu完全免费人流统计方案

1 用摄像头录像2 在ubuntu上用开源软件来分析视频中出现人数。------------------------------------------------------------------------完全可以,而且选择非常多。相比 Android 平台,在 Ubuntu 上做同样的事情要简单很多。因为 Ubuntu 是完整的桌面 …...

国产操作系统实战:在VMware 17.6上完美运行银河麒麟V10 SP3的5个关键步骤

国产操作系统深度实践:VMware 17.6部署银河麒麟V10 SP3全流程精解 在信息技术应用创新加速推进的当下,国产操作系统正逐步成为企业级基础设施的重要选择。作为openEuler社区的衍生发行版,银河麒麟Advanced Server V10 SP3凭借其出色的硬件兼容…...

五一出行必备:Bypass分流抢票神器全攻略

1. 为什么五一抢票这么难? 每到五一假期,抢票就成了无数人的噩梦。去年我提前两周盯着12306,结果开票瞬间所有车次秒灰,那种绝望感至今记忆犹新。后来才发现,普通用户和抢票软件根本不在同一起跑线上——当你在手动刷新…...

Redis:延迟双删的适用边界与落地细节脚

pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…...

Spring Cloud服务熔断与降级

咱们今天不讲童话,咱们讲“系统保命学”。在微服务架构里,服务之间就像是一群互相借钱的酒肉朋友。平时你好我好大家好,一旦有个“朋友”(服务A)破产了(挂了)或者赖账(超时&#xff…...

龙虾白嫖指南,请查收~何

1. 什么是 Apache SeaTunnel? Apache SeaTunnel 是一个非常易于使用、高性能、支持实时流式和离线批处理的海量数据集成平台。它的目标是解决常见的数据集成问题,如数据源多样性、同步场景复杂性以及资源消耗高的问题。 核心特性 丰富的数据源支持&#…...