位置: 编程技术 - 正文

JavaScript小技巧整理篇(非常全)

编辑:rootadmin

推荐整理分享JavaScript小技巧整理篇(非常全),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

能够为大家提供这些简短而实用的JavaScript技巧来提高大家编程能力,这对于我来说是件很开心的事。每天仅花上不到2分钟的时间中,你将可以读遍JavaScript这门可怕的语言所呈现给我们的特性:performance(性能), conventions(协议), hacks(代码hack), interview questions(面试问题)及所有其他的项。

# - 使用 === 代替 ==

==(或者!=)做对比的时候会将进行对比的两者转换到同一类型再比较。===(或者!==)则不会,他会将进行对比的两者做类型对比和值对比,相对于 == ,=== 的对比会更加严谨。

# - 转换数值的更加的方法

将字符串转换为数字是非常常见的。最简单和最快的(jspref)的方式来实现,将使用+(加)算法。

你也可以使用-(减号)算法的转换类型并且变成负数值。

# - 清空一个数组

你定义一个数组,并希望清空它的内容。通常,你会这样做:

但是还有一种更高性能的方法。

你可以使用这些代码:

· list =[] 将一个变量指定个引用到那个数组,而其他引用都不受影响。这意味着,对于先前数组的内容的引用仍然保留在内存中,从而导致内存泄漏。· list.length = 0 删除数组内的所有东西,这不需要引用任何其他的东西然而,如果你有一个copy的数组(A和copy-A),如果你使用list.length = 0 删除其内容,副本也会失去它的内容。

StackOverflow上的更多详情:difference-between-array-length-0-and-array

# - 对数组排序进行"洗牌"(随机排序)

这段代码在这里使用Fisher Yates洗牌算法给一个指定的数组进行洗牌(随机排序)。

案例:

# - 返回对象的函数能够用于链式操作

当创建面向对象的JavaScript对象的function时,函数返回一个对象将能够让函数可链式的写在一起来执行。

# - 字符串安全连接

假设你有一些类型未知的变量,你想将它们连接起来。可以肯定的是,算法操作不会在级联时应用:

这样的连接不正是你所期望的。相反,一些串联和相加可能会导致意想不到的结果:

谈到性能,对join和concat进行比较,他们的执行速度是几乎一样的。你可以在MDN了解更多与concat相关的知识

# - 更快的四舍五入

今天的技巧是关于性能。见到过双波浪线"~~"操作符吗?它有时也被称为double NOT运算符。你可以更快的使用它来作为Math.floor()替代品。为什么呢?单位移~将位转换输入-(输入+1),因此双位移将输入转换为-(-(输入+1)),这是个趋于0的伟大的工具。对于输入的数字,它将模仿Math.ceil()取负值和Math.floor()取正值。如果执行失败,则返回0,这可能在用来代替Math.floor()失败时返回一个NaN的时候发挥作用。

虽然~~可能有更好的表现,为了可读性,请使用Math.floor()。

# - Node.js:让module在没被require的时候运行

在node里,你可以根据代是运行了require('./something.js')还是node something.js,来告诉你的程序去做两件不同的事情。如果你想与你的一个独立的模块进行交互,这是很有用的。

更多信息,请看the documentation for modules

# - 给回调函数传递参数

在默认情况下,你无法将参数传给回调函数,如下:

你可以采取JavaScript闭包的优点来给回调函数传参,案例如下:

什么是闭包呢?闭包是指一个针对独立的(自由)变量的函数。换句话说,闭包中定义的函数会记住它被创建的环境。了解更多请参阅MDN所以这种方式当被调用的时候,参数X/Y存在于回调函数的作用域内。

另一种方法是使用绑定方法。例如:

两种方法在性能上有一些略微区别,详情参阅jsperf

# - 使用更简单的类似indexOf的包含判断方式

原生的JavaScript没有contains方法。对检查字符串或字符串数组项中是否存在某值,你可以这样做:

但是我们再看看这些ExpressJs代码片段。

