JavaScript易错点

83 阅读2分钟

一、数字字面量

在js中,数字017是15,018是18

image.png

为什么会这样?

js中对数字0开头的数字有特殊的解析规则,数字 017 被解析为 八进制 数字,而 018 被解析为 十进制 数字

二、零宽字符

image.png

明明打印了用户名和密码了,判断条件为啥不成立???

这里面就有零宽字符,它在页面上不显示,但是不表示它不存在,例如打印username的长度为5

image.png

原因是在代码里定义username为username: '我爱\u200D上班',

\u200D就是一个零宽字符

常见的零宽字符:

image.png

零宽字符可以用来做一些水印,不影响用户查看界面

三、使用 void 0 替代 undefined

undefined不是一个关键字,它是window对象的一个属性,这就意味着可以使用undefined作为变量名

可以看到,在全局环境中,使用undefined作为变量名定义时,获取到undefined变量仍然是undefined,这样是没有问题的

image.png

在函数中,使用undefined作为变量名是可以的,后续读取undefined时,结果就不是undefined了

image.png

这种代码就会在项目中埋下隐患,如果要获取undefined值,应该使用void 0替代undefined

四、for循环嵌套时如何退出循环

      for (let i = 0; i < 5; i++) {
        for (let j = 0; j < 5; j++) {
          console.log('>>', i, j)
          if (j == 3) {
            break
          }
        }
      }

当内层循环break时,外层循环还是会继续执行下去,如果想要在j的值为3时,退出整个循环,怎么处理?

  1. 声明一个变量来辅助处理
      for (let i = 0; i < 5; i++) {
        let flag = false
        for (let j = 0; j < 5; j++) {
          console.log('>>', i, j)
          if (j == 3) {
            flag = true
            break
          }
        }
        if (flag) break
      }
  1. 使用label语句,结构清晰(推荐)
      outer: for (let i = 0; i < 5; i++) {
        for (let j = 0; j < 5; j++) {
          console.log('>>', i, j)
          if (j == 3) {
            break outer
          }
        }
      }
  1. 假如在函数中,可以使用return退出函数,循环也会终止
      function ttt() {
        for (let i = 0; i < 5; i++) {
          for (let j = 0; j < 5; j++) {
            console.log('>>', i, j)
            if (j == 3) {
              return
            }
          }
        }
      }

      ttt()

如果你觉得这篇文章对你有用,可以看看作者封装的库xtt-utils,里面封装了非常实用的js方法。如果你也是vue开发者,那更好了,除了常用的api,还有大量的基于element-ui组件库二次封装的使用方法和自定义指令等,帮你提升开发效率。不定期更新,欢迎交流~