零基础入门js

771 阅读5分钟

「这是我参与2022首次更文挑战的第 7 天,活动详情查看:2022首次更文挑战」。

咸鱼计划之重红宝书第 4 篇~

前言

经过前文对于js的介绍,接下来我们要开始正式学习js语法了。说到这里,强调一下就是学语言一定要学习语法,不然很快就会忘记。很多年前我学过俄语,但是因为没有深耕语法,现在是一点也想不起来了,字母都快忘记完了。但是学韩语和西语的时候,学了很多语法,虽然也是很多年不用,但是再去看书,还是能想起来很多的。

另外再吐槽下一些后端,很多java程序员都觉得js很简单,不就是几个页面吗,我也见过或者听过不少后端写前端的,在人手不够的时候,他们也上手写前端,但是因为轻视,所以也不屑于去认真了解js,然后就会产生一些好玩的事。比如在他们眼中一切皆class,extend被他们用的那叫一个风生水起,如果用的是react框架,那就更6了,因为react中有class组件。当然最可怕的不是他们全用class组件,而是他们喜欢到处extend,最后写出来的代码就像个牛皮糖一样黏,耦合度极高,可维护性极低。而且习惯了class的他们,根本不接受函数组件,更把Hook当做怪物。

当然,以上对后端的吐槽,纯属听小伙伴说的,毕竟我认识的后端都是很可爱的~

接下来关于js语法的入门,主要是针对有语言基础的同学,比如学过c语言的大侦探们。

js入门

不同于c或者其他类c语言,js很好上手,其中一个原因就是js是弱类型语言,当然对于大型项目的维护来说,这并不是好事,所以后来才出现了flow、ts等。当然我们现在先不管flow和ts这些。

比如在c中,我们定义值类型的时候,需要精确定义,比如整型就是int,字符串就是String,布尔值是boolean,不能乱写,而在js中,一切皆var。

var a = 1, b = '2', c = true;

当然ES6之后,var基本上就吃灰了,取而代之的新宠是let和const。而let和const的区别只是在于前者定义变量,后者定义常量。

var、let与const

var定义的变量,会成为包含它的函数的局部变量。另外不同于let和const,使用var定义的变量会自动声明提升。比如下面的一个常见面试题:

function foo() {
    console.log(age);
    var age = 26;
}
foo(); //undefined

这道题里面,因为age是用var定义的,因此虽然console.log()的时候,看似找不到age,但是因为发生了声明提升,上面的代码就等价于下面的代码:

function foo() {
    var age;
    console.log(age);
    age = 26;
}
foo(); //undefined

这就是所谓的”提升(hoist)“,也就是把所有的变量声明都拉到函数作用域的顶部。此外,反复使用var声明同一个变量也不会出错,当然let和const不行。

function foo() {
    var age = 16;
    var age = 18;
    age = 19;
    console.log(age);
}
foo(); //19

说到这里,注意下hoist这个单词,当然如果你是大侦探里的真小白,背个单词跳过就行,但是如果你是回炉重造的伪小白,比如白骨精或者菠萝或者咸鱼,那么想一下,你可能见过hoist,比如之前带大家学习过的react-redux和react-router5源码,connect和withRouter源码都有个hoist,全名叫hoist-non-react-statics,而connect和withRouter有个共同特点就是都是HOC。

HOC,Higher Order Component,高阶组件,即接收组件作为参数,再返回新组件的函数。但是如果参数组件上有静态方法,那么返回的组件上是会丢失的,这个时候如果你还想要保留参数组件的静态方法,就需要用到hoist-non-react-statics了。 使用如下:

import hoistStatics from 'hoist-non-react-statics'

hoistStatics(Connect, WrappedComponent)

另外再来个小贴士,很多印度程序员比中国程序员水平高,其中一个原因就是印度的官方语言是英语,在这点上我们需要努力学习,比如我最近的咸鱼计划的其中一部分就是在学习英语,感兴趣的可以关注公众号bubucuo加入我们。

大小写、标识符、注释和关键字、保留字

几乎和c一样,不再赘述,参考红宝书p22即可。 语句这里注意下,js中和其他语言不同的是,js可以不写分号;,支持以行结尾。我曾经有一段时间,很喜欢不写分号的写法,觉得很简洁,像下面这样:

let a = ''
let b = 2

但是项目越大,会觉得眼花~,不过因为我写习惯了不加分号,所以我用vscode的插件Prettier,保存的时候它自动给我格式化,行尾加分号。

另外,再给萌新提个建议,刚上手的萌们都喜欢尽可能简化写法,比如我刚刚提到的不写分号,还有人喜欢尽可能的省略{},比如if和else后只有一句代码的时候就不写{},当然语言对这种行为是支持的。但是如果你以后要做项目,强烈建议if和else的后面一定要写{}!因为项目是需要不断迭代的,如果你只是靠行对齐来判断语句块区域,那么在某个个加班上线的晚上,你肯定会因为眼花而写错行,从而出现bug~

看似松散的js

刚上手的前端,总会觉得js很简单,但是其实js很灵活,想要学好了还要下功夫,当然一个优秀的前端不只是要擅长js写前端交互,还有很多周边要学习,比如node、webpack、网络、浏览器原理等等。路漫漫其修远兮~

今天的红宝书阅读计划,先到这里,休息一下,明天再继续~