js-小技巧(1)

来源:互联网 发布:阿里巴巴软件开发人员 编辑:程序博客网 时间:2024/06/06 04:21

js中的小技巧很多,一时也没办法全部整理出来,所以可能分好几次发。

1、类型判断-(节取自jQuery)

js较常用的类型判断应该是typeof和instanceof这两个操作符了,但效果其实不尽如任意,因为他们通常只简简单单的提示一个"object"。所以下面的类型判断的方式选自jQuery库:

(function(undefined){var $=function(){}, class2type={}, toString=class2type.toString;function likeArray(obj) { return typeof obj.length == 'number' }$.each=function(elements, callback){var i, keyif (likeArray(elements)) {  for (i = 0; i < elements.length; i++)if (callback.call(elements[i], i, elements[i]) === false) return elements} else {  for (key in elements)if (callback.call(elements[key], key, elements[key]) === false) return elements}return elements}function type(obj){return obj==null ? String(obj) :class2type[toString.call(obj)] || "object";}$.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {class2type[ "[object " + name + "]" ] = name.toLowerCase()});alert(type(new Date()))})();

本来不愿贴这么长的代码,不过既然是节取,就节取的全一点好了(不要在意$对象)。

其实思路很简单,用Object原型的toString方法获取类型,再将常见的对象类型保存在class2type中,在type函数中对null和class2type中不存在的类型进行处理,即可对js中的类型进行判断。


2、数组unique结果

filter=[].filter||function(fn){var results=[];for(var i=0,len=this.length;i<len;i++){if(fn(this[i], i))results.push(this[i]);}return results;};uniq = function(array){ return filter.call(array, function(item, idx){ return array.indexOf(item) == idx }) }alert(uniq([2,3,2,4,null,'a',null,'d','a']));

unique其实并不复杂,这是zepto库中的一种写法,重要的是这种实现思路。


3、多维数组转一维数组(prototype中的写法)

Object.extend=function(destination, source){for(var property in source){destination[property] = source[property];}return destination;}Object.extend(Array.prototype, (function(){Array.isArray = Array.isArray ? Array.isArray : function(obj){ return obj instanceof Array };function each(iterator){for(var i=0, length=this.length; i<length; i++)iterator(this[i], i);}function inject(memo, iterator, context){this.each(function(item, index){memo=iterator.call(context, memo, item, index);});return memo;}function flatten(){return this.inject([], function(array, item){if(Array.isArray(item)){return array.concat(item.flatten());}array.push(item);return array;});}return {each: each,inject: inject,flatten: flatten}})());alert([1,453,54,4,[333,444,["bbb","ccc"]],3,4].flatten()[6]);

主方法flatten其实只有一个递归,重点在inject方法中——把返回值作为参数传给函数iterator。


暂时先写这么多吧,有时间再整理。。。

0 0
原创粉丝点击