string1 and string2 are the same, string1 uses a compact syntax available if you want only to express type. Neither property is ever assigned any value, so they are not visible as properties (hasOwnProperty is false).
string3 is the same as 1 and 2, except for being initialized to '' at create-time. Because it's assigned a value, it's now visible as an own-property.
string4 will reflectToAttribute if it is assigned a value, but since it never is assigned a value, it never reflects and no attribute is created. Because the property has a side-effect (reflection) it's prepared as accessor pair (getter/setter) on the element _prototype_ so it can be observed. For this reason, it's not an own-property.
string5 is just like string4, except it's assigned the value '' at create-time, and consequently reflects that value to it's attribute.
Also, fwiw, in all cases `type: String` can be omitted, since this is the default.
Much of this behavior is explained by the simple principle that Polymer strives to do as little work as possible, to optimize performance.
HTH,
Scott