JavaScript常用方法和封装详情

目录
  • 1.字符串相关
    • 1.1 format方法
  • 2.数组相关
    • 1.2 forEach(callback,context) 操作数组中的每一个元素
    • 1.3 indexOf(searchvalue,fromindex) 查询数组中某一个值的下标
  • 2.数组封装

1.字符串相关

1.1 format方法

在各种编程语言中,字符串的format方法是比较常见的,以下通过js扩展的方式,实现了js版本的format方法。目前貌似还没有浏览器支持这一个方法。

if(!String.prototype.format ){
    String.prototype.format = function() {
        var e = arguments;
        return this.replace(/{(\d+)}/g,function(t, n) {
            return typeof e[n] != "undefined" ? e[n] : t;
        })
    };
} 

例子:

var template = "今天的天气很{0},大家一起去{1}!";
alert(template.format("晴朗","郊游"));

效果:

2.数组相关

1.2 forEach(callback,context) 操作数组中的每一个元素

ie9以上的浏览器,以及其他非IE浏览器都支持这一方法。

以下是兼容性的扩展写法:

/**
    forEach除了接受一个必须的回调函数参数,还可以接受一个可选的上下文参数(改变回调函数里面的this指向)(第2个参数)。
*/
if (!Array.prototype.forEach && typeof Array.prototype.forEach !== "function") {
    Array.prototype.forEach = function(callback, context) {
       // 遍历数组,在每一项上调用回调函数,这里使用原生方法验证数组。
       if (Object.prototype.toString.call(this) === "[object Array]") {
           var i,len;
           //遍历该数组所有的元素
           for (i = 0, len = this.length; i < len; i++) {
               if (typeof callback === "function"  && Object.prototype.hasOwnProperty.call(this, i)) {
                   if (callback.call(context, this[i], i, this) === false) {
                       break; // or return;
                   }
               }
           }
       }
    };
}

例子:

var drinks = ['雪碧','可乐','脉动','红牛','农夫山泉'];
        
var context = {
    str1 : '【',
    str2 : '】'
};
        
drinks.forEach(function(item){
    console.log(this.str1 + item + this.str2);
},context);

效果:

这个方法在各大浏览器都得到了较好的支持。

1.3 indexOf(searchvalue,fromindex) 查询数组中某一个值的下标

ie9以上的浏览器,以及其他非IE浏览器都支持这一方法。

以下是兼容性的扩展写法:

//获取某元素在数组中第一次出现的下标
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {
    var k;
    // 1. Let O be the result of calling ToObject passing
    //    the this value as the argument.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }
 
    var O = Object(this);
 
    // 2. Let lenValue be the result of calling the Get
    //    internal method of O with the argument "length".
    // 3. Let len be ToUint32(lenValue).
    var len = O.length >>> 0;
 
    // 4. If len is 0, return -1.
    if (len === 0) {
      return -1;
    }
 
    // 5. If argument fromIndex was passed let n be
    //    ToInteger(fromIndex); else let n be 0.
    var n = +fromIndex || 0;
 
    if (Math.abs(n) === Infinity) {
      n = 0;
    }
 
    // 6. If n >= len, return -1.
    if (n >= len) {
      return -1;
    }
 
    // 7. If n >= 0, then Let k be n.
    // 8. Else, n<0, Let k be len - abs(n).
    //    If k is less than 0, then let k be 0.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
 
    // 9. Repeat, while k < len
    while (k < len) {
      // a. Let Pk be ToString(k).
      //   This is implicit for LHS operands of the in operator
      // b. Let kPresent be the result of calling the
      //    HasProperty internal method of O with argument Pk.
      //   This step can be combined with c
      // c. If kPresent is true, then
      //    i.  Let elementK be the result of calling the Get
      //        internal method of O with the argument ToString(k).
      //   ii.  Let same be the result of applying the
      //        Strict Equality Comparison Algorithm to
      //        searchElement and elementK.
      //  iii.  If same is true, return k.
          if (k in O && O[k] === searchElement) {
            return k;
          }
          k++;
        }
        return -1;
      };
    }

例子:

var index = drinks.indexOf('雪碧');
alert(index);//0

类似的还有lastIndexOf,用于获取数组中某个元素最后一次出现的位置。如果数组没有这个元素,则返回-1。

该方法的实现:

