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 相关文章推荐
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
Jul 09 Javascript
JavaScript插件化开发教程(五)
Feb 01 Javascript
jQuery+ajax读取并解析XML文件的方法
Sep 09 Javascript
js 动态生成json对象、时时更新json对象的方法
Dec 02 Javascript
利用vue写todolist单页应用
Dec 15 Javascript
详解Angular4中路由Router类的跳转navigate
Jun 09 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
Jan 30 Javascript
React通过redux-persist持久化数据存储的方法示例
Feb 14 Javascript
如何解决日期函数new Date()浏览器兼容性问题
Sep 11 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
Sep 21 Javascript
Javascript ParentNode和ChildNode接口原理解析
Mar 16 Javascript
详解vue组件之间的通信
Aug 30 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 foreach循环使用详解与实例代码
2010/05/08 PHP
解析php中die(),exit(),return的区别
2013/06/20 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
jQuery的链式调用浅析
2010/12/03 Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
微信小程序以7天为周期连续签到7天功能效果的示例代码
2020/08/20 Javascript
Vue3 实现双盒子定位Overlay的示例
2020/12/22 Vue.js
对python3 urllib包与http包的使用详解
2018/05/10 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
Python学习笔记之列表推导式实例分析
2019/08/13 Python
Python编写打字训练小程序
2019/09/26 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
2020/02/11 Python
pandas分组聚合详解
2020/04/10 Python
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
为什么需要版本控制
2016/10/28 面试题
机电专业大学生求职信
2013/10/04 职场文书
网络教育毕业生自我鉴定
2013/10/10 职场文书
日化店促销方案
2014/03/26 职场文书
采购部长岗位职责
2014/06/13 职场文书
中职生自荐信范文
2014/06/15 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
太空授课观后感
2015/06/17 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB
使用MybatisPlus打印sql语句
2022/04/22 SQL Server
讲解Python实例练习逆序输出字符串
2022/05/06 Python