js_escape('\n') gives only n and it should give \n instead.
The problem is that first stripslashes and then addslashes are applied to the string, which doesn't guarantee that the string will remain the same.
Also, I still don't get why js_escape has to do something more than replacing ' with \', " with \" and newline characters with \n. Isn't its only purpose to make sure that the given php string is processed without errors by javascript? Why do we use wp_specialchars? Why do we put html entities, when we aren't sure the javascript code expects those?