数据类型,浅拷贝,深拷贝,值类型与引用类型

目录

1.基础数据类型(简单数据类型)(值类型)

 2.复杂数据类型(引用数据类型)

 3.浅拷贝

4.深拷贝

5.值类型

 6.引用类型

7.递归


1.基础数据类型(简单数据类型)(值类型)

."值类型"直接将内存存储在栈内,由系统自动释放资源的数据类型.

与值类型相对应的有引用类型.

数据类型

typeof 值

举例

String字符串

string

“abc”,'abc',`def`

Number数

number

123,-12.5

Boolean布尔

boolean

true,false

undefined未定义

undefined

undefined

Symbol符号

symbol

symbol

null 空

object

null

​
alert(null===null)	//true
		symbol 符号,不相等
		var s1 = Symbol("good");
		var s2 = Symbol("good");
		alert(s1== s2);				   //false
		alert(NaN == NaN);			   //false
		alert(undefined==undefined)	   //true
		alert(undefined==null)		   //ture
		两个等于值相等,三个等于 值与类型相等
		alert(null == NaN);            //false
		 alert(undefined===null)       // false
		 alert(null == false);         //false
		 alert(0 == false);            //true

​

 2.复杂数据类型(引用数据类型)

引用类型 由类型的实际值引用(类似于指针)表示的数据类型。如果为某个变量分配一个引用类型,则该变量将引用(或“指向”)原始值。不创建任何副本。

数据类型

typeof

举例

Array数组

object

[]

Object对象

object

{}

function函数class类

function

function(){}

Map图

object

new Map([[]])

Set集合

object

new Set([])

weakMap,weakSet

object

Date,Math,

object

<script>
		// 判断对象类型最准确的方法
		function getType(obj){
			return Object.prototype.toString.call(obj)
		}
		</script>
		

 3.浅拷贝

浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

// 01 浅拷贝 用for in
				var obj1 = {};
				for(var k in obj){
					// 实现遍历浅拷贝
					obj1[k] = obj[k];
				}

4.深拷贝

 创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”。

深拷贝,值类型,与引用类型都拷贝(互相不影响)
            01 对象转字符JSON.stringify,字符串转json JSON.parse()
            JSON数据格式只支持:string,number,null,undefined,array,object
            var obj1 = JSON.parse(JSON.stringify(obj))

           02 采用递归,如果值类型就拷贝,引用类型,递归拷贝

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<h1>深拷贝</h1>
		<script>
			var obj = {
				name:"zz",
				age:18,
				friend:["A","B","C"],
				say:function(){alert( this.name)}
				}	 
			
			function deepCopy(obj){
				// 如果typeof 值是object并且不是null
				if(typeof obj=== 'object'&&obj!=null){
					var result;
					// 如果是数组
					if(obj instanceof Array){
						result = [];
						// 遍历数组,执行拷贝
						for(var i=0;i<obj.length;i++){
							// 当前下标的值是执行深拷贝的结果
							result[i]=deepCopy(obj[i])
						}
						
					}else{
					// 如果是对象
						result = {};
						for(var k in obj){
							// 执行遍历深拷贝对象
							result[k] = deepCopy(obj[k])
						}
						
					}
					// 返回的结果
					return result;
					
				}else{
					// 值类型或者null或者 函数直接返回
					return obj;
				}
			}
			
		</script>

5.值类型

  • 值类型 key与value都存储在栈
  • 值类型:字符串(string)、数值(number)、布尔值(boolean)、null、undefined

var  a = 100;
var b = a;
b=200;
console.log(a,b);
			

 6.引用类型

  • 引类型 栈 存储的是key 与内存地址,堆中存真正的值
  • 引用类型:对象(Object)、数组(Array)、函数(Function)、类class 、日期Date 、正则Regexp 

             var  a = 100;
			 var b = a;
			 b=200;
			 console.log(a,b);
			
			// 引类型 栈 存储的是key 与内存地址
			// 堆中存真正的值
			var  d = {age:100};
			var e =d;
			// 修改了堆中的数据 
			// d与e都引用了同一个内存地址
			
			e.age = 200;
			console.log(d,e)

7.递归

  • 递归就是函数自己调用自己(必须要有结束条件)
  • 举个栗子,你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇们...但是当你开到某扇门时,发现前方是一堵墙无路可走了,你选择原路返回——这就是递归

    但是如果你打开一扇门后,同样发现前方也有一扇们,紧接着你又打开下一扇门...直到打开最后一扇门出去,或者一直没有碰到尽头 (死循环)——这就是循环。

var obj = {
				name: "zz",
				age: 18,
				friend: [
					"张张爱穿小裙子", "小付爱吃肉肉", "小付是丑八怪", {
						"name": "艳艳",
						"age": "20"
					}
				]
			}

			function log(obj) {
				if (typeof obj !== "object") {
					console.log(obj);
				} else {
					if (obj instanceof Array) {
						for (var i = 0; i < obj.length; i++) {
							// console.log(i,":");
							log(obj[i]);
						}
					} else {
						for (var k in obj) {
							log(obj[k]);
						}
					}
				}
			}
  • 斐波那契数列

 

// 1、1、2、3、5、8、13、21、34
			function fib(n){
				if(n==0||n==1){return 1}
				else{
					return fib(n-1)+fib(n-2);
				}
			}
			alert(fib(46))
			function fib(n){
				var arr = [1,1];
				for(var i=2;i<=n;i++){
					arr[i]=arr[i-1]+arr[i-2];
				}
				console.log(arr[n])
			}
			function mul(num){
				if(num<2){return 1}
				else{
					return num *mul(num-2);
				}
			}
			alert(mul(10));
			function add(num){
				if(num==1){return num}
				else{
					return num+add(num-1);
				}
			}
			var re = add(3);
			alert(re);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农阿茹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值