21 JavaScript 学习:一些误区和易错点

简介: 21 JavaScript 学习:一些误区和易错点

赋值运算符应用错误

在 JavaScript 中,赋值运算符(Assignment Operators)用于给变量赋值。常见的赋值运算符包括 =+=-=*=/= 等。如果赋值运算符的应用不正确,可能会导致程序出现错误或产生意外的结果。

以下是一些常见的赋值运算符应用错误示例:

  1. 误将比较运算符 == 误写为赋值运算符 =
// 错误示例
let x = 10;
if (x = 5) {
    console.log("x 等于 5");
}
// 这里实际上是将 x 赋值为 5,而不是比较 x 是否等于 5
  1. 连续赋值时,应用错误的赋值运算符:
// 错误示例
let a = 5;
let b = 10;
let c = 15;
a = b = c; // 这里实际上是将 b 赋值为 c,然后将 a 赋值为 b 的值(即 c),而不是同时将 a、b、c 都赋值为 15
  1. 使用错误的赋值运算符导致意外结果:
// 错误示例
let x = "Hello";
x += 5; // x 的值会变为 "Hello5",而不是将 x 转为数字后相加

要避免赋值运算符的应用错误,建议在编写代码时仔细检查赋值语句,确保赋值操作符的使用符合预期,避免出现意外的结果。同时,建议对赋值运算符的用法有一定的了解,以避免常见的错误。

比较运算符常见错误

在 JavaScript 中,比较运算符用于比较两个值,并返回一个布尔值(true 或 false)。常见的比较运算符包括 =====!=!==><>=<= 等。如果比较运算符的应用不正确,可能会导致程序出现错误或产生意外的结果。

以下是一些常见的比较运算符应用错误示例:

  1. 使用 == 进行比较时,不考虑数据类型:
// 错误示例
if (1 == "1") {
    console.log("相等");
}
// 在使用 `==` 比较时,会进行类型转换,导致数字 1 和字符串 "1" 相等
  1. 使用 === 进行比较时,数据类型不一致:
// 错误示例
if (1 === "1") {
    console.log("相等");
}
// 在使用 `===` 比较时,不会进行类型转换,数字 1 和字符串 "1" 类型不同,不相等
  1. 混淆 >>=<<=
// 错误示例
if (5 > 10) {
    console.log("5 大于 10");
}
// 该条件永远不会成立,应该使用 `<` 来比较
  1. 混淆 !=!==
// 错误示例
if (1 != "1") {
    console.log("不相等");
}
// 该条件会成立,因为 `!=` 会进行类型转换,导致数字 1 和字符串 "1" 不相等

要避免比较运算符的常见错误,建议在编写代码时仔细检查比较表达式,确保比较运算符的使用符合预期,避免出现意外的结果。同时,建议对比较运算符的用法有一定的了解,以避免常见的错误。

加法与连接注意事项

在 JavaScript 中,加法运算符 + 既可以用于数学加法,也可以用于字符串连接。当 + 运算符的其中一个操作数是字符串时,JavaScript 会将其它操作数转换为字符串,然后执行字符串连接操作。这种隐式类型转换可能导致一些意外的结果,因此在使用 + 运算符时需要注意一些事项:

  1. 字符串连接优先级高于数学加法:
// 字符串连接优先级高于数学加法
console.log(1 + 2 + "3"); // 输出 "33",先执行数学加法,再执行字符串连接
console.log("1" + 2 + 3); // 输出 "123",先执行字符串连接
  1. 当其中一个操作数为字符串时,其他操作数会被转换为字符串:
let num = 5;
let str = "10";
console.log(num + str); // 输出 "510",数值 5 被转换为字符串与 "10" 连接
  1. 使用括号明确指定运算顺序:
let num1 = 10;
let num2 = 20;
console.log(num1 + num2 + "30"); // 输出 "3030",先执行数学加法,再执行字符串连接
console.log(num1 + (num2 + "30")); // 输出 "102030",使用括号指定运算顺序
  1. 使用模板字符串进行字符串拼接:
let name = "Alice";
let age = 30;
console.log(`My name is ${name} and I am ${age} years old.`);
// 使用模板字符串可以更清晰地进行字符串拼接,避免混淆

