你可能不知道的10个JavaScript小技巧

AD9826的时序分析及Verliog代码 AD9826的时序分析及Verliog代码 (本文对AD9826的模式和时序进行了分析,如有错误敬请指正,关于这款ADC芯片的基本参数,本文不做过多介绍) 1、AD9826的模式 AD9826的采样模式主要有两种,一种是“CDS模式”,一种是“SHA模式”;在这两种模式下分别有1通道、2通道、3通道的采样模式 (1)CDS模式 简单的来说CDS模式就是,有两个采样时钟,一个是ADCCLK1,用来采样CCD波形的参考电平,一个是ADCCLK2用来采样数据电平,然后经过,偏移量调节,再经过PGA增益放大最 阅读详情

尽管我使用Javascript来做开发有很多年了,但它常有一些让我很惊讶的小特性。对于我来说,Javascript是需要持续不断的学习的。在这篇文章中,我将列出10个Javascript使用小技巧,主要面向Javascript新手和中级开发者。希望每个读者都能至少从中学到一个有用的技巧。

1.变量转换

看起来很简单,但据我所看到的,使用构造函数,像Array()或者Number()来进行变量转换是常用的做法。始终使用原始数据类型(有时也称为字面量)来转换变量,这种没有任何额外的影响的做法反而效率更高。

 
  1. var myVar = "3.14159",
  2. str = ""+ myVar,// to string
  3. int = ~~myVar, // to integer
  4. float = 1*myVar, // to float
  5. bool = !!myVar, /* to boolean - any string with length
  6. and any number except 0 are true */
  7. array = [myVar]; // to array

转换日期(new Date(myVar))和正则表达式(new RegExp(myVar))必须使用构造函数,而且创建正则表达式的时候要使用/pattern/flags的形式。

2.十进制转换为十六进制或者八进制,或者反过来

你是不是写个单独的函数来转换十六进制(或者八进制)呢?马上停下吧!有更容易的现成的函数可以用:

 
  1. (int).toString(16); // converts int to hex, eg 12 => "C"
  2. (int).toString(8); // converts int to octal, eg. 12 => "14"
  3. parseInt(string,16) // converts hex to int, eg. "FF" => 255
  4. parseInt(string,8) // converts octal to int, eg. "20" => 16

3.玩转数字

除了上一节介绍的之外,这里有更多的处理数字的技巧:

 
  1. 0xFF; // Hex declaration, returns 255
  2. 020; // Octal declaration, returns 16
  3. 1e3; // Exponential, same as 1 * Math.pow(10,3), returns 1000
  4. (1000).toExponential(); // Opposite with previous, returns 1e3
  5. (3.1415).toFixed(3); // Rounding the number, returns "3.142"

4.Javascript版本检测

你知道你的浏览器支持哪一个版本的Javascript吗?如果不知道的话,去维基百科查一下Javascript版本表吧。出于某种原因,Javascript 1.7版本的某些特性是没有得到广泛的支持。不过大部分浏览器都支持了1.8版和1.8.1版的特性。(注:所有的IE浏览器(IE8或者更老的版本)只支持1.5版的Javascript)这里有一个脚本,既能通过检测特征来检测JavaScript版本,它还能检查特定的Javascript版本所支持的特性。

 
  1. var JS_ver = [];
  2. (Number.prototype.toFixed)?JS_ver.push("1.5"):false;
  3. ([].indexOf && [].forEach)?JS_ver.push("1.6"):false;
  4. ((function(){try {[a,b] = [0,1];return true;}catch(ex) {return false;}})())?JS_ver.push("1.7"):false;
  5. ([].reduce && [].reduceRight && JSON)?JS_ver.push("1.8"):false;
  6. ("".trimLeft)?JS_ver.push("1.8.1"):false;
  7. JS_ver.supports = function()
  8. {
  9. if (arguments[0])
  10. return (!!~this.join().indexOf(arguments[0] +",") +",");
  11. else
  12. return (this[this.length-1]);
  13. }
  14. alert("Latest Javascript version supported: "+ JS_ver.supports());
  15. alert("Support for version 1.7 : "+ JS_ver.supports("1.7"));

5.使用window.name进行简单会话处理

这个是我真的喜欢的东西。您可以为指定一个字符串作为window.name属性的值,直到您关闭该标签或窗口。虽然我没有提供任何脚本,但我强烈建议您如充分利用这个方法。举例来说,在建设一个网站或应用程序的时候,在调试和测试模式之间切换是非常有用的。

6.判断属性是否存在

这个问题包含两个方面,既有检查属性时候存在,还要获取属性的类型。但我们总是忽略了这些小事情:

 
  1. // BAD: This will cause an error in code when foo is undefined
  2. if (foo) {
  3. doSomething();
  4. }
  5. // GOOD: This doesn't cause any errors. However, even when
  6. // foo is set to NULL or false, the condition validates as true
  7. if (typeof foo != "undefined") {
  8. doSomething();
  9. }
  10. // BETTER: This doesn't cause any errors and in addition
  11. // values NULL or false won't validate as true
  12. if (window.foo) {
  13. doSomething();
  14. }

