cloneNode 深度克隆节点
function cloneNode(node) {
if (node.nodeType == document.TEXT_NODE) {
return document.createTextNode(node.nodeValue)
} else if (node.nodeType == document.ELEMENT_NODE) {
var el = document.createElement(node.tagName)
var attrNames = node.getAttributeNames()
for (var attrName of attrNames) {
el.setAttribute(attrName, node.getAttribute(attrName))
}
for (var child of node.childNodes) {
el.appendChild(cloneNode(child))
}
return el
}
}
//实现ES6 symbol for函数
//实现symbol for 函数(symbol的属性名称是唯一的)
//建立映射,尽量用Map
var map =new Map()
function symbolFor(key){
if(map.has(key)){
return map.get(key)
}else{
keySymbol = Symbol(key)
map.set(key,keySymbol)
return map
}
}
//控制台
symbolFor("Symbol(aaa)")
Map(3) {'a' => 1, 'b' => 2}
symbolFor("Symbol(bbb)")
Map(4) {'a' => 1, 'b' => 2}
{"a" => 1}
{"b" => 2}
{"Symbol(aaa)" => }
{"Symbol(bbb)" => }
实现简单symbol.iterator 迭代器
//定义迭代器
var a = [1,2,3,4,5,6]
a[Symbol.iterator] = function() {
var i = 0
return {
next: () => {
return {
value: this[i++],
done: i > this.length
}
}
}
}
//调用
var iter = a[Symbol.iterator]()
iter.next()
//输出
{value: 1, done: false}