首页 > 系统教程 > 操作系统 > 对于初学者来说 Javascript 也并不简单

对于初学者来说 Javascript 也并不简单

WBOY
发布: 2024-08-20 07:32:07
原创
1200 人浏览过

Javascript 초보자가 알아야 할 몇 가지 팁과 함정은 다음과 같습니다. 당신이 이미 전문가라면, 이 부분을 자세히 살펴보세요.

对于初学者来说 Javascript 也并不简单

Javascript는 프로그래밍 언어일 뿐입니다. 어떻게 잘못될 수 있나요?

1. 숫자 집합을 정렬해 본 적이 있나요?

Javascript의 sort() 함수는 기본적으로 영숫자(문자열 유니코드 코드 포인트)를 사용하여 정렬합니다.

So [1,2,5,10].sort()[1, 10, 2, 5].

을 출력합니다.

배열을 올바르게 정렬하려면 [1,2,5,10].sort((a, b) => a — b)

을 사용할 수 있습니다.

아주 간단한 해결책, 이런 구덩이가 있다는 것을 알아야 한다는 전제가 있습니다

2. new Date()가 훌륭합니다

새 날짜() 허용:

  • 매개변수 없음: 현재 시간 반환
  • 매개변수 1개 x: 1970년 1월 1일 + x 밀리초를 반환합니다. 유닉스를 아시는 분들은 그 이유를 아실 겁니다.
  • new Date(1, 1, 1)은 1901, 2월 1일/을 반환합니다. 왜냐하면, 첫 번째 매개변수는 1900에 1년을 더한 것을 나타내고, 두 번째 매개변수는 올해의 두 번째 달(즉 2월)을 나타내기 때문입니다. — 정상적인 뇌 회로를 가진 사람들은 1 — 부터 색인을 시작하고, 세 번째 매개변수는 매우 명백하게 2월의 첫날입니다. 월이므로 1 — 때때로 지수가 1 — 에서 시작합니다.
  • new Date(2016, 1, 1)는 1900에 2016을 추가하지 않습니다. 2016년만 나타냅니다.

对于初学者来说 Javascript 也并不简单

3. 바꾸기는 "교체"되지 않습니다.
으아아아

저는 함수가 입력을 변경하는 것을 좋아하지 않기 때문에 이것이 좋은 것이라고 생각합니다. 또한 replace는 첫 번째로 일치하는 문자열만 대체합니다.

일치하는 모든 문자열을 바꾸려면 /g 플래그와 함께 정규식을 사용할 수 있습니다.

으아아아
4. 비교시 주의하세요
으아아아

이유: [1,2,3]과 [1,2,3]은 두 개의 독립적인 배열입니다. 단지 동일한 값을 포함하고 있을 뿐입니다. 참조가 다르므로 ===과 비교할 수 없습니다.

5. 배열은 기본 데이터 유형이 아닙니다
으아아아

변수가 배열인지 알고 싶다면 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. 解决了.

letvar的不同在于作用域。var的作用域是最近的函数块,let的作用域是最近的封闭块,封闭块可以小于函数块(如果不在任何块中,则letvar都是全局的)。(来源)

替代方法: 用 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()
})
}
登录后复制

尽管我认为最后一种方法并不优雅。

对于初学者来说 Javascript 也并不简单

我很高兴我们解决了这个问题。

总结

祝贺你,你现在可以放心地把你的程序放在互联网上了。甚至运行起来可能都不会出岔子(但是通常会)Cheers \o/

以上是对于初学者来说 Javascript 也并不简单的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:linuxprobe.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板