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