千家信息网

JavaScript中常见的陷阱有哪些

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要讲解了"JavaScript中常见的陷阱有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"JavaScript中常见的陷阱有哪些"吧!1
千家信息网最后更新 2026年11月04日JavaScript中常见的陷阱有哪些

这篇文章主要讲解了"JavaScript中常见的陷阱有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"JavaScript中常见的陷阱有哪些"吧!

1. 你是否尝试过对数组元素进行排序?

JavaScript默认使用字典序(alphanumeric)来排序。因此,[1,2,5,10].sort()的结果是[1, 10, 2, 5]。

如果你想正确的排序,应该这样做:[1,2,5,10].sort((a, b) => a - b)

2. new Date() 十分好用

new Date()的使用方法有:

不接收任何参数:返回当前时间;

接收一个参数x: 返回1970年1月1日 + x毫秒的值。

new Date(1, 1, 1)返回1901年2月1号。

然而….,new Date(2016, 1, 1)不会在1900年的基础上加2016,而只是表示2016年。

3. 替换函数没有真的替换?

let s = "bob"

const replaced = s.replace('b', 'l')

replaced === "lob" // 只会替换掉第一个b

s === "bob" // 并且s的值不会变

如果你想把所有的b都替换掉,要使用正则:

"bob".replace(/b/g, 'l') === 'lol'

4. 谨慎对待比较运算

// 这些可以

'abc' === 'abc' // true

1 === 1 // true

// 然而这些不行

[1,2,3] === [1,2,3] // false

{a: 1} === {a: 1} // false

{} === {} // false

因为[1,2,3]和[1,2,3]是两个不同的数组,只是它们的元素碰巧相同。因此,不能简单的通过===来判断。

5. 数组不是基础类型

typeof {} === 'object' // true

typeof 'a' === 'string' // true

typeof 1 === number // true

// 但是....

typeof [] === 'object' // true

如果要判断一个变量var是否是数组,你需要使用Array.isArray(var)。

6. 闭包

这是一个经典的JavaScript面试题:

const Greeters = []

for (var i = 0 ; i < 10 ; i++) {

Greeters.push(function () { return console.log(i) })

}

Greeters[0]() // 10

Greeters[1]() // 10

Greeters[2]() // 10

虽然期望输出0,1,2,…,然而实际上却不会。知道如何Debug嘛?

有两种方法:

使用let而不是var。备注:可以参考Fundebug的另一篇博客 ES6之"let"能替代"var"吗?

使用bind函数。备注:可以参考Fundebug的另一篇博客 JavaScript初学者必看"this"

Greeters.push(console.log.bind(null, i))

当然,还有很多解法。这两种是我最喜欢的!

7. 关于bind

下面这段代码会输出什么结果?

class Foo {

constructor(name) {

this.name = name

}

greet() {

console.log('hello, this is ', this.name)

}

someThingAsync() {

return Promise.resolve()

}

asyncGreet() {

this.someThingAsync().then(this.greet)

}

}

new Foo('dog').asyncGreet()

如果你说程序会崩溃,并且报错:Cannot read property 'name' of undefined。

1、因为第16行的geet没有在正确的环境下执行。当然,也有很多方法解决这个BUG!

我喜欢使用bind函数来解决问题:

asyncGreet () {

this.someThingAsync()

.then(this.greet.bind(this))

}

这样会确保greet会被Foo的实例调用,而不是局部的函数的this。

2、如果你想要greet永远不会绑定到错误的作用域,你可以在构造函数里面使用bind来绑 。

class Foo {

constructor(name) {

this.name = name this.greet = this.greet.bind(this)

}

}

3、你也可以使用箭头函数(=>)来防止作用域被修改。备注:可以参考Fundebug的另一篇博客 JavaScript初学者必看"箭头函数"。

asyncGreet() {

this.someThingAsync().then(() = >{

this.greet()

})

}

8. Math.min()比Math.max()大

Math.min() < Math.max() // false

感谢各位的阅读,以上就是"JavaScript中常见的陷阱有哪些"的内容了,经过本文的学习后,相信大家对JavaScript中常见的陷阱有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

函数 常见 陷阱 数组 博客 备注 方法 参考 学习 排序 作用 元素 内容 初学者 参数 只是 基础 箭头 结果 问题 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 保险科技 互联网保险 互联网科技工作委员会 蓝思科技飞鸽互联网 互联网巨头科技公司 互联网与未来科技 易通互联网络科技有限公司 广州善班互联网科技 互联网公司会议桌创意科技软装饰 富国互联网科技创新基金 哈尔滨屹滨互联网科技有限公司 想开互联网科技公司怎么样 天津腾达互联网科技有限公司 无锡工业互联网科技有限公司 互联网科技快讯热点 2021世界互联网领先科技成果发布 南京一网一红互联网科技有限公司 三亚科技创新互联网基地 上海旺乐尼互联网科技有限公司 东风日产互联网科技公司叫什么 小牛互联网科技有限公司地址 保险科技 互联网保险 互联网教育科技公司vipkid 团飞科技与伯堂互联网服务平台 受益于互联网科技的高速发展 崇明区互联网教育科技诚信经营 厦门千工互联网科技有限公司 亳州好赞互联网科技有限公司 宇信科技在杭州互联网排第几 互联网公司属于科技吗 利用互联网等科技手段
0