JavaScript初学者容易犯的几个错误

 更新时间:2021年05月08日 10:17:15   作者:李中凯  
JavaScript 是对初学者比较友好的一门编程语言,基本上花个半小时看下语法就能写出能运行的代码。JavaScript 是动态脚本语言,对数据类型没有太多的限制,写起来非常灵活。但正因为如此,初学者如果不深入了解语言本身,往往会犯一些错误,从而导致一些很难发现的 bug。

前言

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

混淆 undefined 和 null

JavaScript 中的undefined和null都可用来表示没有值,但是二者之间有所区别。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 === null
x === 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循环,或者用数组filter、find之类的方法。

总结

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

以上就是JavaScript初学者容易犯的几个错误的详细内容,更多关于JS的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript实现文本中间缩略的两种方案

    JavaScript实现文本中间缩略的两种方案

    项目中经常会遇到缩略展示文字的场景,即要求文字在一行不换行展示,超出自动展示...,常用的展示效果有两种,文字中间缩略以及文字末尾缩略,本文将通过代码示例给大家详细的讲一下这两种方案,需要的朋友可以参考下
    2024-06-06
  • MyEclipse取消验证Js的两种方法

    MyEclipse取消验证Js的两种方法

    通过js写一个web工程的相关页面时感觉很卡,修改内存也不行下面有两种解决方法,大家可以尝试下
    2013-11-11
  • 全面解析Bootstrap中tooltip、popover的使用方法

    全面解析Bootstrap中tooltip、popover的使用方法

    这篇文章主要为大家详细解析了Bootstrap中tooltip、popover的使用方法,了解提示框、弹出框的实现原理,感兴趣的朋友可以参考一下
    2016-06-06
  • 微信小程序如何实现列表渲染和条件渲染

    微信小程序如何实现列表渲染和条件渲染

    微信小程序也是有列表渲染和条件渲染的,下面这篇文章主要给大家介绍了关于微信小程序如何实现列表渲染和条件渲染的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 深入理解JavaScript Promise链式调用与错误处理机制

    深入理解JavaScript Promise链式调用与错误处理机制

    在JavaScript的异步编程中,Promise是一个非常重要的概念,它允许我们以链式的方式处理异步操作,使得代码更加清晰和易于管理,本文将通过一系列代码示例,深入探讨Promise的链式调用和错误处理机制,需要的朋友可以参考下
    2024-09-09
  • 学习JavaScript设计模式之单例模式

    学习JavaScript设计模式之单例模式

    这篇文章主要为大家介绍了JavaScript设计模式中的单例模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下
    2016-01-01
  • javascript中一些数组常用的API总结

    javascript中一些数组常用的API总结

    Js中数组是一个重要的数据结构,它相比于字符串有更多的方法,本篇文章总结了一些数组中常用的API,我们把它们分成两类,一类是会改变原始数组,一类是不会改变原始数组,感兴趣的小伙伴可以学习一下
    2023-09-09
  • javascript删除数组元素并且数组长度减小的简单实例

    javascript删除数组元素并且数组长度减小的简单实例

    本篇文章主要是对javascript删除数组元素并且数组长度减小的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • Javascript中的async awai的用法

    Javascript中的async awai的用法

    本篇文章主要介绍了Javascript中的async/awai的用法,将分享async / await是如何工作的,有兴趣的可以了解一下
    2017-05-05
  • 微信小程序实现密码显示与隐藏的睁眼闭眼功能

    微信小程序实现密码显示与隐藏的睁眼闭眼功能

    这篇文章主要介绍了微信小程序实现密码显示与隐藏的睁眼闭眼功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02

最新评论