JavaScript 简单吗
英文:Aurélien Hervé 译文:众成翻译/msmailcode
这里有一些 Javascript初学者应该知道的技巧和陷阱。如果你已经是专家了,顺便温习一下。
Javascript也只不过是一种编程语言。怎么可能出错嘛?
1. 你有没有尝试给一组数字排序?
Javascript 的sort()函数在默认情况下使用字母数字(字符串Unicode码点)排序。
所以[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 毫秒。 了解 Unix 的人知道为什么。
new Date(1, 1, 1) 返回 1901, 二月 , 1号。因为,第一个参数表示1900年加1年,第二个参数表示这一年的第二个月(因此是二月) — 脑回路正常的人会从1开始索引 — ,第三个参数很明显是这个月的第一天,所以1 — 有时候索引确实从1开始 — 。
new Date(2016, 1, 1) 不会给1900年加上2016。它仅代表2016年。
3. Replace 并不“替代”
let s = "bob"
const replaced = s.replace('b', 'l')
replaced === "lob"
s === "bob"
我觉得这是一件好事,因为我不喜欢函数改变它们的输入。 你还应该知道 replace 只会替换第一个匹配的字符串:
如果你想替换所有匹配的字符串,你可以使用带/g标志的正则表达式 :
"bob".replace(/b/g, 'l') === 'lol' // 替换所有匹配的字符串
4. 比较的时候要注意
// These are ok
'abc' === 'abc' // true
1 === 1 // true
// These are not
[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
// But....
typeof [] === 'object' // true
如果你想知道你的变量是不是数组,你仍然可以用Array.isArray(myVar)
6. 闭包
这是一个很有名的面试题:
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… ? 你知道它为什么不是这样输出的吗? 你会怎样修改让它输出 0, 1, 2… ?
这里有两种可能的解决方法:
用 let 替代 var. Boom. 解决了.
let和var的不同在于作用域。var的作用域是最近的函数块,let的作用域是最近的封闭块,封闭块可以小于函数块(如果不在任何块中,则let和var都是全局的)。
替代方法: 用 bind:
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,给你一分。
原因: greet 没有在正确的上下文中运行。同样,这个问题依然有很多解决方案。
我个人喜欢
asyncGreet() {
this.someThingAsync()
.then(this.greet.bind(this))
}
这样可以确保类的实例作为上下文调用greet。
如果你认为greet 不应该在实例上下文之外运行, 你可以在类的constructor中绑定它:
class Foo {
constructor(name) {
this.name = name
this.greet = this.greet.bind(this)
}
}
你还应该知道箭头函数( => )可以用来保留上下文。这个方法也可以:
asyncGreet() {
this.someThingAsync()
.then(() = > {
this.greet()
})
}
尽管我认为最后一种方法并不优雅。
我很高兴我们解决了这个问题。
总结
祝贺你,你现在可以放心地把你的程序放在互联网上了。
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
343599877,我们一起学前端!
JavaScript 简单吗的更多相关文章
- JavaScript简单入门(补充篇)
本文是对上一篇 JavaScript简单入门 的一些细节补充. 一.全局变量和局部变量 在<script>标签内定义的变量是当前页面中的全局变量.即 <script>标签可以直 ...
- 《javascript高级程序设计》读书笔记(一)javascript简单介绍
第一章:javascript简单介绍 Netscape Navigator 开发的javascript Javascript的实现有三部分: 1.核心(ECMAScript):提供核心语言功能. ...
- Javascript 简单实现鼠标拖动DIV
http://zhangbo-peipei-163-com.iteye.com/blog/1740078 比较精简的Javascript拖动效果函数代码 http://www.jb51.net/art ...
- [Java Web] 4、JavaScript 简单例子(高手略过)
内容概览: JavaScript简介 JavaScript的基本语法 JavaScript的基本应用 JavaScript的事件处理 window对象的使用 JavaScript简介: JavaScr ...
- javascript - 简单实现一个图片延迟加载的jQuery插件
最近在看一本书<Third-Party Javascript>很不错,推荐给大家,下载地址各位自己搜索了. 步骤: 1.打开google,鉴于google基本打不开,那么就打开这个网址吧. ...
- javascript 简单的计算器
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...
- 哈希表(hashtable)的javascript简单实现
javascript中没有像c#,java那样的哈希表(hashtable)的实现.在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的 ...
- 简述一个javascript简单继承工具的实现原理
背景 由于本人非常希望能够开发自己的游戏,所以业余时间一直在想着能不能自己一些好玩又有趣的东西出来,最近随着steam上众多独立游戏的爆发,感觉自己又燃烧了起来,所以又拾起了很久以前的一个2d引擎,决 ...
- 谁说 JavaScript 简单的?
这里有一些 Javascript初学者应该知道的技巧和陷阱.如果你已经是专家了,顺便温习一下. Javascript也只不过是一种编程语言.怎么可能出错嘛? 1. 你有没有尝试给一组数字排序? Jav ...
- JavaScript简单了解
一.JavaScript 的诞生历史 在最初的时候 JS 主要解决的问题是一些服务器端语言(perl)对数据的 验证功能,在js 出现之前要对表单的数据进行验证需要将数据提交到服务器 端之后才能验证数 ...
随机推荐
- huhamhire-hosts — Hosts文件自动配置工具
https://www.anotherhome.net/1376 推荐配合EasyGoAgent使用: EasyGoAgent — 开箱即用的GoAgent Update 2015.5.15 数据文件 ...
- 【树论 1】 prim算法的学习和使用
进阶版神犇可以看看本题解的姊妹篇 Kruskal算法的学习和使用 下面的内容是prim算法 但是最小生成树是什么呢? 标准定义如下:在边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值 ...
- 案例:Redis在京东的使用技术模型图
http://www.100ec.cn 2013年09月27日17:30 中国电子商务研究中心 我要投稿 产品服务 (中国电子商务研究中心讯)Redis是一个开源的,遵守BSD许可协议的key ...
- 导入eclipse工程到Android Studio中
ref:从 Eclipse 迁移至 Android Studio | Android Studiohttps://developer.android.com/studio/intro/migrate. ...
- UESTC--1468
题目:A Coin Problem 原题链接:http://acm.uestc.edu.cn/problem.php?pid=1468 分析:满足裴波纳契数列,打表找周期. #include<i ...
- 【题解】Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths Codeforces 741D DSU on Tree
Prelude 很好的模板题. 传送到Codeforces:(* ̄3 ̄)╭ Solution 首先要会DSU on Tree,不会的看这里:(❤ ω ❤). 众所周知DSU on Tree是可以用来处 ...
- 【Asp.net入门4-04】使用Nuget
- vue 倒计时返回首页
1. vue页面15分钟无操作时返回首页 2. 基于vue的倒计时demo 3. 在vue2.0项目中一个简单的倒计时功能 4. vue重新发送验证码 5. 表格<td>里面文字垂直显示
- 【重要】Nginx模块Lua-Nginx-Module学习笔记(三)Nginx + Lua + Redis 已安装成功(非openresty 方式安装)
源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一. 目标 使用Redis做分布式缓存:使用lua API来访问redis缓存:使用nginx向客户端提 ...
- Linux命令-xargs
比如一个例子 echo "README.md" |cat echo "README.md" |xargs cat 第一个例子只是输出了README.md的文件名 ...