JavaScript中常见的八个陷阱总结


Posted in Javascript onJune 28, 2017

前言

这里我们针对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`。 (备注:可以参考这篇文章 https://3water.com/article/117343.htm)
  • - 使用`bind`函数。(备注:可以参考这篇文章 https://3water.com/article/115323.htm)
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

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

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

asyncGreet () {
 this.someThingAsync()
 .then(this.greet.bind(this))
}

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

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

class Foo {
 constructor (name) {
 this.name = name
 this.greet = this.greet.bind(this)
 }
}

- 你也可以使用箭头函数(=>)来防止作用域被修改。 (备注:可以参考这篇文章 https://3water.com/article/115318.htm)  

asyncGreet () {
 this.someThingAsync()
 .then(() => {
 this.greet()
 })
}

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

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

因为Math.min() 返回 Infinity, 而 Math.max()返回 -Infinity。

原文: Who said javascript was easy ?

译者: Fundebug

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
匹配任意字符的正则表达式写法
Apr 29 Javascript
使用JS进行目录上传(相当于批量上传)
Dec 05 Javascript
AngularJS入门教程之过滤器详解
Aug 19 Javascript
Bootstrap CSS布局之表单
Dec 17 Javascript
jQuery扇形定时器插件pietimer使用方法详解
Jul 18 jQuery
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
Aug 22 Javascript
详解如何在angular2中获取节点
Nov 23 Javascript
jQuery实现动态控制页面元素的方法分析
Dec 20 jQuery
AngularJS中重新加载当前路由页面的方法
Mar 09 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
Oct 25 Javascript
Vue开发之封装上传文件组件与用法示例
Apr 25 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
May 27 jQuery
通过构造函数实例化对象的方法
Jun 28 #Javascript
JS之if语句对接事件动作逻辑(详解)
Jun 28 #Javascript
CSS3+JavaScript实现翻页幻灯片效果
Jun 28 #Javascript
Node.js 8 中的重要新特性
Jun 28 #Javascript
Angular排序实例详解
Jun 28 #Javascript
基于JS对象创建常用方式及原理分析
Jun 28 #Javascript
Node.js实现文件上传的示例
Jun 28 #Javascript
You might like
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
jquery 操作表格实现代码(多种操作打包)
2011/03/20 Javascript
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
JavaScript返回0-1之间随机数的方法
2015/04/06 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
2020/08/24 Javascript
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
Fabric 应用案例
2016/08/28 Python
python生成随机图形验证码详解
2017/11/08 Python
python模块导入的细节详解
2018/12/10 Python
用Python解决x的n次方问题
2019/02/08 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
python操作excel让工作自动化
2019/08/09 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
大学生蛋糕店创业计划书
2014/01/13 职场文书
后备干部考察材料
2014/02/12 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
初中成绩单评语
2014/12/29 职场文书
离婚案件上诉状
2015/05/23 职场文书
企业宣传稿范文
2015/07/23 职场文书