兼容低版本JS的Array.map方法

前几天去别的公司面试遇到个这样的问题,兼容IE7下的Array.map方法,一脸蒙蔽。后面回来查了下资料发现。Array.map方法是ECMA-262 标准中新添加的方法,在低版本的JS中是木有的。

看如下兼容性实现方式:

实现思路:1,先验证this对象,再将this用Object封装成obj。

2,获取封装后的obj的属性长度

3,验证是否有回调方法

4,根据obj的属性长度lengh生成新的数组,new Array(length)。

5,遍历obj对象,获取mapKey,mapValue,并将返回值添加到新数组arr中。

6,将整个新的数组返回。

代码实现:

(function(){

if(!Array.prototype.map) {

Array.prototype.map = function(callback, args) {

var arg , arr, index ;

if(this == null) {

throw new TypeError(‘this is null or not defined‘);

}

var obj = new Object(this);

var len = obj >>> 0;  //获取obj的长度

if(Object.prototype.toString.call(callback) != ‘[object Function]‘) {

throw new TypeError(callback + ‘is not a function‘);

}

if(args) {

arg = args;

}

// 创建新数组,长度为原数组O长度len

arr = new Array(len);

index = 0;

while(index < len) {

var kValue, mappedValue;

if(index in obj) {

//kValue为索引k对应的值.

kValue = obj[index];

// 执行callback,this指向arr,参数有三个.分别是kValue:值,index:索引,obj:原数组.

mappedValue = callback.call(arg, kValue, index, obj);

// 返回值添加到新数组arr中.

arr[index] = mappedValue;

}

index ++;

}

return arr;

}

}

})()

时间: 2024-08-12 16:56:33

兼容低版本JS的Array.map方法的相关文章

兼容低版本浏览器的getElementByClassName方法

/*兼容低版本浏览器的getElementByClassName方法*/ function getElementsByClassName(root,className){ if(root.getElementsByClassName){ return root.getElementsByClassName(className); }else{ var elements=root.getElementsByTagName(); var result=[]; for(var i=0,element;

android api实现高斯模糊,且兼容低版本

一.利用android api实现高斯模糊 关于高斯模糊网上已经有很多不错的文章介绍了,在这里就不重复了.先来看一个效果 效果已经看到了,就来看看怎么实现的吧.首先是实现高斯模糊的核心代码 <span style="white-space:pre"> </span>public static Bitmap blurBitmap(Bitmap bitmap, Context context) { // 用需要创建高斯模糊bitmap创建一个空的bitmap Bit

兼容低版本的array_column

//兼容低版本的array_column public function array_column($input, $columnKey, $indexKey = NULL) { $columnKeyIsNumber = (is_numeric($columnKey)) ? TRUE : FALSE; $indexKeyIsNull = (is_null($indexKey)) ? TRUE : FALSE; $indexKeyIsNumber = (is_numeric($indexKey))

模拟实现兼容低版本IE浏览器的原生bind()函数功能

模拟实现兼容低版本IE浏览器的原生bind()函数功能: 代码如下: if(!Function.prototype.bind){   Function.prototype.bind=function(oThis){     if (typeof this !== 'function'){       throw new TypeError('调用者不是当前函数对象');     }       var aArgs = Array.prototype.slice.call(arguments, 1

GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本系统解决方案

项目开发中需要使用GridView批处理操作,多项选择. 但是GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本. 找解决方案,查看android sdk提供的demo里介绍的GridView多项选择的方法 public class Grid3 extends Activity { GridView mGrid; @Override protected void onCreate(Bundle savedInstan

兼容低版本IE和非IE浏览器的事件绑定函数

我们知道为元素绑定事件可以使用addEventListener方法,但是低版本IE下是没有这个方法,这时我们就要使用attachEvent方法去兼容,可以写成下面这样: 1 /* 2 兼容低版本IE,ele为需要绑定事件的元素, 3 eventName为事件名(保持addEventListener语法,去掉on),fun为事件响应函数 4 */ 5 6 function addEvent(ele,eventName,fun){ 7 if(ele.addEventListener){ 8 ele.

[转]AppCompat 22.1,Goole暴走,MD全面兼容低版本

AppCompat 22.1,Goole暴走,MD全面兼容低版本 分类: Android2015-04-24 09:48 1354人阅读 评论(0) 收藏 举报 android 目录(?)[+] 武侠相关的文学作品中常用“四十岁后不滞于物,草木竹石均可为剑.自此精进,渐入无剑胜有剑之境.”形容一个人的武功技艺高超,已臻化境.而我们IT工程师自身的技艺水平到达一定程度后,也会处于这种“无码胜有码”的境界.但这是什么意思呢?是说我们从此不再写代码,每天躺在床上和白花花的天花板无言对望了吗? 不是的.

兼容低版本IE浏览器的边框阴影效果

兼容低版本IE浏览器的边框阴影效果:使用box-show属性可以实现边框阴影效果,但是IE8和IE8以下浏览器不支持此属性,不过可以通过以下方式实现,当然实现全兼容的方式有多种,下面是一种比较简陋的方式,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www

a标签内容在div中垂直居中,不兼容低版本浏览器

<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title></title></head> <style>.box{width:100px;height:200px;background:orange;border:2px solid #ccc;display: table;}.box a{dis