js数据类型

Js数据类型

JavaScript中共定义了八种数据类型(7种原始类型和一种引用类型)。原始数据类型,就是用来表达一些结构简单的数据。

原始数据类型

  • number:用于任何类型的数字,整数和浮点数。
  • sring:用与字符串,零或多个,没有单独的。
  • boolean:用于truefalse
  • null:用于未知的值。占位。
  • undefined:用于未定义的值。
  • symbol:用于表示唯一标识。
  • bigInt:用于任意长度的整数。

原始数据类型基本核心就是,原始数据类型不会改变。

1、在是使用过程中,经常会遇到修改值的场景,。例如字符串的变动,和数据的累加等,是否和不可变冲突呢?

	let a = 1;
	let b  = a;
	b++;
	console.log(a);// 1
	console.log(b);// 2

分析以上代码:声明一个变量ab,当把b初始化a时,b的的值也会得到1,这个值跟存储在a中的1是完全独立的,因为它是那个值的副本。这两个可以独立使用。互不干扰,这也就是b为什么改变了的原因。因此,我们说,原始数据类型都是按值访问的。
2、除了不可变,基础数据类型还需要我们关注的点。基础数据类型也能访问方法。

	let text = 'string';
	text.chartAt(0)

我们在访问字符串时,实际上是在访问一个对象,在Js中,针对的每一种基础数据类型,都有提供对应的包装对象,例如字符串,就有一个名为String的包装对象,当使用字符串访问方法时,实际经历如下:

	// 创建一个String的实例
	let str = new String('呵呵')

	//调用实例上特定的方法
	str.chartAt(0)	

	// 最后销毁该对象
	str = null
	

包装类型:ECMAScript提供了三种特殊的引用类型:Boolean,Number,String,每当用到某个原始值的方法或属性时,后台都会创建一个相应的原始包装类型对象,从而暴露出操作原始值的各种方法。

引用数据类型

与原始数据类型相比,对象的根本区别之一是通过引用,被存储和复制的,与原始值相反,字符串,数字,布尔值始终是以整体值的形式被复制的。引用类型是可变的。

	let obj = {
		name:'susan',
		age:18
	}
	
	let obj2 = obj;
	obj2.name='lilei'
	
	console.log(obj) // {name: "lilei", age: 18}
	console.log(obj2)// {name: "lilei", age: 18}

  • 声明了变量obj,它的值是一个引用类型的
  • obj赋值给新的变量obj2
  • 然后修改obj2name
  • 结果,它们两个的值都发生了变化

与变量obj2建立映射关系的,并不是引用类型本身,而是引用类型本身在内存中的地址,当进行赋值操作时,实际上,是对内存地址进行了一次拷贝,这种只拷贝内存地址的操作,称之为浅拷贝。

克隆与合并Object.assign

那么,拷贝一个对象会又创建一个对相同对象的引用,但是如果想复制一个对象,那该怎么做呢?创建一个独立的拷贝还是克隆?
因为js没有提供对此操作的内建方法,实际很少这样做,通过引用拷贝大多数情况下就已经很好了。
但是,如果我们真的想要这么做

  • 创建一个新对象
  • 遍历现有的属性结构
  • 在原始类型值的层面,将其复制到新对象,以复制已有对象的结构
	 let obj = {
      name: 'susan',
      age: 18
    }
    // 新的对象
    let assign = {}
    
    // 将obj中所有的属性拷贝到其中
    for (let key in obj) {
      assign[key] = obj[key]
    }
    
    // assign是带有内容的独立对象
    assign.name = 'lilei'
    console.log(obj.name)// 原来的对象中name 依然是susan

也可以使用Object.assign方法达到相同的效果。

语法:Object.assign(dest,[src1,src2...])

  • 第一个参数dest指目标对象
  • src1,....(可按需传递多个参数)是源对象
  • 该方法将所有源对象的属性拷贝到目标对象dest
  • 调用结果返回dest
   let assign = {name:"x"}
   Object.assign(assign,{name:"y"})
   console.log(assign.name)// y

合并多个对象

   let user = { name: "a" }
   let person = { view: "b" }
   let person2 = { edit: "c  " }
  
 	 // 将person和person2中所有的属性都拷贝到user中
  	Object.assign(user, person, person2)
  
 	 // {name: "a", view: "b", edit: "c"}
 	 console.log(user) 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会跳舞的牙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值