4、javascript中sort方法的完整解析

2022-06-18 08:34:11 浏览数 (1)

4、javascript中sort方法的完整解析

说起对数组的排序,大家能想到的应该是冒泡排序,快速排序,sort排序,以及希尔排序吧,但是可能对sort排序只停留再数组层面(每个元素均是数字或者字符串),事实上,它还可以对对象进行排序。

原理是:不管元素是什么类型,sort排序始终是根据元素的unicode编码进行的

下面来分别看下各种情况:

元素为数字或者字符串:

先从简单的开始,大家都知道sort()函数比较的是ASCII码的大小,而且而且而且:Array的sort()方法默认把所有元素先转换为String再排序,所以就有以下问题。

代码语言:javascript复制
 var arr1 = [10,1,5,2,3];
 arr1.sort();
 console.log(arr1);

结果转换成字符串比较,'10’排在了’2’的前面,因为字符’1’比字符’2’的ASCII码小

[语法]:

arr.sort()

arr.sort(compareFunction)

[参数]:

compareFunction可选。用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的诸个字符的Unicode位点进行排序。

[返回值]:

返回排序后的数组。原数组已经被排序后的数组代替。

[描述]:

如果没有指明 compareFunction ,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。例如 “Banana” 会被排列到 “cherry” 之前。数字比大小时,2 出现在 10 之前,但这里比较时数字会先被转换为字符串,所以 “10” 比 “2” 要靠前。

如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:

如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;

如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);

如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。

compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

所以,比较函数格式如下:

代码语言:javascript复制
function compare(a, b) {
  if (a < b) {           // 按某种排序标准进行比较, a 小于 b
    return -1;
  }
  if (a > b) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

要比较数字而非字符串,比较函数可以简单的以 a 减 b,如下的函数将会将数组升序排列

代码语言:javascript复制

function compareNumbers(a, b) {
  return a - b;
}

5、javascript中set与get方法详解

其中get与set的使用方法:

1、get与set是方法,因为是方法,所以可以进行判断。

2、get是得到 一般是要返回的 set 是设置 不用返回

3、如果调用对象内部的属性约定的命名方式是_age

然后就是几个例子来简单说明一下:

代码语言:javascript复制
var person ={ 
    _name : "chen",
    age:21,
    set name(name) {
        this._name = name;
    },
    get name() {
        return this._name;
    }
}
console.log(person.name)
输出”chen“
person.name="lunc";
输出"lunc"
person.name
输出"lunc"

例子2:

代码语言:javascript复制
var p = {
    name:"chen",
    work:function() {
        console.log("wording...");
    },
    _age:18,
    get age(){
        return this._age;
    },
    set age(val) {
        if (val<0 || val> 100) {//如果年龄大于100就抛出错误
            throw new Error("invalid value")
        }else{
            this._age = val;
        }
    }
};
console.log(p.name);//输出chen

浏览器的直接调试结果:

代码语言:javascript复制
    p.age
    "18"
    p.age=23
    "23"
    p.age=200
    Uncaught Error: invalid value

0 人点赞