英文: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 简单吗的更多相关文章

  1. JavaScript简单入门(补充篇)

    本文是对上一篇 JavaScript简单入门 的一些细节补充. 一.全局变量和局部变量 在<script>标签内定义的变量是当前页面中的全局变量.即 <script>标签可以直 ...

  2. 《javascript高级程序设计》读书笔记(一)javascript简单介绍

    第一章:javascript简单介绍 Netscape Navigator 开发的javascript   Javascript的实现有三部分: 1.核心(ECMAScript):提供核心语言功能. ...

  3. Javascript 简单实现鼠标拖动DIV

    http://zhangbo-peipei-163-com.iteye.com/blog/1740078 比较精简的Javascript拖动效果函数代码 http://www.jb51.net/art ...

  4. [Java Web] 4、JavaScript 简单例子(高手略过)

    内容概览: JavaScript简介 JavaScript的基本语法 JavaScript的基本应用 JavaScript的事件处理 window对象的使用 JavaScript简介: JavaScr ...

  5. javascript - 简单实现一个图片延迟加载的jQuery插件

    最近在看一本书<Third-Party Javascript>很不错,推荐给大家,下载地址各位自己搜索了. 步骤: 1.打开google,鉴于google基本打不开,那么就打开这个网址吧. ...

  6. javascript 简单的计算器

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  7. 哈希表(hashtable)的javascript简单实现

    javascript中没有像c#,java那样的哈希表(hashtable)的实现.在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的 ...

  8. 简述一个javascript简单继承工具的实现原理

    背景 由于本人非常希望能够开发自己的游戏,所以业余时间一直在想着能不能自己一些好玩又有趣的东西出来,最近随着steam上众多独立游戏的爆发,感觉自己又燃烧了起来,所以又拾起了很久以前的一个2d引擎,决 ...

  9. 谁说 JavaScript 简单的?

    这里有一些 Javascript初学者应该知道的技巧和陷阱.如果你已经是专家了,顺便温习一下. Javascript也只不过是一种编程语言.怎么可能出错嘛? 1. 你有没有尝试给一组数字排序? Jav ...

  10. JavaScript简单了解

    一.JavaScript 的诞生历史 在最初的时候 JS 主要解决的问题是一些服务器端语言(perl)对数据的 验证功能,在js 出现之前要对表单的数据进行验证需要将数据提交到服务器 端之后才能验证数 ...

随机推荐

  1. huhamhire-hosts — Hosts文件自动配置工具

    https://www.anotherhome.net/1376 推荐配合EasyGoAgent使用: EasyGoAgent — 开箱即用的GoAgent Update 2015.5.15 数据文件 ...

  2. 【树论 1】 prim算法的学习和使用

    进阶版神犇可以看看本题解的姊妹篇 Kruskal算法的学习和使用 下面的内容是prim算法 但是最小生成树是什么呢? 标准定义如下:在边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值 ...

  3. 案例:Redis在京东的使用技术模型图

    http://www.100ec.cn  2013年09月27日17:30  中国电子商务研究中心 我要投稿 产品服务   (中国电子商务研究中心讯)Redis是一个开源的,遵守BSD许可协议的key ...

  4. 导入eclipse工程到Android Studio中

    ref:从 Eclipse 迁移至 Android Studio | Android Studiohttps://developer.android.com/studio/intro/migrate. ...

  5. UESTC--1468

    题目:A Coin Problem 原题链接:http://acm.uestc.edu.cn/problem.php?pid=1468 分析:满足裴波纳契数列,打表找周期. #include<i ...

  6. 【题解】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是可以用来处 ...

  7. 【Asp.net入门4-04】使用Nuget

  8. vue 倒计时返回首页

    1. vue页面15分钟无操作时返回首页 2. 基于vue的倒计时demo 3. 在vue2.0项目中一个简单的倒计时功能 4. vue重新发送验证码 5. 表格<td>里面文字垂直显示

  9. 【重要】Nginx模块Lua-Nginx-Module学习笔记(三)Nginx + Lua + Redis 已安装成功(非openresty 方式安装)

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一. 目标 使用Redis做分布式缓存:使用lua API来访问redis缓存:使用nginx向客户端提 ...

  10. Linux命令-xargs

    比如一个例子 echo "README.md" |cat echo "README.md" |xargs cat 第一个例子只是输出了README.md的文件名 ...