问题是~位运算符。"运算符执行操作这样的二进制表达式,但他们返回标准的JavaScript的数值."他们将-1转换为0,而0在JavaScript中又是false。

在ES6(ES )中介绍了includes()方法可以用来确定是否一个字符串包含另一个字符串:

'something'.includes('thing'); // true

在ECMAScript (ES7)中,甚至数组都可以这样操作,如indexOf:

!!~[1, 2, 3].indexOf(1); // true[1, 2, 3].includes(1); // true

不幸的是,这只是在Chrome,Firefox,Safari 9或以上的浏览器中被支持。

# - arrow 函数(ES6)

介绍下ES6里的新功能,arrow函数可能会是个很方便的工具,用更少行数写更多代码。他的名字来源于他的语法,=>和小箭头->比就像一个“胖胖的箭头”。可能有些人知道,这种函数类型和其他静态语言如lambda表达式的匿名函数。它被称为匿名,因为这些箭头函数没有一个描述性的函数名。那么这样有什么好处呢?

语法:更少的LOC,不用一次次的键入函数关键字。

语义:从上下文中捕捉关键字this。

简单语法案例:

看看下面的两段代码片段,他们做的是一样的工作。你能很快的理解arrow函数的功能。

正如你所看到的,这个例子中的arrow函数可以节省你输入括号内参数和返回关键字的时间。建议把圆括号内的参数输入,如 (x,y) => x+y 。在不同的使用情况下,它只是

用来应对遗忘的一种方式。但是上面的代码也会这样执行:x => x*x.目前看来,这些仅仅是导致更少的LOC和更好的可读性的句法改进。

this 绑定

还有一个更好的理由使用arrow函数。那就是在会出现this问题的背景下。使用arrow函数,你就不用担心.bind(this)和 that=this 了。因为arrow函数会从上下文中找到this。

看下面的例子:

关于arrow函数的进一步信息可以看这里 。查看不同的语法选请访问该站点。

# - 测量一个JavaScript代码块性能的技巧

快速测量一个JavaScript块的性能,我们可以使用控制台的功能像console.time(label)和console.timeEnd(label)

更多信息Console object, JavaScript benchmarking

demo:jsfiddle-codepen (在浏览器控制台输出)

# - ES6中参数处理

在许多编程语言中,函数的参数是默认的,而开发人员必须显式定义一个参数是可选的。在JavaScript中的每个参数是可选的,但我们可以这一行为而不让一个函数利用ES6的默认值作为参数。

_err是立即抛出一个错误的函数。如果没有一个参数作为值,默认值是会被使用,_err将被调用,将抛出错误。你可以在Mozilla开发者网络看到的更多默认参数的例子。

# - 提升

理解提升将帮助你组织你的function。只需要记住,变量声明和定义函数会被提升到顶部。变量的定义是不会的,即使你在同一行中声明和定义一个变量。此外,变量声明让系统知道变量存在,而定义是将其赋值给它。

JavaScript小技巧整理篇(非常全)

为了使事情更容易阅读,在函数作用域内提升变量的声明将会让你明确该变量的声明是来自哪个作用域。在你需要使用变量之前定义它们。在作用域底部定义函数,确保代码清晰规范。

# - 检查一个对象是否有属性

当你要检查一个对象是否存在某个属性时,你可能会这样做 :

这是可以的,但你必须知道这个还有两原生的方式,in operator 和 object.hasownproperty,每个对象是对象,既可用方法。每个object都继承自Object,这两个方法都可用。

两个方法的一些不同点:

他们之间的不同在于检查的性质,换句话说,当该对象本身有查找的属性时hasOwnProperty返回yrue,然而,in operator不区分属性创建的对象和属性继承的原型链。这里有另外一个例子:

点击看例子。同时,建议在检查对象的属性存在时,阅读这些有关的常见错误。

# - 模板字符串

截至ES6,JS已经有模板字符串作为替代经典的结束引用的字符串。案例:普通字符串