通过注意以上事项,可以更好地避免在使用 + 运算符时产生意外的结果,确保代码的可读性和正确性。

浮点型数据使用注意事项

在 JavaScript 中,浮点数(Floating-point numbers)是一种用于表示小数的数据类型。由于浮点数的内部表示方式是基于二进制,因此在进行浮点数运算时可能会出现精度丢失或舍入误差的情况。以下是一些使用浮点数时需要注意的事项:

  1. 避免直接比较浮点数:
let a = 0.1;
let b = 0.2;
if (a + b == 0.3) {
    console.log("相等");
} else {
    console.log("不相等");
}
// 由于浮点数精度问题,可能导致 a + b 不等于 0.3,应该使用误差范围来比较
  1. 使用toFixed()方法控制小数位数:
let num = 0.1 + 0.2;
console.log(num.toFixed(2)); // 输出 "0.30"
// 使用 to() 方法可以控制小数的位数,避免精度问题
  1. 小数运算可能产生不精确结果:
console.log(0.1 + 0.2); // 输出 0.30000000000000004,由于浮点数精度问题导致不精确结果
  1. 使用整数进行数学运算后再转换为浮点数:
let a = 0.1;
let b = 0.2;
let result = (a * 10 + b * 10) / 10;
console.log(result); // 输出 先将浮点数转换为整数进行运算,再转换回浮点数
  1. 使用库如Decimal.js进行精确计算:
// 使用第三方库 Decimal.js 进行精确计算
const { Decimal } = require('decimal.js');
let a = new Decimal('0.1');
let b = new Decimal('0.2');
let result = a.plus(b);
console.log(result.toString()); // 输出 "0.3"

通过注意以上事项,可以避免在处理浮点数时可能出现的精度问题,确保计算结果的准确性。

字符串分行

在 JavaScript 中,可以使用字符串字面量(string literals)来创建包含换行的多行字符串。有几种方法可以在 JavaScript 中创建多行字符串:

  1. 使用反斜杠 \ 进行字符串分行:
let multiLineString = "This is a multi-line \
string in JavaScript.";
console.log(multiLineString);
  1. 使用模板字符串(template literals)来创建多行字符串:
let multiLineString = `This is a multi-line
string in JavaScript.`;
console.log(multiLineString);
  1. 使用字符串连接符 + 来连接多行字符串:
let multiLineString = "This is a multi-line " +
                     "string in JavaScript.";
console.log(multiLineString);

无论使用哪种方法,都可以在 JavaScript含换行的多行字符串。这些方法使得代码更易读和维护,特别是当需要处理大段文本时。

错误的使用分号

在 JavaScript 中,分号 ; 用于分隔语句,通常用于表示语句的结束。在大多数情况下,JavaScript 引擎会自动插入分号来结束语句,这种现象被称为自动分号插入(Automatic Semicolon Insert,ASI)。然而,如果在某些情况下错误地使用分号,可能会导致意外的行为或错误。

以下是一些错误的使用分号的示例:

  1. 不应该在代码块的末尾使用分号:
if (condition) {
    // do something;
}
// 分号不应该在代码块的末尾,会导致语法错误
  1. 不应该在函数表达式的末尾使用分号:
let myFunction = function() {
    // function body;
};
// 在函数表达式的末尾使用分号会导致语法错误

3.使用分号:

let myObject = {
    key1: "value1",
    key2: "value2",
};
// 在对象字面量的末尾使用分号会导致语法错误
  1. 不应该在循环语句的末尾使用分号:
for (let i = 0; i < 10; i++) {
    // loop body;
};
// 在循环语句的末尾使用分号会导致语法错误

在以上情况下,错误地使用分号可能导致语法错误或意外的行为。因此,在编写 JavaScript 代码时,需要注意分号的使用规则,避免在不应该使用分号的地方号。如果确定需要在某个地方使用分号,可以参考 JavaScript 的语法规范或工具的代码检查功能来帮助确保代码的正确性。

return 语句使用注意事项

