ECMASCRIPT变量

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变量赋值

此条目发表在JavaScript分类目录。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注