在模板字符串中${}中,你可以写不用写/n或者简单逻辑来实现多行字符串。您还可以使用函数来修改模板字符串的输出,它们被称为模板字符串的标记。你可能还想读到更多的理解模板字符串相关信息。

# - 将节点列表转换为数组

querySelectorAll 方法返回一个和数组类似的节点列表对象。这些数据结构类似数组,因为经常以数组形式出现,但是又不能用数组的方法,比如map和foreach。这里是一个快速、安全、可重用的方式将一个节点列表到一个DOM元素数组:

apply方法是将一系列数组格式的参数传递给一个给定this的函数。MDN指出,apply将会调用类似数组的对象,而这正是querySelectorAll所返回的。因为我们不需要在函数的上下文中指定this,所以我们传入null或0。返回的结果是一组能使用数组方法的DOM元素数组。

如果你使用的是es可以利用...(spread operator)

# - "use strict" 和懒惰

严格模式的JavaScript让开发人员更加安全的编写JavaScript。默认情况下,JavaScript允许开发者懒惰,例如,我们在第一次声明变量的时候可以不用var,虽然这可能看起来像一个没有经验的开发人员,同时这也是很多错误的根源,变量名拼写错误或意外地将它提到了外部作用域。

程序员喜欢让电脑为我们做些无聊的事,检查一些我们工作的错误。"use strict"指令我们做这些,将我们的错误转换成JavaScript的错误。

我们把这个指令可以通过添加在一个js文件的顶部:

在包含这个指令的JavaScript文件或者函数内,我们将一些较大的JavaScript项目中的不良行为直接在JavaScript引擎执行中禁止了。在其他情况中,严格模式改变以下的行为:

· 变量只有在前面 var 声明了才能用· 试图写入只读属性产生的误差· 必须用 new 关键字调用构造函数· this 不会默认指向全局对象· 非常有限的使用eval()· 保护保留字符或未来保留字符不被作为变量名使用

严格模式在新项目中是很有好处的,但是在大多数地方没使用到它的老项目里使用它是非常具有挑战性的。当你把多个文件合并到一个文件时,它也是个问题,就像可能导致整个文件都在严格模式下执行。它不是一个声明,只是一个字面量,早期版本的浏览器会忽略它。严格模式支持:

· IE +· FF 4+· Chrome +· Safari 5.1+· Opera +

参阅MDN对于严格模式的描述。

# - 处理一个数组或单个元素作为参数的方法

相比于写个单独的方法去分别操作一个数组和一个元素作为参数的函数,更好的是写一个通用的函数,这样就都可以操作。这类似于一些jQuery的方法(css匹配将修改所有的选择器)。你仅需要先将一切放进数组,Array.concat会接收数组或单一的对象:

printUpperCase现在可以接收无论单一的元素作为参数还是一个数组:

# - undefined 和 null 的不同

