#2 JavaScript Crash Course 1

今天来教教 JavaScript 的基础语法:注解变数常数回圈条件函式 以及 运算
目的是希望至少能让你看得懂程序在做什麽,所以教学会较为简略。

准备试玩 JavaScript 的环境

有两个建议方法,则一即可:

  1. 打开一个浏览器新视窗,在画面中按右键,点选 检查,选择 console 分页
  2. 前往 jsconsole.com

无论是哪一个方法,你都应该会找到一个打字的地方,贴上以下程序码,再按下 Enter 试试。

console.log("嗨,你好!")

你应该会看到 嗨,你好!

我建议你在学 JavaScript 时把每个范例都丢到 console 去执行看看,会比较容易理解程序在做什麽。

先看段程序码

这段程序码

// This is JavaScript
let str = "Hello, World!";

function say(s) {
    console.log(s);
}

say(str);

执行後会得到:

Hello, World!

你可能会觉得我什麽都还没说就直接给你看程序码到底是在搞什麽?

我希望你依照「由上往下执行」的原则,先花 30 秒看着它,记起来,如果可以则试着理解它。

记好了吗?

其实过程就是:

  1. 建立资料 str,其值为「Hello, World!」
  2. 定义动作 say,其执行时需要给它一个资料 s
  3. 执行动作 say,并以 str 做为 say 需要的资料 s

试着把 变数参数 代换看看,这段程序其实就是执行:

console.log("Hello, World!");

然後 console 就会出现 Hello, World! 了!

如果你还是不太能想像程序执行的过程,可以把程序码贴到 console 试试。

我们在上面提到了几个东西:注解变数函式,接下来就让我们进入主题吧!

注解

/* 我
是
多行
注解*/
let a = 1; // 我是单行注解

JavaScript 中的注解有两种:
单行注解
单行注解用 // 表示,其右边的部分就是注解。

多行注解
多行注解用 /* 当作起头, */ 当作结尾,其中间的所有东西都是注解

变数

let a = true; // 布林值 bool
let b = 100; // 数字 number
let c = "一串字"; // 字串 string
let d = [ 10, 20, 30, "Hi", true ]; // 阵列 array
let e = { name: "Tom", age: 1000 }; // 物件 object

JavaScript 中的 let 可用来宣告变数。

// 宣告
let 变数名称 = 初始值

// 修改
变数名称 = 新的值
  • 变数可以想成是把资料存起来的容器
  • let 宣告的变数范围是在 {} 之内,意即你在某 {} 内宣告的变数,只能在该 {} 中存取
  • {} 中变数名称是唯一的,不可重复宣告

补充:

常数

const name = "Charlie"; // 不可修改

常数使用 const 宣告,其与变数类似,但宣告後即不得修改。

有趣的是,如果你宣告参数为 object 型态,其里面的东西是可以改的。

const obj = {
    x: 100
};
const arr = [];

// 这是允许的
obj.x = 500;
arr.push(true);

回圈

// i++ 就等於 i += 1 ,也就是把 i 加一
for(let i = 0; i < 10; i++) {
    console.log(i);
}

while(true) {
    console.log("Infinite Loop");
}

回圈就是一直重复执行 {} 中的动作。

FOR LOOP 的构成如下:

for(一开始要做的事; 继续的条件; 每次完成後做的事) {
    // 做其他事
}

一开始要做的事 会在进入回圈前执行一次,
然後检查 继续的条件 是否成立,成立就执行内部的东西,反之则跳出。
每次跑完内部的事情时,会先执行 每次完成後做的事 再做下一轮的检查。

WHILE LOOP 就更简单了:

while(继续的条件) {
    // 做事
}

检查 继续的条件 是否成立,成立就执行内部的东西,反之则跳出。一直循环直到跳出。

Break & Continue

for(let i = 0; i < 100; i++) {
    console.log(i);
    break;
}

for(let i = 0; i < 100; i++) {
    if(i % 2 === 1) continue;
    console.log(i);
}

break 会跳出整个回圈。
continue 则跳过一次循环。

条件

// Math.random() 会随机产生 0 ~ 1 的数
// 所以这有 1/2 的机会执行
if(Math.random() < 0.5) {
    console.log("符合条件");
}

if 条件就像是 while 回圈,但只执行一次 (符合条件) 或零次 (不符合条件)。

let r = Math.random();
// if else
if(r < 1/3) {

} else if(r < 2/3) {

} else {

}

let a = Math.floor(Math.random() * 3) // 可能会是 0 or 1 or 2
// switch
switch(r) {
    case 0:
        ...
        break;
    case 1:
        ...
        break;
    case 2:
        ...
        break;
}

函式

// 宣告一个叫 sum 的函式
function sum(number1, number2) {
    return number1 + number2;
}

// 这个跟上面基本上是相同的
let sum = (n1, n2) => n1 + n2;

函式其实就是一连串的动作,以及做动作所需的东西 (参数)。

// 函式宣告
function 函式名称(参数以逗点分隔) {
    /* 
    做的事情
    可以很多
    */
    return 回传值
}

() 内的是参数,{} 内的是动作。

