zoukankan      html  css  js  c++  java
  • 用js刷题的一些坑

    leecode可以用js刷题了,我大js越来越被认可了是吧。但是刷题中会因为忽略js的一些特性掉入坑里。我这里总结一下我掉过的坑。

    坑1:js中数组对象是引用对象

    js中除了object还有数组对象也是引用对象,这点常常被忽视,所以在递归的时候传递数组要用arr.slice(0)这样复制一个一样的新数组,不然会出现你传入的数组会被同级的递归改变,结果就不对了。

    所以只要数组复制的地方最好都要这么写,除非你真的想引用。而且注意是slice不是splice这两个方法差别很大,你如果用splice(0)也能得到数组的复制,但是你将会删了原数组,因为splice是一个操作

    增加和删除的元素,返回值是删除的元素的集合。splice(0)是表示从idx为0开始删除到数组尾部,所以得到的返回值也是这个数组。slice(start,end)可以理解为切片,省略end表示到数组尾部,如果end为负

    则从数组尾部开始数。

    坑2:js中的sort是默认以字典序排序

    一般排序的时候都以为如果是升序就不用写compare函数,然而js中的arr.sort()是按字典序排序的,这就导致你如果数组中都是非负数用sort可以得到你想要的效果,但是有负数的话就不对了。

    比如 arr = [-1,-3,-5,7,4,-2] ; arr.sort() ;console.log(arr) ;

    你会得到 [-1, -2, -3, -5, 4, 7] 

    所以要记得写compare函数,不要偷懒,写成匿名函数的形式最好 。

    坑3:函数没有变量提升

    其实这个一般不容易犯,主要当时我是和第二个坑结合了,我自定义compare函数的时候写的是 var compare = function(a,b){return a-b;} ,本来没错,但是我写在了sort的下面,于是sort找不到compare函数就按照默认的字符顺序排列,搞的

    我还以为是compare定义出现了问题。函数中定义变量是有“变量提升”的,就是说你在函数的任何位置定义var a都相当于在函数最开始的地方定义了var a,所以用习惯了之后就忘了函数不是变量,没有变量提升了。你在下面定义会找不到。所以写compare函数的时

    候写成匿名函数吧。

    坑4:浮点数运算不精确

    试试console.log(0.3-0.2)你会发现是0.09999999999999998。我发现只要有奇数的浮点数存在,js就无法精确计算。这应该跟浮点数在js中存储的机制有关系。这个问题没有太好的解决办法,一般来讲答案是要求保留2位或3位小数的,利用toFixed(n)直接保留

    n位就可以了,这个方法本来就是四舍五入的。但是总有些情况你可能不想四舍五入而是想取上下界什么的,这样就只能靠一些方法hack比如你想取前两位:(a*100-b*100)/100这样。

    坑5:判断数组为空

    判断数组为空时不能像变量一样直接用 if(!arr),因为数组不会像变量那样隐式转换,所以可以在你知道arr是个数组的情况下使用arr.length>0判断,但有些情况下可能那个变量还不是数组,就不能去length,所以网上看了一个比较周全的方法,就是先判断该对象到

    底是不是数组类型的,然后再取长度判断

        if(!arr||(Object.prototype.toString.call(arr)==='[object Array]'&&arr.length===0)){
           console.log('arr is null or empty');
        }
    

     

  • 相关阅读:
    1、编写一个简单的C++程序
    96. Unique Binary Search Trees
    python 操作redis
    json.loads的一个很有意思的现象
    No changes detected
    leetcode 127 wordladder
    django uwsgi websocket踩坑
    you need to build uWSGI with SSL support to use the websocket handshake api function !!!
    pyinstaller 出现str error
    数据库的读现象
  • 原文地址:https://www.cnblogs.com/maskmtj/p/6064822.html
Copyright © 2011-2022 走看看