I understand that both of these will insert html into an element.
What are the differences between these 2 methods though?
String:
$(\"div\").app
Is it just that you can do stuff like this?
$("div").append($("<h1></h1>").html("Header"));
Exactly
Doing it this way creates for you a jQuery object which can further be manipulated with functions like append, css, addClass
$("div").append($("<h1></h1>").html("Header")
.addClass("someClass")
.css("color", "gree"));
Or if you don't want to do further manipulation like this, then by all means pass it just a string, and you'll get the same result.
In your example there's no practical difference. The function accepts strings because you might want to add a new element which doesn't have a jQuery object yet, and it accepts jQuery objects because you might want to append an existing element or a complex object that doesn't have a string representation.