代码:
var content = Array.prototype.map.call(document.getElementsByTagName("p"), function(e) {
return e.innerHTML;
});
来自p。 367 of JavaScript:The Definitive Guide,第6版。
以下是我认为此代码中发生的事情。
变量content
正在为.map()
返回的NodeList
段落标记分配document.getElementsByTagName("p")
次调用的结果。
可以从.map()
访问Array.prototype
方法,并使用this
将其NodeList
值设置为段落标记.call()
。由于.map()
会应用可以访问item, index, array
的函数,因此e
中的function(e)
是NodeList
的项目。
因此,content
变量最终由.innerHTML
调用Element
Nodes
NodeList
个.innerHTML
调用的结果组成。当前文档中的段落标记。
{{1}}将返回给定HTML元素的文本,如果其中没有其他节点。否则它将返回其中的HTML节点。
这是对的吗?我试过了:
答案 0 :(得分:7)
只是为了真的挑剔:
.innerHTML
将返回给定HTML元素的文本,如果其中没有其他节点。否则它将返回其中的HTML节点。
.innerHTML
始终返回元素的HTML内容,无论它是否包含子元素。当元素的文本不包含子元素时,很难发现元素的文本与元素的HTML之间的差异(但是存在差异!)。
HTML:
<div><</div>
JS:
console.log(document.getElementsByTagName("div")[0].innerHTML); // "<"
console.log(document.getElementsByTagName("div")[0].textContent); // "<"
FWIW,这首先是可能的,因为许多JavaScript方法更喜欢duck typing依赖继承
当我看到一只像鸭子一样走路,像鸭子一样游泳,像鸭子一样呱呱叫的鸟儿时,我称这只鸟为鸭子
正因为如此,map()
很乐意让你map()
任何感觉的对象就像一个数组(即具有.length
属性)。
您也可以使用:
var content = [].map.call(document.getElementsByTagName("p"), function(e) { return e.innerHTML; });
...但前者是首选,因为你不必创建,然后一次性使用数组来访问map()
函数。