但是,有的情况下,我们有更深的结构和需要更合适的检查的时候,可以这样:

 
  1. // UGLY: we have to proof existence of every
  2. // object before we can be sure property actually exists
  3. if (window.oFoo && oFoo.oBar && oFoo.oBar.baz) {
  4. doSomething();
  5. }

7.给函数传递参数

当函数既有必选又有可选参数的时候,我们可能是这样做的:

 
  1. function doSomething(arg0, arg1, arg2, arg3, arg4) {
  2. ...
  3. }
  4. doSomething('', 'foo', 5, [], false);

而传递一个对象总是比传递一堆的参数更方便:

 
  1. function doSomething() {
  2. // Leaves the function if nothing is passed
  3. if (!arguments[0]) {
  4. return false;
  5. }
  6. var oArgs = arguments[0]
  7. arg0 = oArgs.arg0 || "",
  8. arg1 = oArgs.arg1 || "",
  9. arg2 = oArgs.arg2 || 0,
  10. arg3 = oArgs.arg3 || [],
  11. arg4 = oArgs.arg4 || false;
  12. }
  13. doSomething({
  14. arg1 : "foo",
  15. arg2 : 5,
  16. arg4 : false
  17. });

这只是一个把对象作为参数传递的一个很简单的例子,例如,我们还可以声明一个对象,变量名作为Key,默认值作为Value。

8.使用document.createDocumentFragment()

您可能需要动态地追加多个元素到文档中。然而,直接将它们插入到文档中会导致这个文档每次都需要重新布局一个,相反的,你应该使用文档碎片,建成后只追加一次:

 
  1. function doSomething(arg0, arg1, arg2, arg3, arg4) {
  2. ...
  3. }
  4. doSomething('', 'foo', 5, [], false);

而传递一个对象总是比传递一堆的参数方便:

 
  1. function createList() {
  2. var aLI = ["first item", "second item", "third item","fourth item", "fith item"];
  3. // Creates the fragment
  4. var oFrag = document.createDocumentFragment();
  5. while (aLI.length) {
  6. var oLI = document.createElement("li");
  7. // Removes the first item from array and appends it
  8. // as a text node to LI element
  9. oLI.appendChild(document.createTextNode(aLI.shift()));
  10. oFrag.appendChild(oLI);
  11. }
  12. document.getElementById('myUL').appendChild(oFrag);
  13. }

9.为replace()方法传递一个函数

有的时候你想替换字符串的某个部分为其它的值,最好的方法就是给String.replace()传递一个独立的函数。

下面是实现在线扑克游戏中大量输出的一个简单例子:

 
  1. var sFlop = "Flop: [Ah] [Ks] [7c]";
  2. var aValues = {"A":"Ace","K":"King",7:"Seven"};
  3. var aSuits = {"h":"Hearts","s":"Spades","d":"Diamonds","c":"Clubs"};
  4. sFlop = sFlop.replace(/\[\w+\]/gi, function(match) {
  5. match = match.replace(match[2], aSuits[match[2]]);
  6. match = match.replace(match[1], aValues[match[1]] +" of ");
  7. return match;
  8. });
  9. // string sFlop now contains:
  10. // "Flop: [Ace of Hearts] [King of Spades] [Seven of Clubs]"

10.循环中标签的使用

有的时候,循环中又嵌套了循环,你可能想在循环中退出,则可以用标签:

 
  1. outerloop:
  2. for (var iI=0;iI<5;iI++) {
  3. if (somethingIsTrue()) {
  4. // Breaks the outer loop iteration
  5. break outerloop;
  6. }
  7. innerloop:
  8. for (var iA=0;iA<5;iA++) {
  9. if (somethingElseIsTrue()) {
  10. // Breaks the inner loop iteration
  11. break innerloop;
  12. }
  13. }
  14. }

原文链接:http://www.cnblogs.com/lhb25/archive/2010/08/12/1797727.html

当windows安装git时出现以下错误提示 Windows安装Git时出现多个系统配置设置失败错误(exit code 4294967295),提示包括无法设置textconv、LFS过滤器和SSL等配置项。关键问题在于scalar.exe版本不兼容,系统提示"该版本的scalar.exe与你运行的Windows版本不兼容"。解决方案是检查程序版本是否正确,下载与Windows系统兼容的正确版本重新安装即可。 阅读详情

相关推荐

ADS与Cadence中Verilog-A文件的编译与调用实战指南

本文详细介绍了在ADS与Cadence平台中Verilog-A文件的编译与调用实战指南,涵盖开发环境配置、模型创建与编译、仿真设置技巧以及跨平台协作与调试等内容。通过具体案例和优化策略,帮助工程师高效完成混合信号仿真设计,提升电路建模与验证效率。

