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