js 循环拆词_javascript forEach通用循环遍历方法

循环遍历一个元素是开发中最常见的需求之一,那么让我们来看一个由框架BASE2和Jquery的结合版本吧.

上一次的错误太多,排版也出现了问题,重写了一遍,希望大家支持.

循环遍历一个元素是开发中最常见的需求之一,那么让我们来看一个由框架BASE2和Jquery的结合版本吧.

var forEach = (function(){

//数组与伪数组的遍历

var _Array_forEach = function (array, block, context) {

if (array == null) return;

//对String进行特殊处理

if(typeof array == 'string'){

array = array.split('');

}

var i = 0,length = array.length;

for (;i < length && block.call(context, array[i], (i+1), array)!==false; i++) {}

};

//对象的遍历

var _Function_forEach = function (object, block, context) {

for (var key in object) {

//只遍历本地属性

if (object.hasOwnProperty(key)&&block.call(context, object[key], key, object)===false){

break;

}

}

};

return function(object, block, context){

if (object == null) return;

if (typeof object.length == "number") {

_Array_forEach(object, block, context);

}else{

_Function_forEach(object, block, context);

}

};

})()

函数本身并不复杂,但很精巧。加了一些简单的注释,想信大家能看懂。

来看一点例子

//1:1 \n 2:2

forEach([1,2,3,4,5],function(el,index){

if(index>2){

return false;

}

alert(index+":"+el);

});

function print(el,index){

alert(index+":"+el);

}

//a:a \n b:b \n c:c

forEach({a:'a',b:'b',c:'c'},print);

//1:笨 \n 2:蛋 \n 3:的 \n 4:座 \n 5:右 \n 6:铭

forEach("笨蛋的座右铭",print);

function Person(name, age) {

this.name = name || "";

this.age = age || 0;

};

Person.prototype = new Person;

var fred = new Person("笨蛋的座右铭", 25);

fred.language = "chinese";//极晚绑定

//name:jxl \n age:22 \n language:chinese

forEach(fred,print);

注:回调函数中的index参数下标从1开始

为什么不用内置的forEach

和getElementsByClassName一样,内置的forEach效率很高,但是在功能上有局限性,它无法在循环中途退出。而在我们这个forEach中,它可以在处理函数内通过返回false的方式退出循环,更加的灵活。

特别的length属性

length属性是一个很特别的属性,看到数组,大家一定会想到length,那看到带有length属性的对象呢?那大家一定要想到伪数组(类数组)。那什么是伪数组呢?简单的理解就是能通过Array.prototype.slice转换为真正的数组的带有length属性的对象。javascript最为著名的伪数组就是arguments对象。关于伪数组有很多东西,以后我会专门写一篇博文讲这个东西。大家只要记住:不要随便给对象赋予length属性,除非你明确的知道,你准备把它当作伪数组来使用。

我想这个函数是一个简单javascript工具库中的必备函数,它是金字塔的根基,在它的基础上,进行再封装,可以让你的库更强大,更加美丽!

以下是补充

在Base2中找到一个叫forEach的函数,是我见过的最好的实现。挖出来分析一下。它能对各种普通对象,字符串,数组以及类数组进行遍历。如果原游览器的对象已实现此函数,它则调用原对象的函数。

function forEach(object, block, context, fn) {

if (object == null) return;

if (!fn) {

if (typeof object == "function" && object.call) {

//遍历普通对象

fn = Function;

} else if (typeof object.forEach == "function" && object.forEach != arguments.callee) {

//如果目标已经实现了forEach方法,则使用它自己的forEach方法(如标准游览器的Array对象)

object.forEach(block, context);

return;

} else if (typeof object.length == "number") {

// 如果是类数组对象或IE的数组对象

_Array_forEach(object, block, context);

return;

}

}

_Function_forEach(fn || Object, object, block, context);

};

function _Array_forEach(array, block, context) {

if (array == null) return;

var i = 0,length = array.length;

if (typeof array == "string") {

for (; i < length; i++) {

block.call(context, array.charAt(i), i, array);

}

}else{

for (;i < length; i++) {

block.call(context, array[i], i, array);

}

}

};

_Function_forEach = function(fn, object, block, context) {

// 这里的fn恒为Function

for (var key in object) {

//只遍历本地属性

if (object.hasOwnProperty(key)) {

//相当于 block(object[key], key)

block.call(context, object[key], key, object);

}

}

};

原作者的一些例子(我FQ扒过来了!):

function print(el,index){

alert(index+" : "+el)

}

forEach ([1, 2, 3], print);

forEach ({a: "aa", b: "bb",c: "cc"}, print);

forEach ("司徒正美", print);

