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 自制滚动条的小例子
Mar 16 Javascript
js简单实现HTML标签Select联动带跳转
Oct 23 Javascript
jQuery知识点整理
Jan 30 Javascript
简单学习JavaScript中的for语句循环结构
Nov 10 Javascript
JavaScript类型系统之基本数据类型与包装类型
Jan 06 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
Apr 17 Javascript
详解angularjs结合pagination插件实现分页功能
Feb 10 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
Jul 18 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
Dec 11 Javascript
JavaScript中的ES6 Proxy的具体使用
Jun 16 Javascript
微信小程序实现日期格式化和倒计时
Nov 01 Javascript
js实现滚动条自动滚动
Dec 13 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
JS使用栈判断给定字符串是否是回文算法示例
2019/03/04 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
python 使用get_argument获取url query参数
2017/04/28 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
python实现dijkstra最短路由算法
2019/01/17 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
利用Python计算KS的实例详解
2020/03/03 Python
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
体育教育个人自荐信范文
2013/12/01 职场文书
毕业晚会主持词
2014/03/24 职场文书
读书伴我成长演讲稿
2014/05/07 职场文书
先进班组材料范文
2014/12/25 职场文书
单位实习鉴定评语
2015/01/04 职场文书
医院合作意向书范本
2015/05/08 职场文书
四年级作文之植物
2019/09/20 职场文书
世界各国短波电台对东亚播送时间频率表(SW)
2021/06/28 无线电