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 });
  • 相关阅读:
    poj 1113 Wall 凸包的应用
    NYOJ 78 圈水池 (入门级凸包)
    Monotone Chain Convex Hull(单调链凸包)
    poj Sudoku(数独) DFS
    poj 3009 Curling 2.0(dfs)
    poj 3083 Children of the Candy Corn
    Python join()方法
    通过FISH和下一代测序检测肺腺癌ALK基因融合比较
    华大病原微生物检测
    NGS检测ALK融合大起底--转载
  • 原文地址:https://www.cnblogs.com/harelion/p/5060399.html
Copyright © 2011-2022 走看看