function 有一点需要注意:它会在 block ({}) 中上浮。什麽意思呢?
就是 function abc () {} 写在後面时 (例如第 1481 行),可以在前面 (例如第 114 行) 呼叫执行。
就像是提前至 function abc () {} 所在 block 的最上面先宣告。

箭头函式

名称 = (参数以逗点分隔) => 回传值

看起来比较简洁,但如果搞不清楚 this 不要乱用

匿名函式

function(...) { ... }

没有名字,常在做为参数代入其他函式时使用

Async

async function () {}
async () => {}

这个东西是非同步函式,它很特别会回传 Promise,明天会说。

运算

运算其实很直观:

let a = 10, b = 10;

a + 1;
console.log(a);

a = a + 1; // a += 1
console.log(a);

b++;
console.log(b);

唯一要注意的,就是运算本身是不会影响到原本的变数的,还需要赋值 (=)。

常用的算数运算子有 + - * /,顺便赋值的有 += -= *= /=,可以自己玩玩看。
比较运算子有 < <= > >= == ===
其中较需要解释的是 ===== 的差异,两者对於不同型别之间的比较会有不同结果,=== 比较严格, == 比较宽松。

console.log(1 == "1"); // true

console.log(1 === "1"); // false

另外需要知道的是 || 表示 or&& 表示 and
现在有个概念就好,之後实际用到时就会比较容易了解了。

MDN 对所有运算子完整的说明

补充

  • JavaScript 中的 ; 不是必要的,但我比较习惯加上。

延伸阅读

因为目的是「看懂」程序,内容有些过度简化的部分,如果想要深入理解,在这提供两个资料网站给有兴趣的人:

  1. w3schools.com
  2. MDN

依经验来看,多看看程序码与范例,你就会写了。这两个网站都是很好的学习资源。

看不懂?

请留言跟我说,这是我第一次写教学文,一定有一大堆需要改进的地方。
如果对於内容有疑问,我一定会尽可能回覆。


每日铁人赛热门 Top 10 (0915)

以 9/15 12:00 ~ 9/16 12:00 文章观看数增加值排名

  1. +297 [Day14] 家里WiFi被妈妈锁了怎麽办? 教你用Python破解WiFi密码 !
    • 作者: lulu_meat
    • 系列:奇怪的知识增加了!原来程序还可以这样用?!
  2. +213 [Day13] 抢 PS5 程序怎麽写? 动态爬虫详细教学!
    • 作者: lulu_meat
    • 系列:奇怪的知识增加了!原来程序还可以这样用?!
  3. +212 [Day15] 明天是女友的生日却忘记准备礼物? 教你三秒做出爱心照片墙!
    • 作者: lulu_meat
    • 系列:奇怪的知识增加了!原来程序还可以这样用?!
  4. +190 [Angular 深入浅出三十天:表单与测试] Day01 - 前言
    • 作者: Leo
    • 系列:Angular 深入浅出三十天:表单与测试
  5. +167 卡夫卡的藏书阁【Book1】- 大纲和Kafka基础介绍
    • 作者: daniel_ho
    • 系列:『卡夫卡的藏书阁』程序猿必须懂的Kafka开发与实作
  6. +158 D14 第七周 前端基础 JavaScript
    • 作者: sixwings
    • 系列:程序导师实验计画第五期 回顾笔记
  7. +155 Day-1 : Hello Wali 起手式
    • 作者: 瓦力每天笑嘻嘻
    • 系列:海边囝仔带阿公阿嬷一起学 Ruby On Rails
  8. +148 Day15 - WooCommerce 金流串接实战
    • 作者: oberon
    • 系列:机智接案生活 - WooCommerce 金流串接实战
  9. +142 [Day11] 打完疫苗睡死要怎麽发文? 让程序帮你完成铁人赛!
    • 作者: lulu_meat
    • 系列:奇怪的知识增加了!原来程序还可以这样用?!
  10. +131 [Day9] 记得色情守门员吗? 教你用Python做简易版守门员!
    • 作者: lulu_meat
    • 系列:奇怪的知识增加了!原来程序还可以这样用?!

原本想再报一个自我挑战组每天发的,但发现报名时间已经过了...


<<:  Powershell 入门之管道和文件重定向

>>:  Day 10 : 机器学习大杂烩

国家标准技术研究院(NIST)最低安全要求的最佳来源-标准

NIST出版物 NIST制定并维护了大量有关信息和信息系统的安全性和隐私性的标准,指南,建议和研究。...

【Side Project】 (老板)订单清单UX功能实作

我们接续上一篇完成一些未完成的功能。 完成按钮 & 返回按钮 这两个按钮在整个篇章中,属於比...

浮点数的二进位表达方法

浮点数的二进位表达方法 浮点运算知识点 小数二进制表达 与整数的二进制表达相同我们可以假设任意小数的...

Day16:四种不同的 Channel

在上一篇文章我们建立 Channel 时,使用 Channel<E>() 来建立一个 C...

[JS] You Don't Know JavaScript [this & Object Prototypes] - this All Makes Sense Now! [下]

前言 在this All Makes Sense Now! [上]中我们介绍了什麽是call-sit...