forEach(document.styleSheets,function(el){

if(el.href) alert(el.href)

});

司徒正美的

function forEach(object, block, context, fn) {

if (object == null) return;

if (!fn) {

if (typeof object == "function" && object.call) {

//遍历普通对象

fn = Function;

} else if (typeof object.forEach == "function" && object.forEach != arguments.callee) {

//如果目标已经实现了forEach方法,则使用它自己的forEach方法(如标准游览器的Array对象)

object.forEach(block, context);

return;

} else if (typeof object.length == "number") {

// 如果是类数组对象或IE的数组对象

_Array_forEach(object, block, context);

return;

}

}

_Function_forEach(fn || Object, object, block, context);

};

function _Array_forEach(array, block, context) {

if (array == null) return;

var i = 0,length = array.length;

if (typeof array == "string")

array = array.split("");

for (;i < length; i++) {

block.call(context, array[i], i, array);

}

};

_Function_forEach = function(fn, object, block, context) {

// 这里的fn恒为Function

for (var key in object) {

//只遍历本地属性

if (object.hasOwnProperty(key)) {

//相当于 block(object[key], key)

block.call(context, object[key], key, object);

}

}

};

function print(el,index){

alert(index+" : "+el)

}

forEach ([1, 2, 3], print);

forEach ({a: "aa", b: "bb",c: "cc"}, print);

forEach ("司徒正美", print);

forEach(document.styleSheets,function(el){

if(el.href) alert(el.href)

});

代码

function Person(name, age) {

this.name = name || "";

this.age = age || 0;

};

var fred = new Person("Fred", 38);

fred.language = "English";//极晚绑定

fred.wife = "Wilma";//极晚绑定

forEach(fred,print)

完整代码

function forEach(object, block, context, fn) {

if (object == null) return;

if (!fn) {

if (typeof object == "function" && object.call) {

//遍历普通对象

fn = Function;

} else if (typeof object.forEach == "function" && object.forEach != arguments.callee) {

//如果目标已经实现了forEach方法,则使用它自己的forEach方法(如标准游览器的Array对象)

object.forEach(block, context);

return;

} else if (typeof object.length == "number") {

// 如果是类数组对象或IE的数组对象

_Array_forEach(object, block, context);

return;

}

}

_Function_forEach(fn || Object, object, block, context);

};

function _Array_forEach(array, block, context) {

if (array == null) return;

var i = 0,length = array.length;

if (typeof array == "string")

array = array.split("");

for (;i < length; i++) {

block.call(context, array[i], i, array);

}

};

_Function_forEach = function(fn, object, block, context) {

// 这里的fn恒为Function

for (var key in object) {

//只遍历本地属性

if (object.hasOwnProperty(key)) {

//相当于 block(object[key], key)

block.call(context, object[key], key, object);

}

}

};

function print(el,index){

alert(index+" : "+el)

}

function Person(name, age) {

this.name = name || "";

this.age = age || 0;

};

var fred = new Person("Fred", 38);

fred.language = "English";//极晚绑定

fred.wife = "Wilma";//极晚绑定

forEach(fred,print)

在Base2中还提供了一个叫unbind的方法,我们可以用它把原生对象的forEach方法剥离出来供我们调用:

核心代码

var _slice = Array.prototype.slice;

function unbind(fn) {

return function(context) {

return fn.apply(context, _slice.call(arguments, 1));

};

};

完整代码

try{

var _slice = Array.prototype.slice;

function unbind(fn) {

return function(context) {

return fn.apply(context, _slice.call(arguments, 1));

};

};

function print(el,index){

alert(index+" : "+el)

}

var each = unbind(Array.prototype["forEach"])

var a = {cc : function(e){alert(e)}};

each(["11111","22222"],a.cc,a)//最后的a可有可无

}catch(e){alert("请在标准浏览器中使用!")}

这篇文章就介绍到这了,希望大家以后多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Tocmat6.x的catalina.out日志不断增加问题

实际的线上环境&#xff0c;如果使用tomcat作为运行容器&#xff0c;需要注意默认的tomcat的日志配置&#xff0c;在线上很容易导致产生大量垃圾log&#xff0c;有可能会导致tomcat不堪重负而down掉&#xff0c; 为了避免产生上述问题&#xff0c;则需要进行配置调整。 修改$TO…

Python 学习笔记(1)

最近开始学习Python&#xff0c;早早听说这是一门高效率的编程语言&#xff0c;据说可以用几行代码就实现如Java语言需要写几十行代码才实现的功能&#xff0c;加上这门语言在图像分类等方向应用得很多&#xff0c;所以就提前学习下。 原本计划是看《Head First Python》的&…

android image设置adjustviewbounds_探索 Android 平台的 CameraX