在 JavaScript 中,return 语句用于从函数中返回一个值,并终止函数的执行。在使用 return 语句时,有一些注意事项需要考虑:

  1. 位置: return 语句可以出现在函数的任何位置,但一旦执行 return,函数将立即停止执行并返回指定的值。
  2. 返回值: return 语句可以返回任何类型的值,包括基本数据类型(如数字、字符串布尔值)、对象、数组等。
  3. 返回多个值: JavaScript 中的 return 语句只能返回一个值。如果需要返回多个值,可以将它们封装在一个对象或数组中返回。
  4. 未指定返回值: 如果 return 后面没有跟任何值,或者没有 return 语句,则函数将返回 undefined
  5. 条件返回: 可以根据条件使用 return 语句提前退出函数。这在避免深度嵌套的情况下特别有用。
  6. 不要在 return 后面添加代码: return 语句后面代码将不会被执行,因此在 return 后面添加代码是没有意义的。

示例:

function sum(a, b) {
    if (a < 0 || b < 0) {
        return " numbers should be positive";
    }
    return a + b;
}
console.log(sum(2, 3)); // 输出 5
console.log(sum(-1, Both numbers should be```

通过遵循以上注意事项,可以更好地使用 return 语句并确保函数的正确行为。

数组中使用名字来索引

使用名称作为索引来访问数组元素时,可能会遇到以下易错点:

  1. 拼写错误:拼写错误是最常见的问题之一。确保你使用的索引名称与数组中实际的键名完全匹配,包括大小写。
  2. 未定义的索引:如果尝试访问一个未定义的索引,会导致出现 undefined。要确保使用的索引在数组中确实存在。
  3. 非字符串索引:在 JavaScript 中,数组里的索引通常是数字类型,而不是字符串。如果你想使用字符串作为索引,应该使用对象(Object)而不是数组。
  4. 数组方法无效:某些数组方法,比如 map、filter 等,可能要求索引是数字。如果使用非数字索引,这些方法可能会产生意外的结果。
  5. JSON 序列化问题:如果你要将数组转换为 JSON 格式的字符串,注意一些特殊情况下使用索引的限制。比如,JSON 字符串化后只能用数字索引的数组。
  6. 不符合规范的键名:在 JavaScript 中,数组是一种特殊的对象,键名必须符合变量命名规范。因此,虽然可以使用任何字符串作为键名,但并不是推荐的做法。

务必小心处理这些易错点,以免出现预料之外的问题。如果你有特定的代码或例子需要讨论,欢迎提供更多细节,我可以给予更具体的帮助。

定义数组元素,最后不能添加逗号

在定义数组时,如果在最后一个元素后面添加逗号,可能会出现一些问题,尤其是在一些 JavaScript 引擎中。为了避免这种问题,应该及时删除最后一个元素后的逗号。

例如,在以下代码中,如果有一个逗号跟在最后一个元素 “C” 后面:

const myArray = ["A", "B", "C",];
• 1

会导致一些 JavaScript 引擎报错,因为这被认为是一个语法错误。为了修复这个问题,你可以简单地删除逗号,让数组定义如下:

const myArray = ["A", "B", "C"];

这样就保证了数组定义的正确性,避免了潜在的问题。请注意检查你的代码中的数组定义,确保没有多余的逗号导致语法错误。

定义对象,最后不能添加逗号

在定义对象时,确保在最后一个属性后面没有添加逗号是非常重要的。在 JavaScript 中,如果在对象定义的最后一个属性后面加上了逗号,可能会导致一些问题,特别是在一些 JavaScript 引擎中。

举个例子,考虑以下对象定义:

const myObject = {
  key1: 'value1',
  key2: 'value2',
  key3: 'value3',
};

如果在最后一个属性 “key3” 后面添加了逗号,有些 JavaScript 引擎会将其视为语法错误,从而导致代码执行失败。

为了避免这种问题,应该确保对象定义的最后一个属性后面没有逗号,代码应该像这样:

const myObject = {
  key1: 'value1',
  key2: 'value2',
  key3: 'value3'
};

这样就可以确保对象定义的正确性,避免了潜在的语法错误。在编写代码时,务必留意对象定义的格式,避免不必要的问题发生。

Undefined 不是 Null

JavaScript 中的 undefinednull 是两个不同的概念。undefined 表示一个变量已经被声明但没有被赋值,或者一个函数没有返回值。而 null 则是一个特殊的关键字,表示一个空对象引用。

程序块作用域

程序块作用域(block scope)在JavaScript中有一些易错点,以下是一些常见的问题和注意事项:

  1. 变量声明提升:在程序块作用域内,使用 var 声明的变量会存在变量声明提升的问题,这意味着无论变量声明在程序块的哪个位置,它都会被提升到当前作用域的顶部。这可能导致在变量赋值之前就可以访问到变量,从而引起意外行为。为了避免这种问题,应该尽量使用 letconst 来声明变量,因为它们不会存在变量声明提升。
  2. 条件语句中的作用域:在 if 语句、for 循环等条件语句中使用 var 声明的变量,其作用域是整个函数,而不是块级作用域。这可能会导致意料之外的作用域问题。使用 let 或 const 可以确保变量的作用域是在当前条件语句的块级作用域内。
  3. 闭包中的作用域:当在内层函数中引用外层函数的变量时,需要注意闭包的作用域问题。如果在内层函数中修改外层函数的变量,可能会导致意外的结果。尽量避免在闭包中修改外层函数的变量,或者使用块级作用域来限制变量的作用范围。
  4. 全局作用域:与程序块作用域相对的是全局作用域。在全局作用域中声明的变量会成为全局对象的属性,容易造成命名冲突和意外的覆盖行为。为了避免这种问题,推荐尽量减少在全局作用域中声明变量,使用模块化和闭包等技术来限制变量的作用范围。

总的来说,在使用程序块作用域时,要特别注意变量声明提升、条件语句中的作用域、闭包中的作用域和全局作用域等问题,合理使用 let 和 const 可以帮助避免许多与作用域相关的常见错误。

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

相关文章
|
1月前
|
Web App开发 JavaScript 前端开发
如何学习JavaScript?
如何学习JavaScript?
39 5
|
2月前
|
JavaScript 前端开发 开发者
VUE 开发——Node.js学习(一)
VUE 开发——Node.js学习(一)
84 3
|
3月前
|
JavaScript
ES6学习(9)js中的new实现
ES6学习(9)js中的new实现
|
1月前
|
JavaScript 前端开发 索引
JavaScript学习第二章--字符串
本文介绍了JavaScript中的字符串处理,包括普通字符串和模板字符串的使用方法及常见字符串操作方法如`charAt`、`concat`、`endsWith`等,适合前端学习者参考。作者是一位热爱前端技术的大一学生,专注于分享实用的编程技巧。
24 2
|
1月前
|
存储 JavaScript 前端开发
JavaScript学习第一章
本文档介绍了JavaScript的基础知识,包括其在网页中的作用、如何通过JavaScript动态设置HTML元素的CSS属性,以及JavaScript中的变量类型(`var`、`let`、`const`)和数据类型(基本数据类型与引用数据类型)。通过实例代码详细解释了JavaScript的核心概念,适合初学者入门学习。
50 1
|
2月前
|
JavaScript
js学习--制作猜数字
js学习--制作猜数字
42 4
js学习--制作猜数字
|
2月前
|
JavaScript
webpack学习五:webpack的配置文件webpack.config.js分离,分离成开发环境配置文件和生产环境配置文件
这篇文章介绍了如何将webpack的配置文件分离成开发环境和生产环境的配置文件,以提高打包效率。
52 1
webpack学习五:webpack的配置文件webpack.config.js分离,分离成开发环境配置文件和生产环境配置文件
|
3月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
3月前
|
JavaScript 前端开发 API
紧跟月影大佬的步伐,一起来学习如何写好JS(上)
该文章跟随月影老师的指导,探讨了编写优质JavaScript代码的三大原则:各司其职、组件封装与过程抽象,通过具体示例讲解了如何在实际开发中应用这些原则以提高代码质量和可维护性。
紧跟月影大佬的步伐,一起来学习如何写好JS(上)
|
2月前
|
JavaScript
js学习--制作选项卡
js学习--制作选项卡
38 4
下一篇
DataWorks