出处:http://www.lovejavascript.com/#!zone/blog/content.html?id=48

jquery里面有个each方法,将循环操作简化、便捷。

随后es出了个forEach方法,两个虽然用法相近,但是不能处理对象类型。且无法通过return true达到continue效果。

此外还有个every方法,该方法虽然可以实现continue效果,但是在处理类数组与对象类型时,完全无用。

在不使用jquery的each方法时,该如何处理;或者说用原生如何来实现?我在GridManager.js中集成了该方法,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 通过字面量方式实现的函数each
var each =  function(object, callback){
  var type = (function(){
          switch (object.constructor){
            case Object:
                return 'Object';
                break;
            case Array:
                return 'Array';
                break;
            case NodeList:
                return 'NodeList';
                break;
            default:
                return 'null';
                break;
        }
    })();
    // 为数组或类数组时, 返回: index, value
    if(type === 'Array' || type === 'NodeList'){
        // 由于存在类数组NodeList, 所以不能直接调用every方法
        [].every.call(object, function(v, i){
            return callback.call(v, i, v) === false false true;
        });
    }
    // 为对象格式时,返回:key, value
    else if(type === 'Object'){
        for(var in object){
            if(callback.call(object[i], i, object[i]) === false){
                break;
            }
        }
    }
}

我们来try一下, 测试下数组、对象、类数组类型及中断效果

数组类型:

1
2
3
4
var _array = [1,2,3,4];
each(_array, function(i, v){
  console.log(i + ': ' + v);
});

输出如下:

对象类型:

1
2
3
4
var object = {a:1, b:2, c:3}
each(object, function(i, v){
  console.log(i + ': ' + v);
});

输出如下:

类数组类型 :

1
2
3
4
var ele = document.querySelectorAll('div');
each(ele, function(i, v){
  console.log(i + ': ' + v);
});

输出如下:

增加中断条件:

1
2
3
4
5
6
7
8
9
10
11
12
var object2 = {name:'baukh', age: '29', six:'男', url: 'www.lovejavascript.com',}
each(object2, function(i, v){
  if(i === 'age'){ //如果存在键值为age的属性时,则输出警告,用于实现continue效果
    console.log('存在键值为age,这家伙已经'+v+'岁了');
    return true;
  }
  if(i === 'six' && v === '男'){//如果存在键值为age的属性时,则输出跳出,用于实现break效果
    console.log('存在键值为six,是个男的,不用关注了~');
    return false;
  }
  console.log(i + ': ' + v);
});

输出如下:

从结果可以看出来,each方法已经实现了jquery的each功能。且实现如此简单~

javascript笔记——源生js实现each方法的更多相关文章

  1. cocos2d JS 源生js实现each方法

    javascript笔记——源生js实现each方法   出处:http://www.lovejavascript.com/#!zone/blog/content.html?id=48 jquery里 ...

  2. JavaScript笔记1———js的数据类型

    JS的数据类型有: 1.数值类型(Number):js中所有数字均用浮点数字表示. 可以表示32位(即4字节)的整数,也可以表示64位(即8字节)的浮点数(小数). 也可以用二进制.八进制.十进制.十 ...

  3. JavaScript笔记1———js的一些常识

    一.什么是js? js是一种运行于解释器中的解释型脚本语言. 二.js的组成部分? 1.ECMAScript-----这是js的核心 2.DOM-----让js可以对网页进行操作(例:对页面元素的增. ...

  4. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

  5. javascript的setTimeout()用法总结,js的setTimeout()方法

    引子 js的setTimeout方法用处比较多,通常用在页面刷新了.延迟执行了等等.但是很多javascript新手对setTimeout的用法还是不是很了解.虽然我学习和应用javascript已经 ...

  6. javascript笔记——js的阻塞特性[转载]

    JS具有阻塞特性,当浏览器在执行js代码时,不能同时做其它事情,即<script>每次出现都会让页面等待脚本的解析和执行(不论JS是内嵌的还是外链的),JS代码执行完成后,才继续渲染页面. ...

  7. 【原】javascript笔记之Array方法forEach&map&filter&some&every&reduce&reduceRight

    做前端有多年了,看过不少技术文章,学了新的技术,但更新迭代快的大前端,庞大的知识库,很多学过就忘记了,特别在项目紧急的条件下,哪怕心中隐隐约约有学过一个方法,但会下意识的使用旧的方法去解决,多年前ES ...

  8. C#中webbrowser与javascript(js)交互的方法

    今天在做一个项目的时候需要用c#搞一个webbrowser,然后有些地方还需要与js交互.所以就查了一下资料,发现很多博客提到了但是却没有说下具体的操作.所以我就写一下. 开发环境是Visual St ...

  9. iOS JS 交互之利用系统JSContext实现 JS调用OC方法以及Objective-C调用JavaScript方法

    ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择拷贝到工程中,(拖入的文件夹是蓝色 ...

随机推荐

  1. window、Linux 文本文件转换

    如下: $ sed -e 's/.$//' mydos.txt > myunix.txt $ sed -e 's/$/\r/' myunix.txt > mydos.txt

  2. Ubuntu下安装Kafka Manager

    参考 : kafka管理器kafka-manager部署安装 下载Kafka Manager,并进行打包,由于Kafka manager是由scala写的,所以需要由sbt的支持 git clone ...

  3. tensorflow中一种融合多个模型的方法

    1.使用场景 假设我们有训练好的模型A,B,C,我们希望使用A,B,C中的部分或者全部变量,合成为一个模型D,用于初始化或其他目的,就需要融合多个模型的方法 2.如何实现 我们可以先声明模型D,再创建 ...

  4. layui动态数据表格-分页

    数据结构 $list = [ [,'], [,] ]; $json[; $json['; $json[; $json['data'] = $list; return json($json); 代码: ...

  5. Spring源码导入IDEA

    导入Spring 4.3.8的源码,JDK的版本1.8以上:因为 1.下载Spring源码 方法一: (1)下载并安装GIt,下载地址:https://git-scm.com/download/win ...

  6. Lock 从来就没有成功过

    package lime.thinkingInJava._021._005._003; import java.util.concurrent.ExecutorService; import java ...

  7. MySQL加密解密

    1. 加密:mysql323,不可逆 select old_password('bbs.antian365.com'); # 10c886615b135b38 2. 加密:mysqlsha1,不可逆 ...

  8. BCP文件导入SQLServer数据库遇到的问题

    1. BCP文件插入sql server数据库,未指定数据库字段类型情况下,需要每个字段单独指定字段长度 2.文件中的存储值得类型 3.设置最大的类型

  9. 给vscode添加右键打开功能

    将以下文本存为vscode.reg,然后运行: Windows Registry Editor Version 5.00  ; Open files [HKEY_CLASSES_ROOT\*\shel ...

  10. array_rand

    array_rand — 从数组中随机取出一个或多个单元 mixed array_rand ( array $array [, int $num = 1 ] ) 从数组中取出一个或多个随机的单元,并返 ...