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程序中美元符号$是什么
Jun 05 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
Jun 15 Javascript
21个值得收藏的Javascript技巧
Feb 04 Javascript
在Firefox下js select标签点击无法弹出
Mar 06 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
Apr 30 Javascript
js实现checkbox全选和反选示例
May 01 Javascript
浅谈JavaScript 的执行顺序
Aug 07 Javascript
canvas 弹幕效果(实例分享)
Jan 11 Javascript
小程序云开发教程如何使用云函数实现点赞功能
May 18 Javascript
react结合bootstrap实现评论功能
May 30 Javascript
详解vue中v-on事件监听指令的基本用法
Jul 22 Javascript
Vue select 绑定动态变量的实例讲解
Oct 22 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 选项及相关信息函数库
2006/12/04 PHP
javascript,php获取函数参数对象的代码
2011/02/03 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
用jquery仿做发微博功能示例
2014/04/18 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
jquery简单插件制作(fn.extend)完整实例
2016/05/24 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
JS基于面向对象实现的拖拽功能示例
2016/12/20 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
Javascript Promise用法详解
2018/05/10 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
javascript使用substring实现的展开与收缩文字功能示例
2019/06/17 Javascript
深入解析koa之中间件流程控制
2019/06/17 Javascript
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
python list转矩阵的实例讲解
2018/08/04 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
创先争优活动方案
2014/02/12 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
《所见》教学反思
2016/02/23 职场文书
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android