JavaScript中8个容易犯的错误
这里dbestech针对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
来绑 。
- //code from http://caibaojian.com/8-javascript-attention.html
- 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
因为Math.min() 返回 Infinity, 而 Math.max()返回 -Infinity。
JavaScript中8个容易犯的错误的更多相关文章
- C#中几个经常犯的错误总汇
在我们平常编程中,时间久了有时候会形成一种习惯性的思维方式,形成固有的编程风格,但是有些地方是需要斟酌的,即使是一个很小的错误也可能会导致昂贵的代价,要学会善于总结,从错误中汲取教训,尽量不再犯同样错 ...
- 在ABP框架中使用MapTo容易犯的错误
用自己的话说:MapTo其实就是两个实体间的数据转换.不用像以前那样p.name=p1.name 这样赋值,一旦实体的属性多到十几个以上的时候,这样赋值代码就显得有些臃肿了,如下面: Resource ...
- python中IF语句容易犯的错误CASE
python中没有switch case类似的语句,但是下面的IF语句却与之类似,却又不同: A = B = C = D = E = 1 if A == 1: B=2 elif B ==2: C= ...
- JavaScript中的类继承
JavaScript是一个无class的面向对象语言,它使用原型继承而非类继承.这会让那些使用传统面向对象语言如C++和Java的程序员们感到困惑.正如我们所看到的,JavaScript的原型继承比类 ...
- 【转】十个JavaScript中易犯的小错误,你中了几枪?
目录 常见错误一:对于this关键词的不正确引用 常见错误二:传统编程语言的生命周期误区 常见错误三:内存泄露 常见错误四:比较运算符 常见错误五:低效的DOM操作 常见错误6:在for循环中的不正确 ...
- 十个JavaScript中易犯的小错误,你中了几枪?
序言 在今天,JavaScript已经成为了网页编辑的核心.尤其是过去的几年,互联网见证了在SPA开发.图形处理.交互等方面大量JS库的出现. 如果初次打交道,很多人会觉得js很简单.确实,对于很多有 ...
- javascript中易犯的错误有哪些
javascript中易犯的错误有哪些 一.总结 一句话总结: 比如循环中函数的使用 函数中this的指向谁(函数中this的使用) 变量的作用域 1.this.timer = setTimeout( ...
- JavaScript中错误正确处理方式,你用对了吗?
JavaScript的事件驱动范式增添了丰富的语言,也是让使用JavaScript编程变得更加多样化.如果将浏览器设想为JavaScript的事件驱动工具,那么当错误发生时,某个事件就会被抛出.理论上 ...
- 在CMMI推广过程中EPG常犯的错误(转)
本文转自: http://developer.51cto.com/art/200807/86953.htm 仅用于个人收藏,学习.如有转载,请联系原作者. ---------------------- ...
随机推荐
- THU 上机 最小邮票数 暴力枚举
链接:https://www.nowcoder.com/questionTerminal/83800ae3292b4256b7349ded5f178dd1?toCommentId=2533792来源: ...
- 3、pandas
原文出处: pandas.pydata.org 译文出处:石卓林 这是关于pandas的简短介绍,主要面向新用户.可以参阅Cookbook了解更复杂的使用方法. 链接:http://python. ...
- CentOS中源码编译安装Nginx
1.从官网通过wget命令将Nginx源码包下载到Linux上 Nginx下载页面:http://nginx.org/en/download.html 2.在Linux上安装需要依赖的环境 yum ...
- php中magic_quotes_gpc的作用 解决日文数据提交后多出来反斜杠的问题
magic_quotes_gpc发生作用是在传递$_GET,$_POST,$_COOKIE时 1.条件: magic_quotes_gpc=off写入数据库的字符串未经过任何过滤处理.从数据库读出的字 ...
- gevent 传参, 中文编码
#coding=utf-8 import os from gevent import monkey,pool monkey.patch_all() import gevent import time ...
- 老男孩python作业6-选课系统开发
角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. 课程包含,周期,价格 ...
- 启用和禁用TCPIP上的Netbios
'设置传输值1是启用,设置2为禁用 On Error Resume Next strComputer = "." Set objWMIService = GetObject(&qu ...
- 事件获取目标 currentTarget target srcElement 三者之间的区别和联系
currentTarget 指的是触发事件的当前对象,可以是冒泡和捕获的对象,不一定是点击或者鼠标移入等事件的直接触发对象.可以是他的父元素等. target 指的是事件触发的直接对象.IE有兼容 ...
- [微信小程序] -- wxss引用外部css文件及iconfont
小程序引入外部文件的方式是: 只需要在其css文件写上: @import "外部css地址.wxss"; 因为项目需要, 小程序中需要使用iconfont , 很容易就想到了H5的 ...
- vue 的计算属性computed自我理解
类型:{ [key: string]: Function | { get: Function, set: Function } } 计算属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算.注意, ...