js的数据类型和深拷贝、浅拷贝

1. JS 中的数据类型
2. JS 数据拷贝
3. JS函数中的参数传递


JS 数据类型

  • 基本类型值:
    • undefined:
    • Null
    • Boolean
    • Number
    • String
  • 引用类型值:
    • Object
    • Array
    • Function
    • Date等

JS 数据的拷贝

JS中变量的基本类型数据和引用类型数据保存的方式不同,在数据拷贝时就存在区别。

  • 浅拷贝(基本类型数据拷贝
    复制基本类型值,两个变量相互独立,只是单纯的value数据拷贝,两者是否被修改都互不影响
	var s = 8;
	var a = s;
	console.log(a);  //8
	a = 16;
	console.log(s)  //8
	console.log(a)   //16
  • 深拷贝(引用类型数据拷贝
    复制引用类型值,同样会将存储在变量对象中的值复制一份放到新变量分配的空间中
    不同:复制对象时,不会在堆内存中新生成一个相同的对象,只是多了一个保存指向这个对象指针的变量而已。
          把 obj 的值复制给objT,这个值的副本实际上是一个指针,指向存储在堆中的一个对象,即创建了一个新的内存地
          址传给objT,obj 和 objT同时指向同一个 object,任何一个做出的改变都会反映在另一个身上
	var obj = {
		name:"lili";
		age:23
	}
	var objT = obj;
	console.log(obj.name)   //lili
	console.log(objT.name)   //lili
	
	objT.name = "liu";
	console.log(obj.name)  //liu
	console.log(objT.name)   //liu

JS函数中的参数传递

所有函数的参数都是按值传递的,即把函数外部的值复制给函数内部的参数

  • 一般类型传参
	var s = 12;
	function add(c){
		c = 6;
		return c
	}
	var a = add(s);
	console.log(a)  //6
	console.log(s)  //12
  • 对象传参
    • 把info复制传入adit中,p 和 info指向同一个对象,是否修改相互影响
	var info = {
		name:"lili"
	};
	function adit(p){
		p.name = "Jen";
		return p;
	}
	
	var some = adit(info);
	console.log(some.name)  //Jen
	comsole.log(info.name)  //Jen
解除影响:函数中重定义了一个对象,即堆内存中两个对象,调用后返回的值是新对象的值,按值传递(共享传递)
	var info = {
		name:"lili"
	};
	function adit(p){
		p = {
			name:"Jen"
		};
		return p;
	}
	
	var some = adit(info);
	console.log(some.name)  //Jen
	comsole.log(info.name)  //lili

函数调用过程中,值传递、参数不对等处理上,不管实参的数目大于还是小于形参,数据类型是否准确,调用的函数都会被执行
理解:JS中的参数在内部是用数组表示的。函数接收的始终是个数组(arguments对象),可以通过下标来获取传入的每一个元素(arguments[0]),也可以用length属性来气确定传递进来的参数个数

	function hello(name,msg){
		console.log("hello ' + arguments[0] +arguments[1])
		console.log(arguments.length)
	}
	function say(){
		console.log("hello ' + arguments[0] +arguments[1])
		console.log(arguments.length)
	}
	hellow('lili',',how are you');
	say('lili',',how are you');
	//以上都会输出:hello lili ,how are you

猜你喜欢

转载自blog.csdn.net/Leatitia/article/details/88553190