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,我们一起学前端!

时间: 2024-10-14 11:16:44

JavaScript 简单吗的相关文章

javascript简单原型

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getS

html --- ajax --- javascript --- 简单的封装

Ajax的简单封装 Ajax的全称是AsynchronousJavaScriptAndXML 如有疑问请参考:http://zh.wikipedia.org/zh-cn/AJAX 以及传智播客的视频教程:http://java.itcast.cn/news/8308d118/740a/4dcd/8dbf/c73d2fe5bc60.shtml 其实已经有好多框架对它进行了封装,但是还是有好多时候用到自己封装的 透露一下,本人是宇多田光的听众之一哦! 封装后的代码如下: 文件路径:\web\Ajax

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

第一章:javascript简单介绍 Netscape Navigator 开发的javascript   Javascript的实现有三部分: 1.核心(ECMAScript):提供核心语言功能. 2.文档对象模型(DOM):提供訪问和操作网页内容的方法和接口. 3.浏览器对象模型(BOM):提供和浏览器交互的方法和接口. Web浏览器仅仅是ECMAScripr实现的可能宿主环境之中的一个. 五大主流Web浏览器(IE,Firefox,Safari,Chrome和Opera) 第二章:在Htm

javascript 简单工厂模式

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 var Bicycle = new Interface("Bicycle",[

JavaScript简单抽奖程序的实现及代码

JavaScript简单抽奖程序的实现及代码 1.需求说明 某公司年终抽奖,需要有如下功能 1)可以根据实际情况设置到场人数的最大值 2) 点击"开始",大屏幕滚动,点击"停止",获奖者的编号出现在大屏幕上 3)在界面里显示全部奖项获奖人编号 4)不重复获奖 5)不会因为输入错误而导致抽奖结果异常. 2.代码呈上 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">

javaScript简单表单验证插件

 Validator = { Require : /.+/, Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,     Phone : /^(0[1-9][0-9]{1,2}-[1-9][0-9]{6,7})$/, Mobile : /^((\(\d{3}\))|(\d{3}\-))?1[3,5,8]\d{9}$/, Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[

javascript简单计算器代码分析

javascript简单计算器代码分析:也许网页中需要一个简单的计算器功能,这个时候就要掌握如何编写,起码应该会修改,下面就通过一个简单的实例介绍一下如何实现简单的计算器效果,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/&

谁说Javascript简单的?

谁说Javascript简单的? – Hacker Noon 原文链接 译文链接 这里有一些 Javascript初学者应该知道的技巧和陷阱.如果你已经是专家了,顺便温习一下. Javascript也只不过是一种编程语言.怎么可能出错嘛? 1. 你有没有尝试给一组数字排序? Javascript 的sort()函数在默认情况下使用字母数字(字符串Unicode码点)排序. 所以[1,2,5,10].sort() 会输出 [1, 10, 2, 5]. 要正确的排序一个数组, 你可以用 [1,2,5

Javascript 简单实现鼠标拖动DIV

http://zhangbo-peipei-163-com.iteye.com/blog/1740078 比较精简的Javascript拖动效果函数代码 http://www.jb51.net/article/10578.htm <html> <head><title>拖动效果函数演示 by Longbill.cn</title> <style> body { font-size:12px; color:#333333; border : 0px

JavaScript 简单应用

JavaScript 简单应用 一:简介 此笔记是对<JavaScript权威指南>第4章内容的概括.重点的记录.不是重现书本实例.书中大部分实例放在github上.有兴趣的也可以看这本书或者github上代码.github地址会放在JavaScript目录中. 二:JavaScript应用步骤 1.  编写JavaScript脚本 2.  在页面中引用: a)可以直接在页面中使用<script>标签将JavaScript相关内容放入其中. b)可以将脚本放入一个或者多个文件结尾为