数组操作:
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 也被修改。