作为刚转入js开发不久的浪荡的iOS码农,接触一个全新的语言世界,内心对一切充满了好奇。js是一门弱语言,对比之前使用的OC或者C++或者C等等来说,还是有很大的差异化。今天落地成盒同学简单来聊一下对于一个初学者使用js.sort这个方法的感受和思考。
此文章大致分为两个部分:
一、对于js的变量的数据类型的简单说明
二、对于.sort()这个方法的思考和感受
let's begin coding......
一、对于js的变量的数据类型的简单说明
js的数据类型有字符串、数字、布尔、数组、对象、Null、Undefined。因为拥有动态的语言类型,这意味着相同的变量可用作不同的类型。
例如:
var x// x 为 undefined
var x = 6;// x 为数字
var x = "Bill";// x 为字符串
如果x没有被赋值,那么你不知道他到底是什么类型,强语言定义变量时前面指定了数据的类型,如果你定义了一个int 的类型,后面赋值给它一个字符串类型那么编译器会提示你一个警告告诉你类型不对需要强制类型进行转化。这就避免了因为数据的类型问题发生的bug。而若语言就没有这个优势,好多时候出了bug之后排查到最后发现是自己的数据类型给错了。你要找的这个变量的最后的赋值的地方,才能确认他的类型是什么,这样的话调试的效率也就低了很多。(此部分个人拙见,欢迎来讨论)
这里也特别的说下我这个初学者对于null和undefine的理解,觉着null就是压根就没有这个变量,连内存都没有分配,而undefine是对象存在但是并没有赋值给它(如有错误小盒希望可以被大神纠正)。
还有一个值得注意的地方是深拷贝和浅拷贝,也就是常说的值传递和指针传递。
例1:
var a = 1;
var b = a;
b = 2;
console.log("a=="+a+",b=="+b);
例2:
var a = ["1","2"];
var b = a;
b = ["3","4"];
console.log("a=="+a+",b=="+b);
以上两个例子分别输出a==1,b==2 和 a==["3","4"],b==["3","4"];
js中除了数组和对象两个是进行指针传递,其余的数据类型都是进行值传递。
数组进行深拷贝有方法slice。
二、对于.sort()这个方法的思考和感受
比如一个数组:
this.testStrArr = ["s","1","0","v","g","u","f","t","a"];
然后this.testStrArr.sort();
那么输出的就是顺序排列的一个数组,这个方法默认是给以字符串为对象的数组进行排序的。
但是如果this.testArr = [9,3,5,2,7,2,3,12,55,66,76,23];
这个.sort()的方法就不管用了,竟然要自己定义一个规则让数组得到排序。我一想我们大OC语言都是写好的,随便用。怎么到了js还要自己写!!前辈说这样更加体现了弱类型语言的灵活性,嗯!我觉着对!所以就摸索着学习着写了下面的正序或者倒序的排序方法。
sortOrder:function(arr,isDes){
arr.sort(function(a,b){
if(isDes){
//降序
return b-a;
}else{
//升序
return a-b;
}
});
},
还写了个获取随机数组的方法:
this.orderedArr = [1,2,3,4,5,6,7,8,9,10];
sortRandom:function(){
this.orderedArr.sort(function(a,b){
var random = Math.random();
if(random > 0.5){
return b - a;
}else{
return a - b;
}
});
},
这样会把一个数组随机的打乱顺序,可以去做个随机发牌的算法去。
至此在一个系统封装好了的sort方法下面进行了排序方法的扩充,充分感受到了多态,都是sort()方法但是排序的规则不同,你可以随意写自己需要的排序规则来排序,真的很灵活。相比较其他语言,你对系统的方法进行重定义会导致原来的系统方法失效的,你要额外去写一个分类或者建立一个子类来扩充这个系统方法对于你的需求的不足。这样的话,就感受到了js扩展方法的方便咯。
以上,就是小盒程序入门渣渣的初感受。欢迎各界程序大佬留言来讨论下你印象最深刻的使用多态的体验,一起学习!
小盒最近在入门node.js的内容,之后应该会发一些关于node.js的学习笔记,希望大家可以督促我学习,没事给我发个消息!!蟹蟹!
领取专属 10元无门槛券
私享最新 技术干货