JS数组索引检测中的数据类型问题详解


Posted in Javascript onJanuary 11, 2021

之前在写微信小程序项目时,里面有一个“城市选择”的功能,笔者用的是 <picker-view> 组件,这个组件比较特别,因为它的 value 属性规定是 数组 格式的。比如: value="[1]"

因为当时对JS变量类型转换的不了解,笔者在代码中写下了这样的几行判断:(这是严谨的)

let val_one=typeof this.data.pIndex=="number"?[this.daya.pIndex]:this.data.pIndex

(:项目中存取元素是动态的!

上面这是因为要使下标动态跟随用户选择,并反馈到wxml里的 value 属性上展示。

但是在这之前还需要做一层判断 —— 因为有的地区是省级市或者直辖市,而且要防止用户“骚操作”,比如一直上拉或者猛的拉出去,这时候再微信小程序中是会报错找不到对应数据的:

let length=placeArray[val_one].sub.length
if(val[0]>=length){
 val=[length-1]
}else if(val[0]<0){
 val=[0]
}

之后我再回过头优化这个项目代码时发现这里(强制使用时将数组转为数字,反馈时将数字转为数组)其实大可不必:

JS数组索引检测中的数据类型问题详解

JavaScript似乎对数据有自己“独特”的处理方式,但是目前笔者还没找到相关资料~~

如何判断一个值能不能作为数组下标(索引)

但是可以肯定的是:为整数属性键赋值是数组才有的特例,因为它们与非整数键的处理方式不同。要判断一个属性是否能作为数组的索引,笔者找到了ES6规范文档中的一段话:

当前仅当 ToString(ToUint32(P)) 等于P,并且 ToUint32(P) 不等于 2^32-1 时,字符串属性名称P才是一个数组索引。

这个操作用JS可以这样实现:

function toUint32(value){
	return Math.floor(Math.abs(Number(value))) % Math.pow(2,32);
}
function isArrayIndex(key){
	let numericKey=toUint32(key);
	return String(numericKey) == key && numericKey < (Math.pow(2,32)-1);
}

toUint32() 函数通过规范中描述的算法将给定的值转换为无符号32位整数;isArrayIndex() 函数中先将键转换为uint32结构,然后进行两次比较(toString()后等不等于原数并且是否小于 2^32-1

有了这个基础,我们就可以基于此去简单模仿一下 new Array() 的行为 —— 其中最重要的还是关于length的描述:

JS数组索引检测中的数据类型问题详解

function createArray(length=0){
	return new Proxy({ length },{
		set(trapTarget,key,value){
			let currentLength=Reflect.get(trapTarget,"length");
			if(isArrayIndex(key)){
				let numericKey=Number(key);
				if(numericKey >= currentLength){
					Reflect.set(trapTarget,"length",numericKey+1);
				}
			}else if(key === "length"){
				if(value < currentLength){
					for(let index=currentLength-1;index >= value;index--){
						Reflect.deleteProperty(trapTarget,index);
					}
				}
			}
			// 无论key是什么类型都要执行这段代码
			return Reflect.set(trapTarget,key,value);
		}
	});
}

实验一下:

JS数组索引检测中的数据类型问题详解

总结

到此这篇关于JS数组索引检测中的数据类型问题详解的文章就介绍到这了,更多相关JS数组索引检测的数据类型内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
基于jquery的监控数据是否发生改变
Apr 11 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
Dec 23 Javascript
返回上一页并自动刷新的JavaScript代码
Feb 19 Javascript
通过JS来动态的修改url,实现对url的增删查改
Sep 01 Javascript
ECMAScript6中Set/WeakSet详解
Jun 12 Javascript
javascript检查浏览器是否已经启用XX功能
Jul 10 Javascript
Javascript 计算字符串在localStorage中所占字节数
Oct 21 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
AngularJS基础 ng-paste 指令简单示例
Aug 02 Javascript
Javascript 一些需要注意的细节(必看篇)
Jul 08 Javascript
JavaScript实现旋转木马轮播图
Mar 16 Javascript
Vue路由权限控制解析
Nov 09 Javascript
了不起的11个JavaScript代码重构最佳实践小结
Jan 11 #Javascript
js删除对象中的某一个字段的方法实现
Jan 11 #Javascript
jQuery实现购物车全功能
Jan 11 #jQuery
jQuery实现手风琴特效
Jan 11 #jQuery
iview实现动态表单和自定义验证时间段重叠
Jan 10 #Javascript
JavaScript canvas实现文字时钟
Jan 10 #Javascript
JS代码实现页面切换效果
Jan 10 #Javascript
You might like
解析PHP中intval()等int转换时的意外异常情况
2013/06/21 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
js+css在交互上的应用
2010/07/18 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
页面加载完成后再执行JS的jquery写法以及区别说明
2014/02/22 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
Angularjs的ng-repeat中去除重复数据的方法
2016/08/05 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
python添加模块搜索路径方法
2017/09/11 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
python 解压pkl文件的方法
2018/10/25 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
美国老牌主机服务商:iPage
2016/07/22 全球购物
西班牙购买行李箱和背包网站:Maletas Greenwich
2019/10/08 全球购物
优秀交警事迹材料
2014/01/26 职场文书
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
农林环境专业求职信
2014/03/13 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
python开发制作好看的时钟效果
2022/05/02 Python