var name = "张三",age= 20; var obj={ name:"李四", objAge:this.age, myfun:function(){ console.log(this.name+"年龄"+this.age); } } var obj2={ name:"王二", age:40 }
var name = "张三",age= 20; var obj={ name:"李四", objAge:this.age, myfun:function(fm,t){ console.log(this.name+"年龄"+this.age,"来自"+fm+"去往"+t); } } var obj2={ name:"王二", age:40 }
function addClass(node,classes){ for(let key in classes){ var value = classes[key] if(value){ node.classList.add(key) }else{ node.classList.remove(key) } } }
let f = ['a','b'] let f = newArray('a','b') //两种写法等价
Array构造函数的两种用法:一个或者多个参数
1 2 3 4
var a = Array(3) //生成一个长度为给的数字(3)的数组,不含0,1,2,有三个undefined,第一个参数是长度 var a = Array(3,3) //当是一个参数的时候,第一个参数是长度,当有两个参数的时候,第一个参数不是长度,它是第一项
首先第一种用法var a = Array(3),它会生成一个长度为3,每一个都是undefined的数组a[0]是undefined,a[1]是undefined,a[2]也是undefined;但是又不在a里面,也就是说a没有012,这时候最好画内存图,在研究数据的时候最好的方式就是画内存图。
console图如下:
内存图演示,当写var a = Array(3)的时候到底做了什么,在stack里面声明了一个地址,a指向这个地址(ADR99),heap对应的ADR99里面存了一个length:3以及一个__proto__指向Array.prototype(Array的公有属性);也就是说当写var a = Array(3)的时候它生成了一个对象,这个对象里面写了一个length:3以及--proto指向公有属性(Array.prototype),公用属性里面还包括一些push、shift之类的函数。0,1,2,3并没有存到heap对应的ADR99中。内存图解如下:
var f = function(){}//变形成下面,所以这是两句话,声明函数只有上面两种方法(关键字和new Function) var f //先去声明一个f变量 f = function(){} //然后让f等于一个匿名函数,内存图如下
如果现在让f=1那么就会将stack里面的A88地址擦掉换成1,中间的联系就会断掉,但是函数function(){}还在,f跟function没有任何关系.var f = function(){}是两步,一步是弄一个变量f一步是弄一个对象function(){}然后将它们联系起来,所以var f = function(){}不是一个语法,声明函数只有上面两种方法(关键字和new Function)