Js数据类型
在JavaScript
中共定义了八种数据类型(7种原始类型和一种引用类型)。原始数据类型,就是用来表达一些结构简单的数据。
原始数据类型
number
:用于任何类型的数字,整数和浮点数。sring
:用与字符串,零或多个,没有单独的。boolean
:用于true
和false
。null
:用于未知的值。占位。undefined
:用于未定义的值。symbol
:用于表示唯一标识。bigInt
:用于任意长度的整数。
原始数据类型基本核心就是,原始数据类型不会改变。
1、在是使用过程中,经常会遇到修改值的场景,。例如字符串的变动,和数据的累加等,是否和不可变冲突呢?
let a = 1;
let b = a;
b++;
console.log(a);// 1
console.log(b);// 2
分析以上代码:声明一个变量a
和b
,当把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
- 然后修改
obj2
的name
- 结果,它们两个的值都发生了变化
与变量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)