Al escribir cartas antes del programa de microproyectos pequeños, que tiene una función "City Select", utilizo el <picker-view>
componente, este componente es bastante especial, porque sus value
propiedades se prescriben en un formato de matriz . Por value="[1]"
ejemplo:.
Debido a que no entendía la conversión de tipo de variable JS en ese momento, el autor escribió las siguientes líneas de juicio en el código: (esto es riguroso)
let val_one=typeof this.data.pIndex=="number"?[this.daya.pIndex]:this.data.pIndex
(: ¡Los elementos de acceso en el proyecto son dinámicos!
Esto se debe a que para hacer que los subíndices anteriores sigan al usuario para seleccionar dinámicamente y retroalimentar al wxml en value
la visualización de atributos.
Pero antes de eso, todavía necesitamos hacer una capa de juicio, porque algunas áreas son ciudades o municipios a nivel provincial, y los usuarios deben evitar que los usuarios "falsifiquen", como levantarse o retirarse repentinamente. En este momento, está en el subprograma WeChat. Se informará un error si no se pueden encontrar los datos correspondientes:
let length=placeArray[val_one].sub.length
if(val[0]>=length){
val=[length-1]
}else if(val[0]<0){
val=[0]
}
Más tarde, cuando volví a optimizar el código de este proyecto, descubrí que esto (convertir la matriz en un número cuando se ve obligado a usarlo y convertir el número en una matriz cuando la retroalimentación) es realmente innecesario:
JavaScript parece tener su propia forma "única" de procesar datos, pero el autor aún no ha encontrado información relevante ~~
Cómo juzgar si un valor se puede usar como un subíndice de matriz (índice)
Pero lo que es seguro es: la asignación de claves de atributos enteros es un caso especial de matrices, porque se manejan de manera diferente a las claves que no son enteros. Para determinar si una propiedad se puede usar como índice de una matriz, encontré un pasaje en el documento de especificación ES6:
Solo cuando la corriente
ToString(ToUint32(P))
es igual a P, yToUint32(P)
no igual a2^32-1
, el nombre de la propiedad P es un índice de matriz de cadenas.
Esta operación se puede lograr con 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()
La función convierte el valor dado en un entero de 32 bits sin signo a través del algoritmo descrito en la especificación;isArrayIndex()
En la función, la clave se convierte primero a una estructura uint32 y luego se realizan dos comparaciones (latoString()
última no es igual al número original y es menor que2^32-1
)
Con esta base, podemos basarnos en esta simple imitación del new Array()
comportamiento, lo más importante sobre la longitud de la descripción:
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);
}
});
}
Experimentar: