JavaScript中数组的使用还是比较广发的,尤其与服务器交互的时候,返回结果多半有数组集合,本文探讨JavaScript中数组使用的一些注意事项及踩过的坑汇总。

1、认识数组

JavaScript中数组本质上是对象Object,那么数组0, 1, 2索引位置可以理解为对象的属性,看下述代码。

var a = [10,11,12];
a.name = "array-a";
for(var i in a) {console.log("i + 1", i + 1);
}
console.log(a,a.name,a.length)
// 输出结果
// i + 1 01
// i + 1 11
// i + 1 21
// i + 1 name1
// Array(3) [ 10, 11, 12 ] array-a 3

数组a可以理解为a = {‘0’:10,‘1’:11,‘2’:12,‘name’:‘array-a’,length等其它数组特有属性和方法}

2、数组类型判断问题

数组类型用typeof运算符返回的是object,因此不能用typeof运算符来判断数组类型,请大家使用instanceof或Object.prototype.toString或Array.isArray,参考代码:

function arrType(arr) {console.log("typeof: ", typeof arr);    //objectconsole.log("instanceof Array: ", arr instanceof Array);  //trueconsole.log("arguments instanceof Array: ", arguments instanceof Array);    //类数组, falseconsole.log("object.prototype.toString: ", Object.prototype.toString.call(arr));  //[object Array]
}
var a = [10,11,12];
arrType(a);

Array.isArray是ES5的数组方法,部分浏览器存在兼容性问题,需要大家取舍。

3、数组可变长度(length)问题

  length代表数组中元素个数,数组额外附加属性(如:a.name 不影响length)。length可写,可以通过修改length来改变数组的长度。看代码:

 var a = [10,11,12];a[1000] = 1010;a.name = "array-a";var count = 0;for(var i in a) {count++;}console.log("for in loop count: ", count)        //5console.log("a legnth: ", a.length);           //1001//改变length,length后面的元素会被删除a.length = 2var count = 0;for(var i in a) {count++;} console.log("for in loop count: ", count)     //3console.log("a legnth: ", a.length);           //2

代码说明:
1)a = [10,11,12], 可理解为对象{‘0’:10, ‘1’:11, ‘2’:12}, length = 3
2)a.name = “array-a”, {‘0’:10, ‘1’:11, ‘2’:12, name:‘array-a’}, length = 3
3)a[1000] = 1010, {‘0’:10, ‘1’:11, ‘2’:12, ‘1000’: 1010, name:‘array-a’}, length = 1001,count = 5
4)a.length = 2, {‘0’:10, ‘1’:11, name:‘array-a’}, length = 2,count = 3

4、数组遍历的坑

通常数组遍历有3个方法:
1)for(var i in arr)
2)for(var i = 0, l = arr.length; i<l; i++)
3)arr.forEach,ES5中数组方法,存在浏览器兼容性,本文不讨论
看个案例:

var a = [10,11,12];
a[1000] = 1010;
a.name = "array-a";
for(var i in a) {console.log(i+1, '=>', a[i]);
}
// out-put
// 01 => 10
// 11 => 11
// 21 => 12
// 10001 => 1010
// name1 => array-afor(var i = 0, l = a.length; i<l; i++) {if(a[i] !== undefined)console.log(i+1, '=>', a[i]);
}
// out-put
// 1 => 10
// 2 => 11
// 3 => 12
// 1001 => 1010

代码说明:
1)for in循环,循环了5次,i变量为字符串,所以输出01=>10,而且遍历出了不想要的元素name
2)length遍历,循环了1001次,忽略name元素,较for in循环多了很多次空循环

注意事项:
推荐使用for(var i = 0, l = a.length; i<l; i++)遍历,除代码量稍大,稀疏数组存在空循环问题外,其它没毛病。

5、排序注意事项

JavaScript中数组默认按ascii码先后顺序排序并且影响原数组,因此当数组中元素按数值等其它类型排序的话需要特殊处理,看个案例:

var a = "MMMMJDJDEERERERURUEUROIKKMNJYYTIIIPPKKIUYYYADA".split("");
console.log(a.sort())
var b = ["2","1","3","4","8","10","5","5","6","7","3","9"];
console.log(b.sort());
// 升序,v1-0做了个隐形数据类型转换,字符串转数字
b.sort(function(v1,v2){return v1 - 0 > v2 - 0 ? 1 : -1;
});
console.log(b);
// 降序
b.sort(function(v1,v2){return v1 - 0 < v2 - 0 ? 1 : -1;
});
console.log(b);
//output
//A,A,D,D,D,E,E,E,E,E,I,I,I,I,I,J,J,J,K,K,K,K,M,M,M,M,M,N,O,P,P,R,R,R,R,R,T,U,U,U,U,Y,Y,Y,Y,Y
//1,10,2,3,3,4,5,5,6,7,8,9
//1,2,3,3,4,5,5,6,7,8,9,10
//10,9,8,7,6,5,5,4,3,3,2,1

代码说明:
1)默认按ascii码先后顺序排序,数组b默认排序10在2前面;
2)修改默认排序行为,需要自定义排序规则函数fn(v1,v2),返回 >0 =0 <0 3个值
3)v1-0做了个隐形数据类型转换,字符串转数字,具体参考 “谈谈JavaScript的算数运算、二进制浮点数舍入误差及比较、类型转换和变量声明提前问题 ”

