JavaScript 初学者容易犯的几个错误,你中招没?

  • 时间:2020-04-24 15:01 作者:1024译站 来源: 阅读:533
  • 扫一扫,手机访问
摘要:JavaScript 是对初学者比较友好的一门编程语言,基本上花个半小时看下语法就能写出能运行的代码。JavaScript 是动态脚本语言,对数据类型没有太多的限制,写起来非常灵活。但正由于如此,初学者假如不深入理解语言本身,往往会犯少量错误,从而导致少量很难发现的 bug。抛开 JavaScrip

JavaScript 是对初学者比较友好的一门编程语言,基本上花个半小时看下语法就能写出能运行的代码。JavaScript 是动态脚本语言,对数据类型没有太多的限制,写起来非常灵活。但正由于如此,初学者假如不深入理解语言本身,往往会犯少量错误,从而导致少量很难发现的 bug。

抛开 JavaScript 语言设计层面的问题不说,毕竟它是 Brendan Eich 当年用短短十天时间设计出来的,有点缺陷也是在所难免。作为开发者,我们该怎么避免少量常见的低级错误呢?本文就列举几个常见错误,看看你有没有似曾相识。

混淆 undefined 和 null

JavaScript 中的undefinednull 都可用来表示没有值,但是二者之间有所区别。undefined字面意思是“未定义”,但它的含义其实已经超出了变量未定义的范畴:尝试读取对象不存在的属性、没有return语句的函数的返回值、公告后没有赋值的变量甚至显式赋值为undefined的变量等,它们的结果都是undefined。用typeof测试它的类型,是字符串 'undefined'。而 null 就比较纯粹了,变量只有设置为null 才有这个值。另外,null 是对象类型,即typeof(null)的值是字符串'object'

需要注意的是,用if判断这两个值都是false,而且null==undefined是成立的,这一点初学者通常容易搞混。因而,尽量统一把“没有值”都设置为undefined,这样就省去了判断区分的麻烦。

返回 undefined的函数:

const f = () => {}

设置变量的值为 undefined

x = undefined;

判断属性能否为 undefined

typeof obj.prop === 'undefined'obj.prop === undefined

判断变量能否为 undefined

typeof x === 'undefined'

变量公告后没有赋值,自动就有了 undefined值。

假如肯定要判断null,用全等判断:

obj.prop === nullx === null

使用 typeof 是无法判断 null的,由于它是对象类型。

混淆数字相加和字符串拼接

在 JavaScript 中,加号 +操作符既可用于数字相加,也可以用于字符串拼接。因为 JavaScript 是动态语言,操作符会自动将变量转成相同数据类型再运算。比方:

let x = 1 + 1; // 2

结果是 2,是我们期望的数字相加操作,由于两个值都是数字。

但是,假如是下面这种表达式:

let x = 1 + '1'; // “11”

结果是'11',由于第一个数字会转换成字符串。这里的加号+运算符被用作字符串拼接,而不是数字相加。这里能直接看到表达式的值还算清楚,假如是由多个变量组成的表达式就很难判断类型了。

为理解决这个问题,我们可以把字符串都转成数字类型,再进行运算。例如:

let x = 1;  let y = '2';  let z = Number(x) + Number(y);

这样,运行结果就是3了。 Number函数接收任意类型的值,假如能转成数字就返回数字,否则返回NaN。还可以用 new Number(...).valueOf()函数:

let x = 1;  let y = '2';  let z = new Number(x).valueOf() + new Number(y).valueOf();

因为 new Number(...) 是实例化一个构造函数,返回的是一个对象,并不是数字类型。假如要得到原始的数字类型,需要用该对象的valueOf方法。其实还有个更简洁的方法:

let x = 1;  let y = '2';  let z = +x + +y;

变量前面的 + 作用是将它转换成数字,或者者NaN ,跟Number函数的作用相同。

return 语句换行问题

JavaScript 语法规定换行代表语句结束。例如:

const add = (a, b) => {    return    a + b;  }add(1,2); // undefined

本以为会返回 3,实际上是undefined。这是由于在a + b之前,函数已经执行了return。要处理这个问题,有两个做法:要么把表达式跟return放在一行,要么把表达式套一层括号。

const add = (a, b) => {    return a + b;  }// 或者者const add = (a, b) => {    return (      a + b    );  }

加括号为什么可以换行呢?由于括号里的是表达式,不是语句。表达式可以拆成多行,假如很长的话。用箭头函数会更直观:

const add = (a, b) => a + b

箭头函数里的单行表达式自带return效果,当然也可以在表达式外面套一层括号:

const add = (a, b) => (a + b)

这个括号在返回对象字面量的箭头函数里有点用处,由于不加圆括号()的话,{}只是函数体的开始和结束标记,要返回对象字面量,还要显式return {...}

假如某行代码中的语句不完整,JavaScript 解析器会将下一行的语句合并一起解析。比方:

const power = (a) => {    const      power = 10;    return a ** 10;  }// 等同于:const power = (a) => {    const  power = 10;    return a ** 10;  }

但是对于完整的语句,比方return,就不会合并多行。

用 return 跳出 forEach 循环

JavaScript 数组有个 forEach 方法,用于对数组元素进行循环操作。初学者很容易联想到 for循环的break或者continue关键字,用来停止循环。但是对不起,forEach没有这两个关键字。那用return行不行?可以用,但它的作用就是提前返回函数,跟continue的效果相似,用于结束本次循环。要跳出整个循环,return做不到。

const nums = [1, 2, 3, 4, 5, 6];let firstEven;nums.forEach(n => {  if (n % 2 ===0 ) {    firstEven = n;    return n;  }});console.log(firstEven); // 6

代码本意是想找出第一个偶数,找到就退出循环。但实际并没有退出循环,因而最终结果是最后一个偶数。
有处理办法吗?这种情况可以用for循环,或者者用数组filterfind之类的方法。

总结

尽管 JavaScript 很容易上手,但稍不注意还是比较容易犯错。本文简单详情了几种容易犯的错,希望对你有所帮助。

更多前台技术干货尽在微信公众号:1024译站


微信公众号:1024译站
  • 全部评论(0)
最新发布的资讯信息
【系统环境|】在Qt中如何设置窗体的背景图片(2025-10-29 20:27)
【系统环境|】无声无名 | 杨·罗威斯终身回顾展(2025-10-29 20:26)
【系统环境|】从零开始学Qt(22):QSS详解(3)- 盒子模型(2025-10-29 20:25)
【系统环境|】Quarkus vs Spring Boot 集成 RabbitMQ 谁更香?(2025-10-29 20:24)
【系统环境|】RabbitMQ相关概念及代码示例(2025-10-29 20:24)
【系统环境|】Spring Boot + RabbitMQ:轻松掌握五种基本工作模式(2025-10-29 20:23)
【系统环境|】一篇文章带你彻底玩转-RabbitMQ(2025-10-29 20:22)
【系统环境|】私有云平台搭建——史上最详细(2025-10-29 20:21)
【系统环境|】RabbitMQ最全详解(万字图文总结)(2025-10-29 20:20)
【系统环境|】.Net/C#全网最火RabbitMQ操作【强烈推荐】(2025-10-29 20:20)
手机二维码手机访问领取大礼包
返回顶部