前言如果你曾经用过 Android 的 Camera APIs&#xff0c;你可能已经感受到了&#xff0c;它们一直没有成为最容易实现的东西。最开始是 Camera API&#xff0c;然后又推荐使用 Camera2 API — 这个升级是为了让开发者在使用 Android 的相机 API 时有更好的体验。然而&#xff0…

一行语句让你的浏览器变成记事本

Jose Jesus Perez Aguinaga : One line browser notepad&#xff0c; 只需要在浏览器地址栏键入&#xff1a; data:text/html, <html contenteditable>转载于:https://www.cnblogs.com/fresky/archive/2013/01/31/2886837.html

c++opencv汉字分割_机器学习小白,还不快pick一下——【视觉与图像:阈值分割】...

“前言&#xff1a;安利Python来开发OpenCV的原因其实细心的小伙伴早在?【视觉与图像】PythonOpenCV教程入门篇就找到了想要的答案。(点蓝字即可打开)”今天周五了&#xff01;今天还不下雨&#xff01;&#xff01;今天又可以更新了&#xff01;&#xff01;&#xff01;先前…

python学习笔记--理解生成器

在学习python的时候&#xff0c;刚开始接触生成器&#xff08;generator&#xff09;这个概念的时候&#xff0c;其实还是不太能理解&#xff0c;感觉并没有完全掌握&#xff0c;今天看到这篇文章的时候&#xff0c;感觉对这个概念真的是有了进一步的了解&#xff0c;感觉生成器…

再不努力我就老了

借用李宇春歌里的一句话&#xff0c;再不疯狂我们就老了。。。再不努力青春就没了。。。 今天在浏览校内时&#xff0c;发现右下角滚动的照片中&#xff0c;竟有一张是关于自己的&#xff0c;那是自己5年前的照片&#xff0c;满脸的稚嫩&#xff0c;连自己都承认那时的自己真的…

mysql主键外键_MySQL主键和外键使用及说明

摘自网上一个经典的例子&#xff1a;大哥和小弟一、外键约束MySQL通过外键约束来保证表与表之间的数据的完整性和准确性。外键的使用条件&#xff1a;1.两个表必须是InnoDB表&#xff0c;MyISAM表暂时不支持外键(据说以后的版本有可能支持&#xff0c;但至少目前不支持)&#x…

python学习笔记--迭代器

转载自理解Python的迭代器 首先&#xff0c;廖雪峰老师的教程中解释了迭代器和生成器&#xff0c;这篇文章只是补充和我个人的总结。 什么是迭代 可以直接作用于for循环的对象统称为可迭代对象(Iterable)。 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterat…

【转载】周鸿祎:做产品体验先把自己切换到二傻子模式

我唯一能自吹的地方&#xff0c;就是本人在互联网里可能犯的错最多&#xff0c;挨的骂最多&#xff0c;然后也经历了很多失败&#xff0c;所以这样才有一些真实的感受。 建议大家把《定位》和《创新者的窘境》、《创新者的解答》这几本书放在身边反复读。你经历得越多&#xff…

mysql临时关闭索引功能_MYSQL中常用的强制性操作(例如强制索引)

mysql常用的hint对于经常使用oracle的朋友可能知道&#xff0c;oracle的hint功能种类很多&#xff0c;对于优化sql语句提供了很多方法。同样&#xff0c;在mysql里&#xff0c;也有类似的hint功能。下面介绍一些常用的。强制索引 FORCE INDEX复制代码代码如下:SELECT * FROM TA…

python学习--windows下安装Numpy包的错误:Unable to find vcvarsall.bat

今天在安装numpy包的时候&#xff0c;无论是通过pip install numpy 还是上网下载numpy包后安装都是出现问题&#xff1a;error: Unable to find vcvarsall.bat&#xff0c;于是百度了下&#xff0c;看到Windows下安装Python包(Numpy)的错误&#xff1a;Unabletofindvcvarsall.b…

使用多行sql字符串时,要注意不要忽略了空格

使用李刚老师编著的《疯狂Java讲义》&#xff08;第2版&#xff09;学习MySql数据库与JDBC编程&#xff08;使用Java 7 &#xff09;&#xff0c;其中第601页的ConnMySql.java 程序代码在Eclipse上运行&#xff0c;出现错误。 import java.sql.*; public class ConnMySql{publi…

Python学习笔记---理解zip()函数

转载自Python零碎知识(2):强大的zip 一、代码引导 首先看这一段代码&#xff1a; 1 >>> name(jack,beginman,sony,pcky)2 >>> age(2001,2003,2005,2000)3 >>> for a,n in zip(name,age):4 print a,n5 6 输出&#xff1a;7 jack 20018 beginma…