1.变量类型
ECMASCRIPT规定变量的类型共两种:
基本类型 (primitive values) – 包括Undefined, Null, Boolean, Number和String五种基本数据类型
引用类型 (reference values) – 保存在内存中的对象们,不能直接操作,只能通过保存在变量中的地址引用对其进行操作
2.变量赋值
a)对基本类型的赋值,是变量值的直接copy,从此两个变量不再相干。
b)对引用类型的赋值,是对值内存地址的引用,两者的值共有一个内存地址
var a = 'data1'; var b = a; a = 'data2'; console.log(b); // data1 b = 'data3'; console.log(a); // data2
看无论怎么单独修改a或者b,b或者a都不会被影响
var a = { func1: function() { console.log('a-func1'); }, name: 'a' }; var b = a; b.name = 'b'; console.log(a.name); // b var a1 = { func1: function() { console.log('a1-func1'); }, name: 'a1' }; var b1 = a1; b1 = { func1: function() { console.log('b1-func1'); }, name: 'newb', func2: function() { console.log('b1-func2'); } }; console.log(a1); // Object {name: "a1", func1: function} var a2 = { func1: function() { console.log('a2-func1'); }, name: 'a2' }; var b2 = a2; a2 = { func1: function() { console.log('a2-func1'); }, name: 'newb', func2: function() { console.log('a2-func2'); } }; console.log(b2); // Object {name: "a2", func1: function} var a3 = { func1: function() { console.log('a3-func1'); }, name: 'a3' }; var b3 = a3.name; console.log(b3); // a3 a3.name = 'a3-new'; console.log(b3); // a3 console.log(a3); // Object {name: "a3-new", func1: function} a3 = { func1: function() { console.log('newa3-func1'); }, name: 'newa3' }; console.log(b3); // a3 var a4 = { func1: function() { console.log('a4-func1'); }, name: 'a4' }; var b4 = a4.func1; console.log(b4); // function () {console.log('a4-func1');} a4.func1 = function() { console.log('newa4-func1'); }; console.log(b4); // function () {console.log('a4-func1');} console.log(a4); // Object {name: "a4", func1: function} a4 = { func1: function() { console.log('newa4-func1'); }, name: 'newa4' }; console.log(b4); // function () {console.log('a4-func1');} var a5 = { name: 'a5', achive: { no: 'a5', books: 'a5' } }; var b5 = a5.achive; a5.achive.no = 'newa5'; console.log(b5); // Object {no: "newa5", books: "a5"} var a6 = { name: 'a6', achive: { no: 'a6', books: 'a6' } }; var b6 = a6.achive; b6.no = 'newb6'; console.log(a6, a6.achive.no); // Object {name: "a6", achive: Object} "newb6" console.log(b6); // Object {no: "newb6", books: "a6"} var a7 = { name: 'a7', achive: { no: 'a7', books: 'a7' } }; var b7 = a7.achive; b7 = { no: 'b7', books: 'b7' }; console.log(a7.achive); // Object {no: "a7", books: "a7"}
对引用的赋值是内存地址的指向,变量重新赋值又会指向新的内存地址。
3.变量比较
var a = 'a'; var b = 'b'; console.log(a === b); // false b = 'a'; console.log(a === b); // true
基本类型变量的比较就是值的比较。
var a = { name: 'a' }; var b = { name: 'a' }; console.log(a === b); // false b = a; console.log(a === b); // true
引用类型的比较是内存地址的比较。
参考文章:
让人犯晕的JavaScript变量赋值