· undefined指的是一个变量未被声明,或者一个变量被声明但未赋值· null是指一个特定的值,即"没有值". JavaScript给未赋值的变量默认定义为undefined· JavaScript不会给未赋值的变量设置null值,它被程序员用来表示一个无价值的值· undefined在json格式数据中是无效的,而null有效· undefined 类型是 undefined· null类似是object.为什么呢?· 两者都是原始值· 两者都被认为false(Boolean(undefined) // false, Boolean(null) // false)。· 辨认变量是不是undefined

typeof variable === "undefined" · 检查变量是不是null

variable === "null" 从值考虑他们是相等的,但是从类型和值共同考虑他们是不相等的

null == undefined // truenull === undefined // false

# - 以非ASCII字符形式来排序字符串

JavaScript有个原生的方法对字符串格式的数组进行排序,做一个简单的array.sort()将会把字符串们按首字母的数序排列。当然,也可以提供自定义排序功能。

当你试图用非ASCII字符,如 ['é', 'a', 'ú', 'c']这样的进行排序,你会得到一个奇怪的结果['c', 'e', 'á', 'ú'],因为只有用英语的语言才能排序,所以发生这种情况。

看一个简单的例子:

幸运的是,有两种方法来避免这种行为,ECMAScript国际化的API提供了localecompare和and Intl.Collator。这两种方法都有自己的自定义参数,以便将其配置来充分的完成功能。

使用 localeCompare()

使用 intl.collator()

· 每个方法都可以自定义位置

· 在FF浏览器,intl.collator()会更快,当比较的是较大的数值或字符串因此,当你在用英语以外的语言来赋值给字符串数组时,记得要使用此方法来避免意外的排序。

# - 改善嵌套条件

我们怎样才能改善并且使JavaScript中的if语句做出更有效的嵌套。

一个改善的办法是用switch语句代替嵌套的if语句。虽然它是更加简洁,更加有序,但不推荐这样做,因为很难debug。这里指出原因。

但是,当我们有多个判断条件的情况下呢?在这种情况下,如果我们想让它更加简洁,更加有序,我们可以使用switch。如果我们将true的作为一个参数传递给该switch语句,它可以让我们在每一个情况下放置一个条件。

但我们必须避免在每一个条件下进行多次检查,尽量避免使用switch。我们也必须考虑到最有效的方法是通过一个object。

这里有更多相关的信息。

# - ReactJs 子级构造的keys是很重要的

keys是代表你需要传递给动态数组的所有组件的一个属性。这是一个独特的和指定的ID,react用它来标识每个DOM组件以用来知道这是个不同的组件或者是同一个组件。使用keys来确保子组件是可保存的并且不是再次创造的,并且防止怪异事情的产生。

· 使用已存在的一个独立的对象值· 定义父组件中的键,而不是子组件

· 你可以创建你的唯一id,请确保该方法是快速的并已经附加到对象上的· 当子级的数量是庞大的或包含复杂的组件,使用keys来提高性能· 你必须为所有的子级ReactCSSTransitionGroup提供key属性

# - AngularJs: $digest vs $apply

AngularJs最让人欣赏的特点是双向数据绑定。为了是它工作,AngularJs评估模型的变化和视图的循环($digest)。你需要了解这个概念,以便了解框架是如何在引擎中工作的。Angular评估每时的每个事件的变化。这就是$digest循环。有时你必须手动运行一个新的循环,你必须有正确的选择,因为这个阶段是性能方面表现出最具影响力的。

$apply

这个核心方法让你来启动一个$digest循环。这意味着所以的watch列表中的对象都将被检查,整个应用程序启动了$digest循环。在内部,执行可选的函数参数之后,调用$rootScope.$digest();

$digest

在这种情况下,$digest方法在当前作用域和它的子作用域执行,你应该注意到,父级的作用域将不被检查,并没有受到影响。建议:

· 只在浏览器DOM事件在Angular之外被触发的时候使用$apply或者$digest · 给$apply传递函数表达式,这有一个错误处理机制,允许在消化周期中整合变化。

· 如果你仅仅想更新当前作用域或者他的子作用域,用$digest,并且防止整个应用程序的$digest。性能不言而喻咯。· 当$apply有很多东西绑定时,这对机器来说是个艰难的过程,可能会导致性能问题。· 如果你使用的是Angular 1.2.x以上的,使用$evalAsync。这是一个在当前循环或下一次循环的期间或对表达式做出评估的核心方法,这可以提高你的应用程序的性能。

# - 在数组插入一个项

将一个项插入到现有数组中,是一个日常常见的任务,你可以使用push在数组的末尾添加元素,使用unshift在开始的位置,或者在中间使用splice。

这些都是已知的方法,但这并不意味着没有一个更高性能的途径。我们来看一看。在数组的末尾添加一个元素很容易与push(),但还有一个更高性能的途径。

这两种方法都修改了数组,不相信我?看这个jsperf现在,如果我们正在尝试将一个项目添加到数组的开头:

这里更详细一点:unshift编辑原有的数组,concat返回一个新数组。jsperf 添加在阵列中的物品很容易使用splice,它是做它的最高效的方式。

我试着在不同的浏览器和操作系统中运行这些测试,结果是相似的。我希望这些建议对你有用,鼓励你自己做测试!

基于JavaScript如何制作遮罩层对话框 1.遮罩层其实就是一个覆盖全界面的半透明的DIV,并处理zIndex使他浮于其他元素之上,是用户不能点击下边的元素,或者说点击没有反应。2.在遮罩层上

基于JavaScript实现全屏透明遮罩div层锁屏效果 废话不多说了,直接给大家写js代码了,代码如下所示:!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""

JS组件Bootstrap Select2使用方法详解 在介绍select组件的时候,之前分享过一篇JS组件中bootstrapmultiselect两大组件较量的文章,这两个组件的功能确实很强大,本文分享下select组件的一些用法

标签: JavaScript小技巧整理篇(非常全)

本文链接地址:https://www.jiuchutong.com/biancheng/382794.html 转载请保留说明!

上一篇:基于canvas实现的绚丽圆圈效果完整实例(canvas基础)

下一篇:基于JavaScript如何制作遮罩层对话框(javascript教程chm)

  • 跨年度调整税金及附加
  • 税务机关的义务是依法征管
  • 公务员抚恤费
  • 差额发票和全额发票一样吗
  • 工资出现负数怎么申报个税
  • 企业购买电话充值卡的分录
  • 会计报废怎么处理
  • 资产划转涉税解读
  • 施工企业挂靠账务处理怎么做
  • 报税时其他收入
  • 银行利息回单怎么打印
  • 弃置费用预计负债减少超过固定资产账面价值
  • 未开发票收入交增值税怎么做账?
  • 奖金多发退回时间怎么算
  • 水费分割单由哪一方出具
  • 政府机构可以开对外营业的餐饮吗
  • 开票资料没有电话号码可以写法人名字吗
  • 一般纳税人简易征收范围
  • 退休职工的医疗保险怎么发放
  • 商业汇票付款方通过哪个会计科目核算
  • 报销误餐费会计怎么做账
  • 收到财政奖励扶持资金账务处理?
  • 广告公司怎么结转成本
  • vmware15虚拟机
  • win10系统如何开启蓝牙
  • php常用的开发工具
  • PHP:session_module_name()的用法_Session函数
  • 计提坏账可以冲回吗
  • kcleaner.exe是什么
  • php中imagecreatefromjpeg
  • php操作mysql数据库
  • php设置header参数
  • 下列项目的进项税额可从销项税
  • 盈余公积转增资本什么意思
  • api接口使用方法
  • vue 生产环境
  • mongodb最新版本
  • 个体户需要
  • 待处理财产损益是什么类科目借贷方向
  • 应收账款余额贷方
  • 信用减值损失转回的会计处理
  • 本月冲红上月发票后的税款能抵减吗
  • 公司过账的款项怎么入账
  • 持有待售资产的条件
  • 暂估应付账款余额调整
  • 股权转让的会计分录
  • 固定资产装修费用如果符合固定资产
  • 进项税额抵扣是按税率分开抵扣吗
  • 销售如果对待不同客户
  • 空调的预计净残值是什么
  • 员工离职未领工资怎么处置
  • 非营利医疗机构由谁批准
  • crack.exe是什么意思
  • vc++6.0运行程序
  • windows查看电池信息
  • xp系统磁盘检查进不去
  • ubuntu中用root删除文件夹
  • win10周年版
  • win10无法uefi
  • 苹果mac怎样
  • linux 运行二进制文件
  • 安装linux系统步骤图解
  • cocos2dx shader
  • shell 字符串trim
  • 写出perl中最常见4种控制流
  • jquery 使用
  • netmon.exe
  • shell脚本 -mtime
  • unity导出exe没反应
  • unity at
  • 浅谈如何实现乡村振兴论文
  • python的了解
  • 湖北省电子税务局新版登录操作简介
  • 发票系统怎么设置打印
  • 全国税收最高
  • 四川税务网上报税
  • 广东省地税电子税务局
  • 税务局纪检组为税收工作纪律保障
  • 河南省税务零申报怎么操作
  • 外贸企业出口退税会计分录怎么做
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设