博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JavaScript】我的JavaScript技术总结第一篇——编程细节
阅读量:5323 次
发布时间:2019-06-14

本文共 2030 字,大约阅读时间需要 6 分钟。

  1. 遍历数组
    for (var i=0, l=arr.length; i

          这样写的一个好处就是让每次循环少一步获取数组对象长度的操作,数组长度越长,价值越明显。

  2. 判断变量的真假
    if (a) {...} //a='', a='0', a=[], a={}

          if条件判断的结果分别是:false, true, true, true。这个结果和PHP的结果是不同的,不要混淆。还需要区分它和非恒等判断相似的情况。

  3. 0值非恒等判断
    1 if (0 == '0') {...} //true2 if (0 == []) {...} //true3 if (0 == [0]) {...} //true4 if (0 == {}) {...} //false5 if (0 == null) {...} //false6 if (0 == undefined) {...} //false

          其实还有很多这种诡异的判断,我只列出了较为常见的。如果想弄明白其中的规则,请参阅我的另一篇博文:。

  4. parseInt的陷阱
    var n = parseInt(s); //s='010'

            该语句执行后n值为8,而不是10。虽然很多人知道这一点,但是编程中难免会出错,我深有体会。所以,最好按下面的方式来写,就不会出错了。

    var n = parseInt(s, 10);
  5. 变量在使用前一定要先声明

          虽然,直接使用变量而不声明也不会出错,但是,这样写是很容易出错的。因为解释器会把它解释成全局变量,很容易和其他全局变量重名而导致出错。所以,一定要养成变量使用前要先声明的好习惯。

  6. 循环中存在异步的情况
    for (var i=0, l=arr.length; i

          你会发现,输出的结果都是相同的,而且是当i=arr.length-1时的输出内容。因为JavaScript是单线程的,它会先执行完整个循环的同步内容之后,才去执行其中的异步操作。代码中的匿名回调函数就是一个异步回调。执行到该函数的时候,for循环以及后面的一些同步操作都已经执行完毕。出于闭包原则,该函数会保留for循环的最后一次循环的sql变量和i变量的内容,所以才会导致错误的结果。

          那怎么办呢?解决方法有两种,一种是使用立即函数,如下:

    for (var i=0, l=arr.length; i

           还有一种方法是将异步操作部分提取出来,单写一个函数,如下:

    var outputSQL = function(sql, i){      db.query(sql, function(){            sys.log(i + ': ' + sql);    }); //db.query为表查询操作,是异步操作}for (var i=0, l=arr.length; i
  7. 在对大量数据作处理时,尽量避免循环嵌套

          因为循环嵌套的处理时间会随着数据量的增加成指数级增长,所以应尽量避免。遇到这种情况,如果没有更好的办法,一般采取的策略是以空间换时间,即建立一张二级循环数据的Hash映射表。当然,还要具体情况具体分析。还有一点要说的是,某些方法本身就是一个循环体,如Array.sort()(该方法应该是用了两层循环实现),在使用的时候需加注意。

  8. 尽量避免递归调用

          递归调用的优点是代码简洁,实现简单,而它的缺点很重要,说明如下:

          (1)函数栈的大小会随着递归层次成线性增长,而函数栈是有上限值的,当递归达到一定层数后函数栈就会溢出,从而导致程序出错;

          (2)每递归一层都会增加额外的压栈和出栈操作,即函数调用过程中的保存现场和恢复现场。

          所以,应尽量避免递归调用。

  9. 数组和对象不要混用

          下面是错误代码的示例:

    var o = [];o['name'] = 'LiMing';

          数组和对象混用可能会导致不可预知的错误。我的一个同事就遇到过一个很奇怪的问题,先看代码:

    var o = [];o['name'] = 'LiMing';var s = JSON.stringify(o);

          他本以为对象o的name属性会在JSON串中,结果就是没有。当时我也很奇怪,但我有预感到是数组和对象混用的问题,试了一下,果然是它的问题。后来我在ECMA规范中查到,数组在序列化时是按JA规则进行的。所以,要养成一个好的编程习惯,正确使用数组和对象,不要混用。

  10. 无限制搜索条件
    function getSomeList(func) {    if (func === undefined) {        func = function(){};    }    var list = [];    for (var i=0, l=arr.length; i

           使用函数式参数,可以用一个函数实现任意条件的搜索,有很大的自由度。

转载于:https://www.cnblogs.com/alwu007/p/3811987.html

你可能感兴趣的文章
HTTP协议
查看>>
转载 jenkins执行selenium 测试 浏览器不显示解决方法
查看>>
spring+mybatis利用interceptor(plugin)兑现数据库读写分离
查看>>
wenbao与极角排序
查看>>
回顾JAVA---3.异常
查看>>
data Binding
查看>>
SSM配置
查看>>
HDU 5957 Query on a graph
查看>>
java基础语法
查看>>
Java中Runnable和Thread的区别
查看>>
spring基础概念AOP与动态代理理解
查看>>
背景颜色透明
查看>>
"Invalid username/password or database/scan listener not up"
查看>>
360°全景影像建库流程
查看>>
Java学习笔记51:数组转ArrayList和ArrayList转数组技巧
查看>>
atomsphere scattering
查看>>
数组和矩阵(3)——Next Greater Element I
查看>>
VS2019/VS2017安装源离线下载,更新,清理,企业版与论坛版重复下载
查看>>
多态的弊端
查看>>
Linux 文件基本属性: chown修改所属组 和 chmod修改文件属性命令
查看>>