Actualización a 2018.10.31
Este error se ha solucionado en iOS 12.1, tenga un buen día ~
Encontré un problema con el estado del valor de Array en el Safari iOS 12 recién lanzado, por ejemplo, un código como este:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<title>iOS 12 Safari bugs</title>
<script type="text/javascript">
window.addEventListener("load", function ()
{
let arr = [1, 2, 3, 4, 5];
alert(arr.join());
document.querySelector("button").addEventListener("click", function ()
{
arr.reverse();
});
});
</script>
</head>
<body>
<button>Array.reverse()</button>
<p style="color:red;">test: click button and refresh page, code:</p>
</body>
</html>
Después de actualizar la página, el valor de la matriz aún se invierte. ¿Es esto un error o una característica del nuevo Safari?
Aquí hay una página de demostración. Intenta usarlo con iOS 12 Safari: https://abelyao.github.io/others/ios12-safari-bug.html
javascript
ios
safari
ios12
abelyao
fuente
fuente
Respuestas:
Definitivamente es un error! Y es un error muy grave.
El error se debe a la optimización de los inicializadores de matriz en los que todos los valores son literales primitivos. Por ejemplo, dada la función:
Todas las referencias de matriz devueltas de las llamadas a
buildArray()
se vincularán a la misma memoria, y algunos métodos comotoString()
tendrán sus resultados en caché. Normalmente, para preservar la coherencia, cualquier operación mutable en dichos arreglos optimizados copiará los datos en un espacio de memoria separado y se vinculará a ellos; Este patrón se llama copy-on-write o CoW para abreviar.El
reverse()
método muta la matriz, por lo que debería desencadenar una copia en escritura. Pero no es así, porque el implementador original (Keith Miller de Apple) perdió elreverse()
caso, a pesar de que había escrito muchos casos de prueba.Este error se informó a Apple el 21 de agosto. La solución aterrizó en el repositorio de WebKit el 27 de agosto y se envió a Safari 12.0.1 y iOS 12.1 el 30 de octubre de 2018.
fuente
Escribí una lib para corregir el error. https://www.npmjs.com/package/array-reverse-polyfill
Este es el código :
fuente
this.length = this.length
) activará Copy On Write, por lo que cambiará la dirección de memoria de la matriz y solucionará el comportamiento dereverse
.Este es un error en el kit web . Aunque esto se resolvió al final, pero aún no se envió con el lanzamiento de iOS GM. Una de las soluciones a este problema:
fuente
Parece que no se almacena en caché si cambia el número de elementos.
Pude evitar esto así.
fuente