//获取某元素在数组中最后一次出现的下标
if (!Array.prototype.lastIndexOf) {
      Array.prototype.lastIndexOf = function(searchElement /*, fromIndex*/) {
    'use strict';
 
    if (this === void 0 || this === null) {
      throw new TypeError();
    }
 
    var n, k,
        t = Object(this),
        len = t.length >>> 0;
    if (len === 0) {
      return -1;
    }
 
    n = len - 1;
    if (arguments.length > 1) {
      n = Number(arguments[1]);
      if (n != n) {
        n = 0;
      }
      else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) {
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
      }
    }
 
    for (k = n >= 0
          ? Math.min(n, len - 1)
          : len - Math.abs(n); k >= 0; k--) {
      if (k in t && t[k] === searchElement) {
        return k;
      }
    }
    return -1;
  };
}

通过这两个方法,我们可以来做一些有意思的事情了。比如,判断一个对象是否为数组?

IE9 以上的浏览器,已经支持通过Array.isArray()来验证一个对象是否为数组了。

比如:

var result = Array.isArray([]);
alert(typeof []);//object
alert(result); //true

那么,如果我们自己来实现,又该如何做呢?下面给出一个简单思路,

简单模拟一下这个过程:

//首先,让我们来看一看数组的构造器是咋样的?
console.log([].constructor.toString());
 
/*
    打印出来是这样的:
    function Array() { [native code] }
*/

于是便有了

 var Array = function(){
 
}
 
Array.isArray = function(obj){
    return obj.constructor.toString().indexOf('Array') != -1;
}
 
var result = Array.isArray([]); 
alert(result); //true

虽然取巧了点,不过目的确实达到了。

2.数组封装

通过数组的一些基本方法,我们可以开始自己模拟一下java中的ArrayList

代码如下:

//模拟ArrayList
function ArrayList(){
    var arr = []; //用于保存数据的数组
    var length = 0; //数组的长度,默认为0
    
    /**
     * 判断是否为空
     */
    this.isEmpty = function(){
        return length == 0;
    }
    
    /**
     * 获取列表长度
     */
    
    this.size = function(){
        return length;
    }
    
    /** 
    * 判断对象中是否包含给定对象
    */ 
    this.contains = function(obj){
        if(arr.indexOf(obj) != -1){
            return true;
        }
        return false;
    }
    
    /** 
    * 新增
    */
   this.add = function(obj){
    length = length + 1;
    arr.push(obj);
   }
   
   /**
    * 删除
    * 参数1  obj : 需要删除的元素
    * 参数2  deleteAll: 是否全部删除,否则默认删除第一个匹配项
    */
   this.remove = function(obj,deleteAll){
        var len = arr.length;
        for(var i = 0 ;i < len ;i++){
            if(arr[i] == obj){
                arr.splice(i,1);
                length = length - 1;
                if(!deleteAll){
                    break;
                }
            }
        }
   }
   
   
   /**
    * 根据索引获取对应的元素
    */
   this.get = function(index){
    if(index > length - 1){
        return null;
    }
    return arr[index];
   }
   
   /**
    * 获取列表数组
    */
   this.toArray = function(){
     return arr;
   }
   
   /**
    * 获取某一个元素的角标
    * 如果只出现一次,就返回一个数字,如果大于一次,就返回数组
    */
   this.indexOf = function(obj){
     var rstArr = [];
     var count = 0;
     for(var i = 0 ;i < length ;i++){
        if(obj == arr[i]){
            rstArr[count++] = i;
        }
     }
     if(count == 1){
        return rstArr[0];
     }
     return rstArr;
   }
   
   this.toString = function(){
    return arr.toString();  
   }
}
 
//测试代码
var list = new ArrayList();
list.add('张三');
list.add('李四');
list.add('王五');
list.add('赵六');
list.add('王五');
console.log(list.size());
console.log(list.toString());
console.log(list.contains('张三'));
list.remove('王五',true); //null,undefined,''
console.log(list.toString());
console.log(list.get(0));
console.log(list.get(1));
console.log(list.get(2));
console.log(list.size());
 
console.log(list.toArray());
list.add('张三');
list.add('张三');
console.log(list.toArray());
console.log(list.indexOf('张三'));
console.log(list.indexOf('赵六'));

运行结果:

到此这篇关于JavaScript常用方法和封装详情的文章就介绍到这了,更多相关JavaScript方法和封装内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • js实现封装jQuery的简单方法与链式操作详解

    我用这篇文章来理一理如何用js去实现封装jQuery的简单方法. 本文js实现了下面jquery的几种方法,我将它分为8个小目标 实现$(".box1").click( )方法 实现$("div").click( )方法 考虑$( )中参数的三种情况 实现jq中的on方法 实现链式操作 实现jq中的eq方法 实现jq中的end方法 实现jq中的css方法 有不正确的地方还望大家在评论区指出来,谢谢啦. 1. 实现$(".box1").click(

  • JavaScript缓动动画函数的封装方法

    本文实例为大家分享了JavaScript缓动动画函数的封装代码,供大家参考,具体内容如下 本文将从封装缓动动画的以下几个部分进行封装(1.单个属性,2.多个属性,3.缓动框架之回调函数,4.缓动框架之层级与透明度) 首先:获取元素样式的兼容方式 function getStyle(ele,attr){ //获取任意类型的CSS样式的属性值 if(window.getComputedStyle){ return window.getComputedStyle(ele,null)[attr]; }

  • JavaScript常用工具方法封装

    因为工作中经常用到这些方法,所有便把这些方法进行了总结. JavaScript 1. type 类型判断 isString (o) { //是否字符串 return Object.prototype.toString.call(o).slice(8, -1) === 'String' } isNumber (o) { //是否数字 return Object.prototype.toString.call(o).slice(8, -1) === 'Number' } isBoolean (o)

  • 常用的前端JavaScript方法封装

    目录 1.输入一个值,返回其数据类型** 2.数组去重 3.字符串去重 4.深拷贝 浅拷贝 5.reverse底层原理和扩展 6.圣杯模式的继承 7.找出字符串中第一次只出现一次的字母 8.找元素的第n级父元素 9. 返回元素的第n个兄弟节点 10.封装mychildren,解决浏览器的兼容问题 11.判断元素有没有子元素 12.我一个元素插入到另一个元素的后面 13.返回当前的时间(年月日时分秒) 14.获得滚动条的滚动距离 15.获得视口的尺寸 16.获取任一元素的任意属性 17.绑定事件的

  • js封装成插件的步骤方法

    由于项目原因,工作一年多还没用js写过插件,项目太成熟,平时基本都是在使用已经封装好的功能插件.感觉自己好low......这两天想自己抽空写一个canvas画统计图与折现图的插件,所以就去网上学习了下如何封装.....虽然之前看了很多源码,但是感觉就算了解也是野路子..... 什么是封装呢? 我的理解就是 把一个功能单独做成一个组件,就像做饺子,以前做饺子必须自己先用面粉做饺子皮,再做饺子馅,然后再手工包饺子,但是现在人们发明了自动包饺子机器,虽然机器里面的每一步骤和你自己包饺子是一样的,但是

  • 原生js实现文件上传、下载、封装等实例方法

    一 .下载 1.代码 const fileDownloadClick = (obj) => { // 解决兼容 if( document.all ){ obj.click(); } else { let event = document.createEvent("MouseEvents"); event.initEvent('click', true, true); obj.dispatchEvent(event); } } const fileDownload = (res,o

  • 原生js封装的ajax方法示例

    本文实例讲述了原生js封装的ajax方法.分享给大家供大家参考,具体如下: 众所周知,框架之间会有冲突,这是源生js就起到作用了,下面介绍一种源生js封装的ajax请求. function ajax(options) { options = options || {}; options.type = (options.type || "GET").toUpperCase(); options.dataType = options.dataType || "json"

  • JavaScript常用方法和封装详情

    目录 1.字符串相关 1.1 format方法 2.数组相关 1.2 forEach(callback,context) 操作数组中的每一个元素 1.3 indexOf(searchvalue,fromindex) 查询数组中某一个值的下标 2.数组封装 1.字符串相关 1.1 format方法 在各种编程语言中,字符串的format方法是比较常见的,以下通过js扩展的方式,实现了js版本的format方法.目前貌似还没有浏览器支持这一个方法. if(!String.prototype.form

  • 简单理解JavaScript中的封装与继承特性

    JavaScript中的封装 封装简单地说就是让外界只能访问对象的共有变量和函数,隐藏细节和数据. js中有三种方法创建对象,分别为门户大开型.用命名规范区分私有变量.闭包创建真正的私有变量三种. 1.门户大开型,是实现对象的最基础的方法,所有方法与变量都是共有的外界可以访问. var Book = function(name){ if(this.check(name)){ console.log("error"); throw new Error("name null&qu

  • JavaScript模拟实现封装的三种方式及写法区别

    前  言   继承是使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承!  JS中有很多实现继承的方法,今天我给大家介绍其中的三种吧. 1.在 Object类上增加一个扩展方法 //声明一个父类 function Person(name){ this.name=name; this.age=age; this.say=function(){ alert("我叫"+this.name); } } //声明一个子类 function Student()

  • JavaScript多态与封装实例分析

    本文实例讲述了JavaScript多态与封装.分享给大家供大家参考,具体如下: 1.静态语言类型和动态语言类型 编程语言按照数据类型可以分为静态语言类型和动态语言类型两大类. 1) 静态语言类型在编译时就已经确定变量的类型 优点:在编译时就能发现类型不匹配的错误,编译器可以帮助我们提前避免程序在运行期间可能发生的一些错误:在程序中明确规定了数据类型,编译器可以针对这些信息对程序进行优化工作. 缺点:迫使程序员依照契约来编写程序,为每个变量规定数据类型:类型的声明也会增加更多的代码,使得程序员难以

  • JavaScript 类的封装操作示例详解

    本文实例讲述了JavaScript 类的封装操作.分享给大家供大家参考,具体如下: 一,首先,为什么要使用封装? 这是从信息的角度出发的,信息的隐藏是最终的目的,而封装只不过是实现隐藏的一种方法. 这里我们需要明白一点就是:类的定义有如下的三种方式: (第一种)门户大开型方式       (第二种)用命令规范区别私有和公有的方式    (第三种)闭包 现在详细描述一下每一种类的定义方式: 针对第一种,门户大开类型 首先,我们来看一种情况 (1)声明一个简单的类,代码如下 function Per

  • JavaScript实现原型封装轮播图

    本文实例为大家分享了JavaScript实现原型封装轮播图的具体代码,供大家参考,具体内容如下 只要用dom元素调用这个方法,传一个数组进去,里面放的是图片的路径. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-wid

  • 关于C# 类的封装详情

    目录 1.前言 2.实例 1.前言 法存取数据.除此之外,还可以控制数据的存取方式.在面向对象编程中,大多数都是以类作为数据封装的基本单位.类将数据和操作数据的方法结[成一个单位.设计类时,不希望直接存取类中的数据,而是希望通过方法来存取数据.这样就可以到封装数据的目的,方便以后的维护升级,也可以在操作数据时多一层判断. 此外,封装还可以解决数据存取的权限问题,可以使用封装将数据隐藏起来,形成一个封闭的问,然后可以设置哪些数据只能在这个空间中使用,哪些数据可以在空间外部使用.一个类中包含敏感数据

  • Javascript作用域与闭包详情

    目录 1.作用域 2.作用域链 3.词法作用域 5.闭包的应用 6.闭包的缺陷 7.高频闭包面试题 1.作用域 简单来说,作用域是指程序中定义变量的区域,它决定了当前执行代码对变量的访问权限 在ES5中,一般只有两种作用域类型: 全局作用域:全局作用域作为程序的最外层作用域,一直存在 函数作用域:函数作用域只有在函数被定义时才会被创建,包含在父级函数作用域或全局作用域中 说完概念,我们来看下面这段代码: var a = 100 function test(){ var b = a * 2 var

  • Javascript 解构赋值详情

    目录 1.数组解构 2.对象解构 3.不完全解构 4.用解构赋值实现变量交换 1.数组解构 let [a, b, c] = [1,2,3] console.log(a, b, c) // 1 2 3 除了数组,任何可迭代的对象都支持被解构, 例如字符串 let [first, second] = "he" console.log(first, second) // h e 2.对象解构 赋值右侧是对象,左侧是包含在花括号内逗号隔开的变量名 let {a, b, c} = {a:1, b

  • JavaScript动画函数封装详解

    目录 一.动画函数原理 二.动画函数简单封装 三. 动画函数给不同元素记录不同定时器 四.缓动效果原理 五. 动画函数在多个目标值之间移动 六.动画函数添加回调函数 一.动画函数原理 核心原理:通过定时器setInterval() 不断移动盒子位置. 实现步骤: 获得盒子当前位置 让盒子在当前位置加上1个移动距离 利用定时器不断重复这个操作 加一个结束定时器的条件 注意此元素需要添加定位,才能使用element.style.left 如下所示: 给定一个盒子,让其慢慢移动到300px的位置. 代

随机推荐