简体   繁体   中英

JavaScript for/in loop with unexpected output

I'm not sure why this outputs undefined for the property names of the document object. I think it has something to do with the variable expression myArray[i++] . I could make this a simple primitive variable and I'll get all the property names, but I would like all the property names saved into an array. Thank you for your help in advance!!

var myArray = [];
var i = 0;
for (myArray[i++] in document) {
document.write(myArray[i] + "</br>");
}

It doesn't work because you increment i after setting myArray[i] by doing myArray[i++] (post increment).

This would work, although I'm not sure why you'd need to do it.

var myArray = [];
var i = 0;
for (myArray[i] in document) {
    console.log(myArray[i++] + "</br>");
}

That is happening because you are always look one element further in the array than you've defined, since you post-increment i . You could pre-increment instead:

var myArray = [];
var i = -1;
for (myArray[++i] in document) {
    document.write(myArray[i] + "</br>");
}

JSFiddle

"I would like all the property names saved into an array. "

You could do:

var names = Object.getOwnPropertyNames(document);

The reason for Object.getOwnPropertyNames() is that it includes non-enumerable properties, whereas for-in will skip them.

But some properties are inherited, so you'd need to do the same on all objects in the prototype chain if that's what you want.

var obj = document;
var names = [];

do {
    names.push.apply(names, Object.getOwnPropertyNames(obj));
} while(obj = Object.getPrototypeOf(obj));

Result in Firefox:

