JS,疯狂背后的方法。
大家好,欢迎来到我的第一篇帖子☄
大家好,欢迎来到我的第一篇帖子☄
一位朋友说我现在成了 JavaScript 的拥趸。说实话,我当时很生气(主要是因为我无言以对),所以我决定亲自试一试,以此证明他是对的。如果你不够精通 JavaScript,它或许能蒙混过关。让我来演示一下问题所在。
给定一个数字数组 [6,-2,2,-7],请使用 Ruby 和 JS 的 Sort 方法对其进行排序.sort()。
在 JS 中:
const array = [6,-2,2,-7];
array.sort();
// The result is: [ -2, -7, 2, 6 ]
在 Ruby 中:
array = [6,-2,2,-7];
array.sort();
# The Result is: [-7, -2, 2, 6]
现在,我希望你已经明白了。如果你是初学者,给定几个数字,让计算机用不同的编程语言对数字进行排序,一种语言(Ruby)会给出正确的排序结果,而另一种语言(JS)则会给出不太正确的结果。
出现这种情况的原因是,JavaScript 是一门很特别的语言。不是特别特别,只是与众不同。JavaScript 的 sort 方法使用原地排序算法来遍历数组元素。
这基本上意味着,它将数组中的元素转换为字符串序列,然后比较这些字符串的 UTF-16 编码单元值。简单来说,就是将数字转换成单独的字母字符串,并按顺序排列。
现在,排序方法本身并没有问题,为了了解这个底层原地算法的工作原理,我们来对一些字符串进行排序。
给定一个名称数组:
const array = ["Daniel", "Bob", "Fizz", "Buzz", "Cynthia"];
array.sort();
// The result is: [ 'Bob', 'Buzz', 'Cynthia', 'Daniel', 'Fizz' ]
搞定啦☄☄ 之所以有效,是因为我们正在对字符串进行排序。sort 方法的默认行为会将所有值都视为字符串。
别担心,你可以使用 `a` 来覆盖此行为parameter function。
系好安全带,这可能有点复杂。该函数本身接受两个参数(a,b),例如 `a` 和 `b`。要了解有关该函数及其功能的更多信息,请阅读此文档。该函数基本上只是检查 a 和 b 是否小于、大于或等于另一个,并据此对它们进行排序,而不管数据类型如何。
要告诉排序方法将数组中的元素视为数字,可以使用以下代码just subtract the parameters (a,b) of the parameter function of the sort method。这将使元素按升序排列,而不管数据类型如何。
可能有点令人困惑,让我来演示一下:
//given a and b are parameters of Compare function which we pass to the sort method.
const array = [6,-2,2,-7];
array.sort(function(a,b){
return a-b;
});
// The result will be correct, you can check 😉
哎呀,看起来好奇怪,我们还是找些fat arrow function正常人重新来一遍吧。
const array = [6,-2,2,-7];
array.sort((a, b) => return a - b);
// The result will be correct, you can check again 😉
现在情况好多了,这要感谢pentacular。
瞧,一个排序良好的数组就此诞生。
结论
这个故事的寓意是:如果你有农场,我强烈建议你还是去务农吧,因为用 JavaScript 跟电脑打交道迟早会让你崩溃的。哈哈!开玩笑啦,JavaScript 的确有很多奇奇怪怪的地方,但当你爱上一样东西时,你也会爱上它的缺点。
友情提示,如果你实在不喜欢 JavaScript 的那些奇葩之处,可以试试微软的TypeScript ,它在 JavaScript 的基础上提供了类型和其他一些很棒的功能。
下次再吐槽!
丹尼尔·卡通吉·丹尼斯
文章来源:https://dev.to/katungi/js-method-behind-the-madness-10ff
