数字、字符串:
var v1 = 1; var v2 = v1; console.log(v1); console.log(v2); console.log(v1 === v2); v1 = 'Changed'; console.log(v1); console.log(v2); console.log(v1 === v2);
输出:
1 1 true Changed 1 false
结论:数字、字符串赋值是将值复制一份,===是比较值是否相等。
对象:
var c1 = {}; var c2 = c1; console.log(c1); console.log(c2); console.log(c1 === c2); c1.name = 'ABC'; console.log(c1); console.log(c2); console.log(c1 === c2);
输出:
{} {} true { name: 'ABC' } { name: 'ABC' }
结论:
对象赋值间只是传递引用(相当于指针);
var c1 = {}; var c2 = {}; console.log(c1); console.log(c2); console.log(c1 === c2); c1.name = 'ABC'; console.log(c1); console.log(c2); console.log(c1 === c2);
输出:
{} {} false { name: 'ABC' } {} false
对象的===比较的是引用地址。
http://www.w3school.com.cn/js/js_objects.asp
参考以上文章,了解JS中的对象更进一步。
http://howtonode.org/what-is-this
关于万恶的this和作用域。
总结:作用域与funtion直接挂钩,funtion{==闭包的开始,与之对应的}==闭包结束,还有一个全局闭包。一个模块(相当于一个js文件)==一个闭包。funtion定义的闭包与调用无关,只与funtion声明的位置有关。闭包可以充当私有变量。闭包中有对象被引用,则整个闭包不会释放。
this表示的上下文跟着调用方法之前的对象走,比如a.display(),那display中的this指向的就是a,在文件中直接调用display(),则上下文会指向Global。