["jQuery17104169501299363202", "location", "addEventListener", "removeEventListener", "dispatchEvent", "getElementsByName", "getItems", "open", "close", "write", "writeln", "execCommand", "queryCommandEnabled", "queryCommandIndeterm", "queryCommandState", "queryCommandSupported", "queryCommandValue", "clear", "getSelection", "captureEvents", "releaseEvents", "routeEvent", "domain", "cookie", "body", "head", "images", "embeds", "plugins", "links", "forms", "scripts", "designMode", "fgColor", "linkColor", "vlinkColor", "alinkColor", "bgColor", "anchors", "applets", "onreadystatechange", "onmouseenter", "onmouseleave", "getElementsByTagName", "getElementsByTagNameNS", "getElementsByClassName", "getElementById", "createElement", "createElementNS", "createDocumentFragment", "createTextNode", "createComment", "createProcessingInstruction", "importNode", "adoptNode", "createEvent", "createRange", "createNodeIterator", "createTreeWalker", "createCDATASection", "createAttribute", "createAttribu teNS", "hasFocus", "releaseCapture", "mozSetImageElement", "mozCancelFullScreen", "mozExitPointerLock", "enableStyleSheetsForSet", "elementFromPoint", "querySelector", "querySelectorAll", "getAnonymousNodes", "getAnonymousElementByAttribute", "addBinding", "removeBinding", "getBindingParent", "loadBindingDocument", "createExpression", "createNSResolver", "evaluate", "implementation", "URL", "documentURI", "compatMode", "characterSet", "contentType", "doctype", "documentElement", "inputEncoding", "referrer", "lastModified", "readyState", "title", "dir", "defaultView", "activeElement", "currentScript", "mozFullScreenEnabled", "mozFullScreenElement", "mozFullScreen", "mozPointerLockElement", "hidden", "mozHidden", "visibilityState", "mozVisibilityState", "styleSheets", "selectedStyleSheetSet", "lastStyleSheetSet", "preferredStyleSheetSet", "styleSheetSets", "hasChildNodes", "insertBefore", "appendChild", "replaceChild", "removeChild", "normalize", "cloneNode", "isEqualNode", "compareDocum entPosition", "contains", "lookupPrefix", "lookupNamespaceURI", "isDefaultNamespace", "isSupported", "hasAttributes", "setUserData", "getUserData", "nodeType", "nodeName", "baseURI", "ownerDocument", "parentNode", "parentElement", "childNodes", "firstChild", "lastChild", "previousSibling", "nextSibling", "nodeValue", "textContent", "attributes", "namespaceURI", "prefix", "localName", " lookupGetter ", " lookupSetter ", " defineGetter ", " defineSetter ", "QueryInterface", "mozSyntheticDocument", "caretPositionFromPoint", "ELEMENT_NODE", "ATTRIBUTE_NODE", "TEXT_NODE", "CDATA_SECTION_NODE", "ENTITY_REFERENCE_NODE", "ENTITY_NODE", "PROCESSING_INSTRUCTION_NODE", "COMMENT_NODE", "DOCUMENT_NODE", "DOCUMENT_TYPE_NODE", "DOCUMENT_FRAGMENT_NODE", "NOTATION_NODE", "DOCUMENT_POSITION_DISCONNECTED", "DOCUMENT_POSITION_PRECEDING", "DOCUMENT_POSITION_FOLLOWING", "DOCUMENT_POSITION_CONTAINS", "DOCUMENT_POSITION_CONTAINED_BY", "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", "location", "onabort", "onblur ", "oncanplay", "oncanplaythrough", "onchange", "onclick", "oncontextmenu", "ondblclick", "ondrag", "ondragend", "ondragenter", "ondragleave", "ondragover", "ondragstart", "ondrop", "ondurationchange", "onemptied", "onended", "onerror", "onfocus", "oninput", "oninvalid", "onkeydown", "onkeypress", "onkeyup", "onload", "onloadeddata", "onloadedmetadata", "onloadstart", "onmousedown", "onmousemove", "onmouseout", "onmouseover", "onmouseup", "onmozfullscreenchange", "onmozfullscreenerror", "onmozpointerlockchange", "onmozpointerlockerror", "onpause", "onplay", "onplaying", "onprogress", "onratechange", "onreset", "onscroll", "onseeked", "onseeking", "onselect", "onshow", "onstalled", "onsubmit", "onsuspend", "ontimeupdate", "onvolumechange", "onwaiting", "onwheel", "oncopy", "oncut", "onpaste", "onbeforescriptexecute", "onafterscriptexecute", "getElementsByTagName", "getElementsByTagNameNS", "getElementsByClassName", "getElementById", "createElement", "createElementNS", "createDocumentFra gment", "createTextNode", "createComment", "createProcessingInstruction", "importNode", "adoptNode", "createEvent", "createRange", "createNodeIterator", "createTreeWalker", "createCDATASection", "createAttribute", "createAttributeNS", "hasFocus", "releaseCapture", "mozSetImageElement", "mozCancelFullScreen", "mozExitPointerLock", "enableStyleSheetsForSet", "elementFromPoint", "querySelector", "querySelectorAll", "getAnonymousNodes", "getAnonymousElementByAttribute", "addBinding", "removeBinding", "getBindingParent", "loadBindingDocument", "createExpression", "createNSResolver", "evaluate", "implementation", "URL", "documentURI", "compatMode", "characterSet", "contentType", "doctype", "documentElement", "inputEncoding", "referrer", "lastModified", "readyState", "title", "dir", "defaultView", "activeElement", "onabort", "onblur", "oncanplay", "oncanplaythrough", "onchange", "onclick", "oncontextmenu", "ondblclick", "ondrag", "ondragend", "ondragenter", "ondragleave", "ondragover", "ondra gstart", "ondrop", "ondurationchange", "onemptied", "onended", "onerror", "onfocus", "oninput", "oninvalid", "onkeydown", "onkeypress", "onkeyup", "onload", "onloadeddata", "onloadedmetadata", "onloadstart", "onmousedown", "onmousemove", "onmouseout", "onmouseover", "onmouseup", "onpause", "onplay", "onplaying", "onprogress", "onratechange", "onreset", "onscroll", "onseeked", "onseeking", "onselect", "onshow", "onstalled", "onsubmit", "onsuspend", "ontimeupdate", "onvolumechange", "onwaiting", "onreadystatechange", "onmouseenter", "onmouseleave", "onmozfullscreenchange", "onmozfullscreenerror", "onmozpointerlockchange", "onmozpointerlockerror", "onwheel", "oncopy", "oncut", "onpaste", "onbeforescriptexecute", "onafterscriptexecute", "currentScript", "mozFullScreenEnabled", "mozFullScreenElement", "mozFullScreen", "mozPointerLockElement", "hidden", "mozHidden", "visibilityState", "mozVisibilityState", "styleSheets", "selectedStyleSheetSet", "lastStyleSheetSet", "preferredStyleSheetSet", "styleSheetSets", "constructor", "hasChildNodes", "insertBefore", "appendChild", "replaceChild", "removeChild", "normalize", "cloneNode", "isEqualNode", "compareDocumentPosition", "contains", "lookupPrefix", "lookupNamespaceURI", "isDefaultNamespace", "isSupported", "hasAttributes", "setUserData", "getUserData", "nodeType", "nodeName", "baseURI", "ownerDocument", "parentNode", "parentElement", "childNodes", "firstChild", "lastChild", "previousSibling", "nextSibling", "nodeValue", "textContent", "attributes", "namespaceURI", "prefix", "localName", "ELEMENT_NODE", "ATTRIBUTE_NODE", "TEXT_NODE", "CDATA_SECTION_NODE", "ENTITY_REFERENCE_NODE", "ENTITY_NODE", "PROCESSING_INSTRUCTION_NODE", "COMMENT_NODE", "DOCUMENT_NODE", "DOCUMENT_TYPE_NODE", "DOCUMENT_FRAGMENT_NODE", "NOTATION_NODE", "DOCUMENT_POSITION_DISCONNECTED", "DOCUMENT_POSITION_PRECEDING", "DOCUMENT_POSITION_FOLLOWING", "DOCUMENT_POSITION_CONTAINS", "DOCUMENT_POSITION_CONTAINED_BY", "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", "co nstructor", "addEventListener", "removeEventListener", "dispatchEvent", "constructor", "constructor", "toSource", "toString", "toLocaleString", "valueOf", "watch", "unwatch", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", " defineGetter ", " defineSetter ", " lookupGetter ", " lookupSetter "]

I think that you may want to use a loop like the one below:

for(int i = 0; i < myArray.length; i++){
  document.write(myArray[i] + "</br>");
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM