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 27 Javascript
对象特征检测法判断浏览器对javascript对象的支持
Jul 25 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
Oct 29 Javascript
2014 年最热门的21款JavaScript框架推荐
Dec 25 Javascript
JavaScript实现同时调用多个函数的方法
Nov 09 Javascript
Bootstrap每天必学之标签与徽章
Nov 27 Javascript
基于JavaScript实现瀑布流布局(二)
Jan 26 Javascript
jQuery实现简单弹窗遮罩效果
Feb 27 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
Oct 19 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
Nov 14 Javascript
JS处理一些简单计算题
Feb 24 Javascript
vue.js watch经常失效的场景与解决方案
Jan 07 Vue.js
了不起的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中全局变量global的使用演示代码
2011/05/18 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
php集成开发环境详解
2019/09/24 PHP
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
javascript生成大小写字母
2015/07/03 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
基于Vue单文件组件详解
2017/09/15 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
python实现堆栈与队列的方法
2015/01/15 Python
python win32 简单操作方法
2017/05/25 Python
Python3 中作为一等对象的函数解析
2019/12/11 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
Banggood官网:面向全球客户的综合商城
2017/04/19 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
会计与审计专业大专生求职信
2013/10/03 职场文书
劳资员岗位职责
2013/11/11 职场文书
外贸销售员求职的自我评价
2013/11/23 职场文书
岗位工作说明书
2014/07/29 职场文书
军训通讯稿范文
2015/07/18 职场文书
2016党校学习心得体会
2016/01/07 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
承诺书应该怎么写?
2019/09/10 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
公历12个月名称的由来
2022/04/12 杂记