排序规则函数说明: fn(a,b),切记返回大于零、等于零或小于零3个值

  • 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
  • 若 a 等于 b,则返回 0。
  • 若 a 大于 b,则返回一个大于 0 的值。

谈谈JavaScript数组使用注意事项及踩过的坑,排序问题,for in遍历问题等相关推荐

  1. 谈谈陌陌争霸在数据库方面踩过的坑

    为什么大部分网络服务都需要一个数据库在后台支撑整个系统? 这通常是因为大部分系统的一个运行周期都很短,对于传统的网站服务来说,从收到一个 HTTP 请求开始,到终端用户收到这个请求的结果为止,就是一个 ...

  2. 谈谈陌陌争霸在数据库方面踩过的坑(排行榜篇)

    为什么大部分网络服务都需要一个数据库在后台支撑整个系统? 这通常是因为大部分系统的一个运行周期都很短,对于传统的网站服务来说,从收到一个 HTTP 请求开始,到终端用户收到这个请求的结果为止,就是一个 ...

  3. 这是如何更好地利用JavaScript数组的方法

    by pacdiv 由pacdiv 这是如何更好地利用JavaScript数组的方法 (Here's how you can make better use of JavaScript arrays) ...

  4. splice方法_[7000字]JavaScript数组所有方法基础总结

    基础决定一个人的上限,很多时候我们感叹别人在实现一个功能时使用方法的精妙,并且反思,为什么别人想的出来自己却想不出来?我觉得主要是因为对于基础的掌握上有很大的差距.本文总结数组的所有方法的基础使用,希 ...

  5. 也谈谈Javascript中的几个怪异特性(上)

    2019独角兽企业重金招聘Python工程师标准>>> Andy Croxall在Ten Oddities And Secrets About JavaScript罗列了他认为的10 ...

  6. 【iOS内购支付】Uniapp拉起苹果内购支付注意事项、实现步骤以及踩过的坑(手把手教程)

    前言 Hello!又是很长时间没有写博客了,因为最近又开始从事新项目,也是第一次接触关于uniapp开发原生IOS应用的项目,在这里做一些关于我在项目中使用苹果内购支付所实现的方式以及要注意的事项,希 ...

  7. [JavaScript] JavaScript数组挖掘,不只是讲数组哟(2)

    课程来源:后盾人 上一篇的内容:[JavaScript] JavaScript数组挖掘,不只是讲数组哟 数组引用类型分析,多维数组,用Array.of为数组创建细节,类型检测与转换,在一个数组后面加一 ...

  8. Javascript 数组

    Javascript 数组 Javascript中的Array可以包含任意数据类型,并通过索引来访问每个元素. 要取得Array的长度,直接访问length属性: var arr = [1, 2, 3 ...

  9. JavaScript 数组拼接打印_JavaScript 数组方法

    JavaScript 数组方法 JS 数组 JS 数组排序 JavaScript 数组的力量隐藏在数组方法中. 把数组转换为字符串 JavaScript 方法 toString() 把数组转换为数组值 ...

最新文章

  1. 【LCT】弹飞绵羊(luogu 3203/金牌导航 LCT-2)
  2. mysql数据库改成支持中文_修改Mysql编码支持中文
  3. Android8.0及以上系统 WiFi热点 版本适配
  4. Netty工作笔记0046---TaskQueue自定义任务
  5. mount: 未知的文件系统类型“vboxsf”_好程序员云计算学习路线教程大纲课件:Mount 挂载详解...
  6. Redis 可视化工具 Redis Desktop Manager 和 treeNMS 的使用
  7. Openv 线性插值
  8. Java初级程序员面试中应该如何准备?一般公司对Java开发的要求有哪些?
  9. seaweedfs java_seaweedfs-java-client
  10. 松翰单片机之外设的使用
  11. 滴滴打车CTO张博:生死战役,技术和时间赛跑
  12. 鸿图之下服务器维护10月25,鸿图之下11月25日维护更新公告
  13. 如何制作一款灵活的工单管理系统【推荐】
  14. Ayla CEO大卫.弗里德曼:你应该了解的五种物联网大数据!
  15. 阿里云免费ssl证书(PFX格式证书)安装
  16. 从视网膜到视皮层——视觉系统知多少
  17. stk6.1安装方法
  18. 中宣部防沉迷实名认证系统对接实例-JAVA版
  19. 古风古典雅致通用PPT模板
  20. 艾宾浩斯c语言编程,艾宾浩斯记忆法

热门文章

  1. 神龙三代,集大成而来!
  2. SAP HANA原生备份与恢复
  3. python3安装pil报错
  4. 拼多多服务器端研发 Java面试经验大全
  5. FT232R USB UART无法识别
  6. 大一学生HTML5期末大作业——基于HTML+CSS制作传统节日美食13页(美食网站设计与实现)
  7. uniapp实现自定义table表格选中及封装分页pagination组件
  8. Python 实现 并行for循环
  9. 智能家居的云海,三翼鸟能飞多高?
  10. 思科模拟器模拟计算机局域网络