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 也被修改。

 

 

posted @ 2013-09-07 12:18  月曜  阅读(177)  评论(0编辑  收藏  举报