1

整理以及总结一下,回溯下基础。

ECMAScript中具有两种数据类型的值,分别是 基本类型值和引用类型值。

在ECMAScript中,基本类型值指的是简单的数据段,引用类型值指那些可能由多个值构成的对象。

基本数据类型

基本数据类型:undefined(未定义的值的默认值) null(尚未存在的对象) boolean(true or false) number(数字) string(字符串)。
基本类型的值不能添加属性。

var str = 'I am basic';
str.type='basic';//it is wrong!!!

这五种数据类型是按值访问的,也就是操作的是保存在变量中实际的值,改变了就是改变了。
引用类型:这种类型就是在操作的时候,操作的是其自身的引用,而不是实际的对象。当然这一块还要再细化一点,当操作动作是复制时,操作的是对象的引用。当操作动作是添加时,操作的是实际的对象

下面说说一些操作以及开发中的注意点

基本操作

基本类型:就是复制,copy,你会得到两个一模一样的东西,并且这两个之间是相互独立的

var a = 111;
var b = a;
a+=10;
console.log(a);//121
console.log(b);//111

引用类型:引用类型在接受到复制操作这个命令时,也是会把变量对象中的值复制一份放到一个新的空间中。但是,这个值并不是真正的值,而是一个指针或者说是路径,它指向了存储在堆中的一个对象。复制之后的这两个变量只是两个指针,指向同一个地方。
这样的话,改变一个,另一个也得变化。

var a ={};
var b=a;
a.age=18;
console.log(b.age);//18

拷贝操作

所以在日常开发中,经常会用到对象的赋值操作,这里直接用‘=’可能会引起不必要的一些bug,这里一般用一些方法避免掉。

  • for循环,键值对应赋值,数据对象都可以,这里要注意一个深浅拷贝,深拷贝要对当前对象的所有的属性进行遍历赋值
    深入剖析 JavaScript 的深复制
  • arrB=arrA.slice(0)
    js的数组操作方法 slice会返回一个新的数组,接受两个参数(start,end),如果没有传end,默认为从start到数组尾部.
  • arrB=arrA.concat()
    js的数组操作方法,同样返回一个新数组。
  •    var arrA=[1,2,3];
       var [...arrB]=arrA;
       console.log(arrB)//[1,2,3]
    

    这里用上了es6的扩展运算符,原理就是先拆掉再放进数组里。

  • var objB=JSON.parse(JSON.stringify(objA))
    拷贝一个字符串(基本类型)会新开辟出一个存储地址,这样就没有之前的引用了。
  •    var objA={'name':'11','age':'22'}
       var {...objB}=objA;

    是的,这样也可以的。。。

这样开发中可以根据需要复制的数据来选择相对简单方便的方法。

小结

非常基础的知识点了,但是开发中不注意也会引起不必要的麻烦,同时在日常开发中可以针对不同的需求提前写好工具函数,统一起来。方法多不一定是好事,群魔乱舞。


划水咸鱼
85 声望0 粉丝