zoukankan      html  css  js  c++  java
  • nodejs学习笔记

    概要

    cookies
    replace中正则的坑
    数组越界及undefined的大小问题
    dom的效率 dom方式设置元素的兼容性
    html中js文件的加载顺序
    excel文件的BOM+utf-8编码
    post默认提交form或页面变量
    redis hmset hgetall
    jquery重复绑定同一个动作不会失败
    弹出子页面modal
    echarts设置connect、光标信息、重复legend grid设置页边距、y:-300设置位置不可见
    散列图设置 series.type:”scatter” data为单个坐标点
    array.splice()语法
    关于async
    console.time() console.timeEnd()
    mongodb stream
     

    1、操作cookies

    express提供了bodyParser来操作cookies和sessions,不过通过jQuery操作cookie更方便:

    在html中添加cookies.js的引用:

    <script src="plugins/jquery.cookie.js"></script>

    在js中去cookie:

    var preData = $.cookie("reportPageInfo");

    设置cookie的值:

    $.cookie("reportPageInfo", JSON.stringify(preData), {expires:30});

    2、string.replace()的问题

    string.replace()中第一个参数为想要被替换的对象,但是replace的默认机制是只替换一次,如果要处理的字符串中存在多个需替换的字符,最好使用正则表达式并指定全局替换:

    > "2015/12/20".replace(///g, '')

    '20151220'

    3、数组越界问题与undefined的大小

    不知道是不是js通性,在nodejs中,数组下标越界时,不会提示错误,而是返回undefined,这样如果不确定算法的边界条件,就可能产生一系列预想之外的结果。

    > l1 = [1, 2, 3, 4]

    [ 1, 2, 3, 4 ]

    > l1[5]

    undefined

    即使undefined作为数组下标,仍然不会出错,而是返回undefined。目前对js了解不深,但是感觉这样的语法有点不够严谨。

    > l2=[]

    []

    > l2[l1[66]]

    undefined

    undefined是个特殊的对象:

    > undefined > 0

    false

    > undefined < 0

    false

    > undefined == 0

    false

    > undefined == 345

    false

    > undefined > 345

    false

    > undefined < 345

    false

    > undefined > 'erwtSD'

    false

    > undefined < 'erwtSD'

    false

    > undefined == 'erwtSD'

    false

    > undefined > ''

    false

    > undefined < ''

    false

    > undefined == ''

    false

    无论与什么类型比较,undefined都返回false,在if...else...结构中,配合数组越界问题,即使程序正常执行了,也很难确定程序是按照预想逻辑执行的。

    可能需要结合||排除undefined干扰。

    4、DOM的效率及兼容性

    通过DOM直接操作页面元素时,页面元素的每次改变都会触发页面整体重新渲染,即使是改变元素所属类。因此DOM方式效率较差。

    可通过在DOM对象中完成全部操作,再一次执行。

    关于兼容性,在实践中DOM方式创建的元素在Chrome中可以正常显示,FireFox中则TextNode内容无法显示,换用jquery方式设定后恢复正常,不知是否有其他问题。

    5、HTML中文件加载顺序

     HTML中文件按照书写顺序先后加载,如果先加载的js文件需要用到后加载的js文件内容,则会找不到所需内容。

    HTML中直接加载HTML:

    <% include ./../../include/footer.html %>

    6、Excel文件编码

    Excel文件内容的编码为BOM+utf-8,如果写入空白Excel文件中的字符只设定了utf-8编码而没有BOM,则同样会出现乱码。

    BOM:'uFEFF’

    7、setInterval与clearInterval

    使用轮询方式开始socket监听之后,如果不关闭,轮询在方法结束后仍会存在,影响进度条判断,需要在使用完毕后关闭轮询。

    setInterval(func, time);方法会返回一个生成的轮询对应的id,在关闭轮询时,将这个id传给clearInterval即可。

    clearInterval(socketID);

    8、post默认提交form或页面变量

    当HTML页面中存在form时,如果ajax.post方法没有参数,可能会将页面内容(全局变量)作为参数进行传递。如果全局变量中内容过大,可能导致request entity too large错误。

    9、redis操作

    node中设置redis值:
    设置键值对形式值:client.hmset(label, key, value, callback)
    取得键值对值:client.hgetall(label, callback)  取得结果为json格式数据,可以直接取对应key的值
     
    10、jQuery重复绑定同一个动作不会失败
    jQuery的click、focus、change等方法,对同一个元素进行多次绑定时,每次绑定的方法不会覆盖前次绑定的方法,会在事件被触发后连续执行。重复绑定可能会造成同一个操作被多次执行。最好每次绑定之前都能确定不会扩大影响,或者先进行解绑。
     
    11、子页面modal
    暂时只知道如何设定及控制显式隐藏,实现原理还不清楚。
    $("#modalID").modal("show");
     
    12、echarts图像联动设置
    在图像绘制完成后,通过connect方法将当前图像对象与所有其他对象connect,每个对象都要绑定一次,来实现图像联动。
    如果需要设置一个legend来控制所有图像,则在所有图像中都需要有包括全部图形的legend及对应的series项,serises项的data可以为空,隐藏不需要的legend后,可通过保留的legend控制对应的图形显式。
     
    通过option.tooltip.formatter设置图像光标信息:

    option.tooltip.formatter = function(params) {
      var res = params[0].name + '<br/>';
      res += params[0].seriesName + " : " + params[0].value;
      return res;
    }

    设置legend的y属性,隐藏legend

    {legend: {

        y: -300,
        data: createConnectedSeriesName(obj, data)

      }

    }

    13、散列图设置

    xAxis与yAxis的type都为"value",在series中所有数据的type都是"scatter",数据的data部分每个元素都是一个包含横纵坐标的点,因此不需要设定xAxis的data部分。

    14、关于array.splice()

    splice方法可用于插入元素、删除指定位置的元素,用法为:

    arrayObject.splice(index,howmany,item1,.....,itemX)

    index为数组下标,第二个参数为删除元素的个数,设置为0时,会在指定元素之后插入第三个参数开始的指定内容。

    15、关于流程控制--async

    async.waterfall
    顺序执行几个函数,后一个可以接收前一个的回调返回值作为参数,最后一个函数的回调返回则是waterfall方法的返回值。
     
    async.mapSeries(array, iterator, callback)
    以array中的元素为参数,顺序执行iterator方法,在iterator方法中通过callBack(null, item)的方式返回执行结果,最后的callback中,数据部分是按照执行顺序排列的返回结果的数组。
     
    async.mapLimit(arr, limit, iterator, callback)
    类似mapSeries,但是可以并行limit个
     
    async.parallell
    并行执行几个函数,但是函数必须显示定义好,目前为止感觉不太实用,可用mapLimit替代。
     
    16、js代码执行时间统计

    console.time("label1");
    ...
    console.timeEnd("label1");

    统计两者之间的代码执行时间,单位为毫秒。time与timeEnd的参数必须一一对应,否则会报错找不到何时开始或终止。

    17、mongoose.stream

    mongoose中find方法将结果转换为Query对象返回,当返回结果数据量较大时可能会逼近nodejs引擎的内存上限,使程序终止。

    mongoose.stream方式将查询结果每次返回一条,相对而言可提高效率。

     1 var stream = table.find(query, projection).sort({
     2     ct: 1,
     3     duk: 1
     4 }).lean(true).stream();
     5 stream.on('data', function(singleRec) {
     6     datas.push(singleRec);
     7 }).on('error', function(err) {
     8     callBack(err, null);
     9 }).on("close", function() {
    10     console.log("rec length:", datas.length);
    11     callBack(null, datas);
    12 });
  • 相关阅读:
    求素数(定义法,埃式法,欧拉法)
    打表法
    python学习日记(匿名函数)
    python学习日记(编码再回顾)
    python学习日记(文件操作练习题)
    python学习日记(迭代器、生成器)-乱七八糟
    python学习日记(生成器函数进阶)
    python学习日记(装饰器的补充)
    python学习日记(函数--装饰器)
    python学习日记(函数进阶)
  • 原文地址:https://www.cnblogs.com/harelion/p/5060399.html
Copyright © 2011-2022 走看看