JS基本类型-引用类型-深浅拷贝 / sort

丛林逃生:拷贝对象一直报错。
A = B这样不对的。 用下图递归
在这里插入图片描述

JS基本类型-引用类型-深浅拷贝
在JavaScript中变量包含两种类型的值:一种是基本类型,一种是引用类型。

基本类型包括:数值、字符串、null、undefined、布尔值
引用类型包括:对象、数组、函数、正则…

补充: null和undefined的区别

null表示"没有对象",即该处不应该有值。

典型用法是:

(1) 作为函数的参数,表示该函数的参数不是对象。

(2) 作为对象原型链的终点。

undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。

典型用法是:

(1)变量被声明了,但没有赋值时,就等于undefined。

(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。

(3)对象没有赋值的属性,该属性的值为undefined。

(4)函数没有返回值时,默认返回undefined。

1.引用类型的动态属性
对于引用类型的值,我们可以为其添加属性和方法,也可以改变或删除属性和方法,

对于基本类型的值,尽管给其添加属性和方法不会报错,但这是无效的。

复制代码
var obj=new Object();
obj.name=“zuobaiquan”;
var str=“zbq”;
str.age=20;
console.log(obj.name);// zuobaiquan
console.log(str.age);// undefined
复制代码
2.基本类型值和引用类型值的复制
2.1基本类型值
基本类型值是指在栈内存保存的简单数据段,在复制基本类型值的时候,会开辟出一个新的内存空间,将值复制到新的内存空间。

复制代码
var a = 1;
var b = a;
a = 2;
console.log(a);//输出2;
console.log(b);//输出1;
复制代码
var a = 1;

var b = a;

a = 2;

从上面例子看出,当一个变量的值是基本类型,把它复制给另一个变量,复制完成后改变它的值,不会影响已经复制了它的值的变量。

2.1引用类型值
引用类型值是保存在堆内存中的对象,变量保存的只是指向该内存的地址,在复制引用类型值的时候,其实只复制了指向该内存的地址。

复制代码
var a = {
name: ‘Kitty’,
age: ‘20’,
sex: ‘man’
};
var b = a;
a.name = ‘Jack’;
console.log(a);//输出{name: ‘Jack’,age: 20,sex: ‘man’}
console.log(b);//输出{name: ‘Jack’,age: 20,sex: ‘man’}
复制代码
var a = {name: ‘Kitty’,age: ‘20’,sex: ‘man’};

var b = a;

a.name = ‘Jack’;

从上面例子看出,当一个变量的值是引用类型值,把它复制给另外一个变量,复制的只是指向储存对象内存的地址,所以复制完成后,改变它的值,会影响复制了它的值的变量。
注意:如果有两个变量的值是引用类型值,就算它们的值完全相同,它们也是不相等的,因为它们指向的内存地址不同,例子:

3.对象的浅拷贝和深拷贝
当一个变量是对象,如果像上面那样直接将一个变量赋值给另一个变量,如果改变某个变量的值,另外一个变量也会跟着改变,如果我们不想发生这种情况,就需要写一个函数用来拷贝对象。

3.1浅拷贝
当对象里的属性的值只有基本类型的值时候。

复制代码
var a = {
name: ‘Kitty’,
age: 12,
sex: ‘man’
}
function copy(obj){
var newObj = {};
for(vl in obj){
newObj[vl] = obj[vl]
}
return newObj;
}
复制代码
例子:

从上面例子看到,我们通过这种方式拷贝对象,改变某个变量的值,并不会影响另一个变量。

3.1深拷贝
当对象里的属性的值还是一个对象,这时候用上面的方法就不行了,例子:

这时候要改进这个函数:

使用递归的方法:

复制代码
function deepCopy(obj){
var newObj = {};
for(vl in obj){
if(typeof obj[vl] === ‘object’ && obj[vl] !== null){
newObj[vl] = deepCopy(obj[vl]);
}else{
newObj[vl] = obj[vl];
}
}
return newObj;
}
复制代码
例子:

使用JSON的方法:

JSON.stringify(),将一个对象解析成字符串。
JSON.parse(),从一个字符串中解析出json 对象。

我们可以使用上面两个个方法来进行对象的深拷贝:

JSON.parse(JSON.stringify());
例子:

如果觉得文章不错,可以请博主喝一杯奶茶哦

比较数值可以通过比值函数

比较函数的目的是定义另一种排序顺序。

比较函数应该返回一个负,零或正值,这取决于参数

升序排序

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});

降序排序

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});

以随机顺序排序

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return 0.5 - Math.random()}); 

对复杂数组, 根据数组元素里的某个属性排序

复制代码

var sourceList = [{
        bscore: 222,
        name: '哈哈'
    },
    {
        bscore: 34,
        name: '哈哈'
    },
    {
        bscore: 465,
        name: '哈哈'
    },
    {
        bscore: 67,
        name: '哈哈'
    },
    {
        bscore: 243,
        name: '哈哈'
    },
    {
        bscore: 135,
        name: '哈哈'
    }
]
sourceList.sort((a, b) => {
    return a.bscore - b.bscore
})
发布了205 篇原创文章 · 获赞 39 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/u013321328/article/details/100522523