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 相关文章推荐
在页面上点击任一链接时触发一个事件的代码
Apr 07 Javascript
javascript让setInteval里的函数参数中的this指向特定的对象
Jan 31 Javascript
JSONP 跨域共享信息
Aug 16 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
Dec 02 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
Dec 05 Javascript
JavaScript中实现异步编程模式的4种方法
Sep 24 Javascript
jquery.serialize() 函数语法及简单实例
Jul 08 Javascript
jQuery弹出层插件popShow(改进版)用法示例
Jan 23 Javascript
Vue组件选项props实例详解
Aug 18 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
Jul 24 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
Jul 25 Javascript
微信小程序vant弹窗组件的实现方式
Feb 21 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与MySQL交互使用详解
2006/10/09 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
php+mysql数据库查询实例
2015/01/21 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
javascript比较文档位置
2008/04/08 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
JavaScript判断IE版本型号
2015/07/27 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
python 读取DICOM头文件的实例
2018/05/07 Python
Python requests库用法实例详解
2018/08/14 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
python中怎么表示空值
2020/06/19 Python
世界上最大的折扣香水店:FragranceNet.com
2016/10/26 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
运动会通讯稿50字
2015/07/20 职场文书
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle