zoukankan      html  css  js  c++  java
  • js小记

    数组操作:
    var arr1 = arr2 = [1, 2, 3];
     
    
    arr1 = []; // arr1此时为空      arr2呢?
    arr2  ; //  [1, 2, 3]
    arr1与arr2同时指向一个数组,arr1此时为空,但是arr2 却不是。因为 这个地方使用的数组字面量[]  ,此时arr1是指向一个新的数组 而并非之前的[1,2,3]。
    如果想要arr2也变成空数组,
    需要将  arr1.length=0; 这个时候就清空了原有引用数组的值。
     
    var arr1=[1,2,3];
    var arr2=[4,5,6];
    var arr3=arr1.concat(arr2);
    arr3; // [1, 2, 3, 4, 5, 6]

    concat数组可以连接2个数组。 我们也可以使用push来完成。

    var arr1=[1,2,3];
    var arr2=[4,5,6];
    Array.prototype.push.apply(arr1,arr2);
    arr1 ;  //[1, 2, 3, 4, 5, 6]

    将参数转换为数组:

    [].prototype.slice.apply(arguments);  

    特征检测 :

    if(window.opera){
        console.log("OPERA");
    }else{
        console.log("NOT OPERA");
    }

    以上是最常用的检测手段。但是不一定会准确。

    if("opera" in window){
        console.log("OPERA");
    }else{
        console.log("NOT OPERA");
    }

    这种检测对象将在浏览器中初始化资源的时候生效。更有效的方法是检查是否关键是在一个对象中。

    判断一个对象的内置类型:

    var obj=[];
    Object.prototype.toString.call(obj)=="[object Array]";

    这里使用了 toString 方法来 判断 一个对象的类型 。具体解释看这里http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html

     在underscore.js中 isArray 、isFunction、isElement 等都用的这个判断方式

      _.isArray = nativeIsArray || function(obj) {
        return toString.call(obj) == '[object Array]';
      };
     each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
        _['is' + name] = function(obj) {
          return toString.call(obj) == '[object ' + name + ']';
        };
      });

     异常捕捉:

    try{
        console.log(aaa) ; //输出aaa
    }catch(err){
        console.log(err.message)    //因为找不到 所以抛出异常   aaa is not defined 
    }

    异常抛出有个特点,它会跨过 中间方法 直接抛出:

    只有在错误发生点以及处理错误的点上才需要 错误处理代码。

    function testAbnormal(array){   // 方法1     该方法 会抛出异常
    
        if(array.length>0){
            return array[array.length-1];
        }   else{
           throw('array is  no fined ');
        }
    
    }
    function testA(array){
        return testAbnormal(array)+10;  //方法2     调用方法1     理论上 方法一出异常 会冒泡到这个方法 导致这个方法也报错  ,但情况不是这样的。
    }
    
    try {
        alert(testA([]));                //方法2   没有出错。 这个时候方法1 直接抛出错误
    } catch(err){
         console.log(err)
    }

    异常之后处理错误:

    function testAn(n){
        var c;
        var a = c;
        c= n;
        try{
          //一些判断代码 
        }   finally{
            console.log(c);  //最后无论如何 都会输出c  
        }
    
    } 
    testAn(4);    

    利用finally  无论抛出异常与否,都会执行里面的语句。

    hasOwnProperty 检测属性:

    通常我们检测一个对象是否有某个对象的时候 会用for in 来遍历,但是这样会搜寻到 该对象的上层原型。

    通过hasOwnProperty 可以避免, 但是又有个问题,hasOwnProperty 可以被修改程别的方法,这样就无法准确测试。

    for(var i in obj){
       if(Object.prototype.hasOwnProtytype.call(obj,i)){
         //如果存在某个方法 执行
     }
    }

    通过call 指向Object 这样就可以正确查找了。除非Object.prototype 也被修改。

    Now or nerver .
  • 相关阅读:
    gRPC详解
    vue 实现无限向上滚动
    vue 封装highcharts组件
    《数据结构与算法之美》32——分治算法
    《数据结构与算法之美》31——贪心算法
    《数据结构与算法之美》30——回溯算法
    《数据结构与算法之美》29——动态规划实战
    《数据结构与算法之美》28——动态规划理论
    《数据结构与算法之美》27——初识动态规划
    《数据结构与算法之美》26——广度优先搜索与深度优先搜索
  • 原文地址:https://www.cnblogs.com/iyueyao/p/3296089.html
Copyright © 2011-2022 走看看