向更合适的API靠近

目的

在不考虑兼容以及工具的支持下,使用最新的API,以达到简洁与个人的知识更新。

ES6部分参考:
MDN官方文档
ECMAScript 6 入门

目录

  • Obect 对象操作
  • Array 数组操作
  • String 字符串操作
  • Number 数字操作
  • 其他功能整合

1,Obect 对象操作

在对象内,声明一个变量为属性名
        //bad
        var keys = 'listName';
        var obj    = {};
        obj[''+keys ] = xxx;
        
        //good
        var keys = 'listName';
        var obj    = {
               [keys]: xxx;
        };

        //在对象用内 []声明属性key,可以[]进行简单数据操作(复杂也可以,不推荐);
        var aa = 'hello';
        var bb = 'world';
        var obj1 = {
              [aa+bb]: 123;
              [bb+aa]() {              // 等同于 worldhello:function (){}
                  console.log(321);
              }
        }
        console.log(obj1.helloworld);   //  123;
        obj1.worldhello();                    //321;

Object.assign 浅复制

       //Object.assign(target, source1, source2);
      
      //bad
      var default_opt = {
            name: 'default',
            times: 10000
      }
      var params_opt = {
         name: 'name1'
      }
      for( var key in default_opt ) {
            if( typeof params_opt[key]  === 'undefind' ){   //如果直接用  if( params_opt[key] ) 会漏过 false 0 '' 等值
                params_opt[key] = default_opt[key]
            }
      }

      //good
      Object.assign(default_opt ,params_opt );   //更多用法参考文档
      //注意点,Object.assign()是浅拷贝,对于被拷贝的对象中存在嵌套对面的情况,
      //这个时候的拷贝只是引用的同一个对象,在修改复制后的对象中的嵌套对象时,
      //会引起被拷贝的对象中的嵌套对象改变,
      //个人的建议是,利用Object.assign() 这一特性,自己编写一个深度拷贝。

对象属性key遍历 Object.keys

     var obj  =  {   aaa :123,  bbb :323};
    
      //bad
      for(var key in obj) {
        console.log(obj[key])
      }

      //good
     Object.keys(obj).forEach( item => {
          console.log(obj[item]);
    })

    //更多类似的Object取属性key value用法 
    //Object.values(obj) => [123,323]
    //Object.values(obj) => [['aaa':123],['bbb',323]]

2,Array 数组操作

主要涉及到以下method
  • Array.from()
  • Array.forEach()
  • Array.reduce()
  • Array.map()
  • Array.filter()
  • Array.some()
  • Array.every()

类数组转数组 Array.from()

一般用作获取arguments、NodeList等一类的类数组转化为数组,从而进行操作。

    //老旧用法   for循环的用法更low 就不展示了
    function getInputValue() {
         var tmp_arr = [];
         [].forEach.call(document.querySelectorAll('input[name="like"]'),function (item) {
              tmp_arr.push(tmp_arr.value);
         })
        return tmp_arr.join(',');   
    }

    //替换用法
    function getInputValue() {
         var tmp_arr = [];
         Array.from(document.querySelectorAll('input[name="like"]'),forEach(function (item) {
              tmp_arr.push(tmp_arr.value);
         })
        return tmp_arr.join(',');   
     }

  //更高级的用法 reduce 可以不使用 tmp_arr 临时变量

数组循环 Array.forEach()

我觉得这个没有必要上代码,只要尽量避免在js 用 for 循环去循环一个数组

数组累加器 Array.reduce()

在 针对数组中的要进行字符串拼接,有着得天独厚的优势

    //一般的用法
    var arr  = [
             { name: '小赵'},
             { name: '小钱'},
            { name: '小孙'},
             { name: '小李'}  
          ];

    //一般的用法
    function getNames() {

            var tmp_str = '';

            arr.forEach( item => {
                tmp_str += item.name + ' ';
            });

            return tmp_str;
      }

    //更好用法
    function getNames() {

          return arr.reduce((total,item) => {

              return `${total} ${item.name}`

            },'');
      }

然而 `` 跟 ${} 又是什么 ,那就等看一下 String 的扩展了

基于一个数组生成新数组 Array.map()

基于一个数组,可以循环该数组的每个成员并返回拿到成员值做特殊处理的结果,重新组成新数组

    var arr = [9,8,10,11,12];
    //bad 
    var new_arr = [];
    arr.forEach( item => {
      new_arr.push( item * 10 );
    })

    //good
    var new_arr;
    new_arr = arr.map( item => {
      return item * 10
    })
    //这个也没什么必要讲

数组过滤器 Array.filter()

过滤一个数组,对一个数据进行数据筛选,并返回一个通过的筛选值组成的新数组

    var arr = [9,8,10,11,12];
    //bad 
    var new_arr = [];
    arr.forEach( item => {
          if( item >= 10){
              new_arr.push( item * 10 );
          }
    })

    //good
    var new_arr;
    new_arr = arr.filter( item => {
      return item >= 10;
    })

数组循环判断 Array.some()

这个用得比较多,作用就是去 替换 数组for循环中存在终止条件break

  var arr = [
                {id:1,isSelected:false},
                {id:2,isSelected:true},
                {id:3,isSelected:false}
            ];
  
    var flag_has_select = false;

    //bad A
    var i;
    var len;
    for( i = 0,len = arr.length; i < len; i++) {
        if( arr[i].isSelected ) {
            flag_has_select = true;
            break;
        }
    }

    //bad B
    arr.forEach( item => {
        if( item.isSelected ){
            flag_has_select = true;
            //forEach 无法中断
        }
    })

    //good
    flag_has_select = arr.some( item => {
        return item.isSelected;
        //if( item.isSelected ) { return true}
    })

数组循环判断 Array.every()

    var arr = [
                {id:1,isSelected:false},
                {id:2,isSelected:true},
                {id:3,isSelected:false}
            ];
    
    var flag_all_select = true;

    //bad 
    arr.forEach( item => {
        if( !item.isSelected ){
            flag_all_select = false;
        }
    })

    //good
    flag_all_select = arr.every( item => {
        return item.isSelected;
    })

3,String 字符串操作

最明确的一点 不再出现 html += 'xxx' + xxx + 'xxx' 这类的操作,该用模板引擎的用模板引擎,该 字符串 拼接的 采用 `反引号${ 变量 }拼接。

模板字面量

   //bad A
  html = '/api/user/' + useId;
  //good A
  html = `api/user/${userId}`;

  //bad B
  data.forEach( item => {
    html += '
  • ' + item.name + '
  • '; }) //good B data.forEach( item => { //在能够确认数据不会包含 xss 攻击 且 dom 字符拼接较少时 html += `
  • ${item.name}
  • `; //当数据存在包含 xss 攻击的可能性 或者 大量的 dom 字符拼接 html += template(item); //xss 攻击中的一种主要是用户通过输入信息包含

    你可能感兴趣的:(向更合适的API靠近)