weixin_29196315的博客 498

JavaScript函数中传递对象key值无效的解决方案

JavaScript函数中传递对象key值无效的解决方案 通过动态属性的方法访问 object[] uploadRequest(loadingFlag, fileObj, imgStr) { this[loadingFlag] = true //通过[]括号来访问或设置对象动态属性 }, customRequest() { this.uploadRequest('loading', 'coverFile', 'imgOssCover') }, custo

qq_39097055的博客 1619

超详细!新手必看STM32-DMA配置与实验(串口使用DMA发送数据)

DMA就是:直接存储器访问。DMA传输数据从一个地址空间复制到另一个地址空间,提供在外设和存储器或者存储器和存储器之间的高速数据传输。

qq_1033275663的博客 2万+

TS的踩坑之路(一)

TS 之踩坑之路

在路上`的博客 4962

树莓派驱动DLPDLCR230NPEVM+framebuffer显示图片

DLPDLCR230NPEVM DLP® LightCrafter™ Display 230NP 是一个易于使用的紧凑型即插即用评估平台,适用于消费类产品、工业、医疗和物联网 (IoT) 市场中的各种超便携显示应用。此评估模块 (EVM) 采用 DLP230NP 芯片组,该芯片组由DLP230NP.23 1080p DMD、DLPC3436显示控制器和DLPA2005PMIC/LED 驱动器组成。此 EVM 外形小巧,配备生产就绪型光学引擎以及支持 18 位 RGB 并行视频接口...

L_Y000的博客 2620

Android Qcom USB Driver学习(十三)

该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) Android Qcom USB Driver学习(八) Android Qcom USB Driver学习(九)deals with the USB Power Delivery resources used by one or more ports on the basis of the local device policy the basis of the local device policy.opera

Android驱动开发 2615

js避免对象深度引用报错

项目中的对象引用太长,太过信任数据结构,数据一但改变会导致引用报错。教你几个方法避免这些错误。

grx1125的博客 370

用51单片机和LD3320语音模块DIY一个会说话的温度报警器(附完整代码)

本文详细介绍了如何使用51单片机和LD3320语音模块DIY一个智能温度报警器,包括硬件选型、电路设计、软件开发及核心功能实现。通过DS18B20温度传感器和语音模块的结合,实现温度超标时的语音报警功能,适合智能家居系统等应用场景。附完整代码,方便开发者快速复现。

weixin_42525632的博客 420

【前端系列教程之JavaScript】13_JavaScript浏览器深入解析

浏览器深入解析 浏览器的组成 浏览器在不断的演变中,并没有被要求呈现出一种特定的形态,但基本包括了如用户地址栏输入框、网络请求、浏览器文档解析、渲染引擎渲染网页、 JavaScript 引擎执行 js 脚本、客户端存储等功能。 从原理构成上分为七个模块,分别是User Interface(用户界面)、Browser engine(浏览器引擎)、Rendering engine(渲染引擎)、Networking(网络)、JavaScript Interpreter(js解...

波哩个波的博客 1223

HDMI协议介绍(一)--Overview

HDMI全称(High Definition Multimedia Interface)高清多媒体接口,支持在单线缆上传输全数字高清视频和多声道音频。

SlamDunk的博客 2万+

华为OD机试 - 服务中心选址(Python)

一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心到所有区域的距离的总和最小。先输入区域数组positions的长度n(1 ≤ n ≤ 10^5)接下来 n 行每行输入成对的left和right值,以空格隔开。输出为location。

m0_46181452的博客 282

你可能不知道的10 个JavaScript 小技巧 [转]

1.变量转换 看起来很简单,但据我所看到的,使用构造函数,像Array( ) 或者Number( ) 来进行变量转换是常用的做法。始终使用原始数据类型(有时也称为字面量)来转换变量,这种没有任何额外的影响的做法反而效率更高。 varmyVar="3.14159", str=""+myVar,//tostring int...

weixin_30756499的博客 105

低功耗设计:如何计算power switch的数量?

power switch加多了漏电高,加少了ir drop会有问题,具体加多少合适要如何计算呢?这里可以给一个参考方式。 第一步,先选switch cell的类型 通常选用HVT类型的switch cell,优点是漏电更低,缺点也很明显,电阻大,压降也大,switch cell的大小选择,可以选择(开启电阻x面积)最小的switch cell,即单位面积提供最小并联电阻的cell类型。 第二步,计算数量 选好类型,确定了开启电阻,可以按照如下公式计算数量: Ron/Xnum • W/V = V•P

m0_61544122的博客 3577

这 10 个 JS 小技巧,你可能还不知道

英文 | https://javascript.plainenglish.io/5-cool-javascript-features-you-might-not-know-about-ye...

前端达人 211

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: JavaScript初学者应注意的七个细节
下一篇: 那些相见恨晚的 JavaScript 技巧
迷渡
迷渡 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄19年 2405粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值