JavaScript 从零基础到精通系列:前世今生与编程启蒙

摘要: 本文是 JavaScript 从零到精通系列的开篇。我们将追溯 JavaScript 从 1995 年诞生至今的传奇历史,理清它与 ECMAScript 的关系,并一览各重要版本带来的变化。接着,我们会搭建学习环境,写下第一行代码,然后详细学习变量、数据类型、运算符和类型转换。读完这篇,你不仅知道这门语言从何而来,还能写出简单的计算器程序,为后续学习打好基础。


一、诞生故事:浏览器大战的产物

1995 年,互联网世界正处在第一次浏览器大战的风口浪尖。网景公司(Netscape)的 Navigator 浏览器占据主导地位,而微软的 Internet Explorer 也开始崭露头角。网景公司意识到,网页需要一种脚本语言,让静态的 HTML 页面"动"起来,于是他们聘请了 Brendan Eich。

Brendan Eich 在 1995 年 5 月,仅用了 10 天 就完成了这门语言的第一个版本。最初它叫做 Mocha ,很快改名为 LiveScript 。为了蹭当时 Java 语言的热度,网景公司与 Sun 公司合作,在发布前又将它重新命名为 JavaScript 。必须说清楚:JavaScript 和 Java 基本上没有任何关系,这个命名纯粹是市场营销的产物,就像"雷锋"和"雷峰塔"的区别。

JavaScript 出世之后,微软很快在 IE 中实现了自己的版本 JScript 。两种实现的不一致给开发者带来巨大痛苦,因此标准化势在必行。1996 年 11 月,网景公司将 JavaScript 提交给欧洲计算机制造商协会(ECMA)进行标准化,这就有了 ECMAScript 这个名字(通常简称 ES)。JavaScript 是 ECMAScript 标准最著名的实现,除此之外还有 ActionScript(已消亡)等。

二、ECMAScript 版本演进:从 ES1 到 ES2024

了解版本演变,能让你明白为什么教程里会有多种写法,以及怎样写出更现代化的代码。

  • ES1 -- ES3 (1997-1999):奠定了语言基础,包括语法、类型、对象、异常处理等。ES3 是很多年的稳定基础。

  • ES4 (放弃):过于激进的改革,因各方分歧太大而流产。

  • ES5 (2009) :重要的里程碑。"严格模式"("use strict")出现,新增了 JSON 支持、数组的 forEach/map/filter/reduce 等实用方法,让开发体验大幅改善。

  • ES6 / ES2015 (2015)划时代的巨变 。从此每年发布一个新版本,命名规则改为 ES + 年份。ES6 带来了 let/const、箭头函数、类(class)、模块(import/export)、Promise、解构赋值、模板字符串等无数现代 JavaScript 的核心特性。这是我们这个系列重点学习的内容。

  • ES2016 -- ES2024 :逐年演进,加入 async/await(ES2017,颠覆异步编程)、可选链操作符 ?.(ES2020)、逻辑赋值运算符(ES2021)、类私有字段 # 等。

目前所有主流浏览器都已全面支持 ES6 及后续大部分特性,因此我们完全可以直接学习现代 JavaScript,不用再走一遍过时写法的弯路。

三、为什么学习 JavaScript?

一句话:JavaScript 是 Web 的"世界语"。它能做什么?

前端交互:在浏览器里操作 HTML/CSS,实现动画、表单验证、动态加载数据等,它是唯一的原生语言。

后端开发:有了 Node.js,JavaScript 可以写服务器,处理高并发、实时应用(如聊天室)。

移动应用:使用 React Native、Flutter(Dart,但概念相近)或 Weex 等,可以开发安卓和 iOS App。

桌面应用:Electron 让 JavaScript 能构建 VS Code、Slack 等桌面软件。

小程序与游戏:微信小程序、H5 游戏引擎(如 Cocos、Phaser)都离不开它。

无论你想专攻哪个方向,JavaScript 都是一把金钥匙。

四、环境搭建:无需安装任何复杂软件

作为零基础小白,开始学习只需要两样东西:

  • 一个现代浏览器 :Chrome、Edge 或 Firefox。按下 F12Ctrl+Shift+I 打开"开发者工具",切换到 Console 标签。这就是我们的 JavaScript 即时交互环境。

  • 一个代码编辑器 :推荐 Visual Studio Code (简称 VS Code),免费且强大。下载安装后,新建一个文件,后缀名保存为 .html.js 即可。

对于写好的 .js 文件,你可以在 HTML 中通过 <script src="app.js"></script> 引入,然后在浏览器中打开 HTML 页面查看效果,在 Console 中看到输出。当然,也可以安装 Node.js,直接在终端运行 node app.js。我们将在后续篇目中逐步引导。

五、第一个程序:Hello, World!

打开 Chrome 的 Console,输入以下内容并回车:

javascript 复制代码
console.log("Hello, World!");

你会看到控制台打印出了 Hello, World!

console.log() 是最基本、最常用的调试方法,它可以把任何内容"印"出来。

现在,在 VS Code 中创建一个文件 01_hello.html,写入:

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">

<head>

    <meta charset="UTF-8">
    <title>我的第一个 JavaScript 程序</title>
</head>

<body>

    <script>
        // 这是一个单行注释
            
        /* 
                   这是一个多行注释 
                */
            
        alert('欢迎来到 JavaScript 的世界!'); // 弹出对话框
            
        console.log('我在控制台悄悄说话');
    </script>
</body>

</html>

用浏览器打开这个文件,你会看到一个弹出框,控制台里也有输出。///* */ 是注释,浏览器会完全忽略它们,只为了给开发者做笔记。写好注释是非常好的习惯。

六、变量:存储数据的容器

变量就是一个有名字的盒子,用来存放数据。在现代 JavaScript 中,我们用 letconst 来声明变量。

javascript 复制代码
// let 声明的变量,值可以改变
let myName = "小白";
console.log(myName); // 输出: 小白
myName = "JavaScript Master";
console.log(myName); // 输出: JavaScript Master
​
// const 声明的常量,一旦赋值就不能再改
const birthYear = 2000;
// birthYear = 2020; // ❌ 这行会报错:Assignment to constant variable
console.log(birthYear);
​
// 古老的方式 var(有缺陷,现在不推荐,但你需要能看懂旧代码)
var oldSchool = '这是旧写法';

letconst 的好处 :拥有块级作用域,避免了很多奇奇怪怪的问题。一般原则:先用 const,如果确定变量的值需要改变,再改成 let

变量命名规则:只能包含字母、数字、下划线 _ 和美元符号 $,且不能以数字开头。区分大小写,myNamemyname 是两个不同的变量。建议使用"驼峰命名法":myFirstName

七、数据类型:JavaScript 世界的居民

JavaScript 是动态类型语言,同一个变量可以随时存放不同类型的值。它的数据类型分为两大类:基本类型引用类型。我们先拿下基本类型。

7.1 Number(数值)

不分整数和浮点数,统一为 64 位浮点数。

javascript 复制代码
let age = 25;
let price = 99.99;
let infinity = 1 / 0; // Infinity 正无穷
let notANumber = "hello" * 3; // NaN (Not a Number),但类型依然是 number
console.log(typeof age); // "number"
console.log(typeof price); // "number"
console.log(typeof infinity); // "number"
console.log(typeof notANumber); // "number"

注意:NaN 是一个特殊值,表示"不是一个数字",但它属于数字类型。判断一个值是不是 NaN 要使用 Number.isNaN() 而不是 ===

7.2 String(字符串)

用单引号 '、双引号 " 或反引号 ````` 包裹的内容。

javascript 复制代码
let firstName = '小明';
let saying = "他常说:'学无止境'";
let age = 25;
// ES6 模板字符串,可以嵌入变量和表达式
let greeting = `大家好,我是${firstName},${saying},今年${age}岁`;
console.log(greeting);

反引号支持的"字符串插值"功能强大,可以多行,且可以放入任何有效的 JavaScript 表达式。

7.3 Boolean(布尔值)

只有 truefalse 两个值,用于逻辑判断。

javascript 复制代码
let isLoggedIn = true;
let isMember = false;
console.log(5 > 3);  // true

7.4 Undefined 和 Null

  • undefined:变量声明了但未赋值,就是 undefined

    javascript 复制代码
    let x;
    console.log(x); // undefined
  • null:表示一个空值或不存在的对象引用,一般需要手动设置。

    javascript 复制代码
    let emptyValue = null;

    typeof null 会返回 "object",这是 JavaScript 诞生时就存在的著名 bug,但一直保留至今,记住就好。

7.5 Symbol 和 BigInt(了解)

  • Symbol(ES6):创建唯一的标识符,用于对象属性名等高级场景。

  • BigInt(ES2020):用于表示大于 2^53-1 的整数,在普通数字后加 n,例如 9007199254740993n

八、运算符:执行运算和判断

8.1 算术运算符

+ - * / %(取余)**(指数 ES7)

javascript 复制代码
console.log(10 / 3);      // 3.3333333333333335
console.log(10 % 3);      // 1 (求余数)
console.log(2 ** 10);     // 1024 (2的10次方)
// 字符串拼接:当 + 的一边是字符串时,会进行拼接
console.log('5' + 3);    // '53'
console.log('5' - 3);    // 2 (减号会尝试将字符串转为数字)

8.2 赋值运算符

= += -= *= 等。

javascript 复制代码
let num = 10;
num += 5; // 相当于 num = num + 5,现在 num 为 15

8.3 比较运算符

> < >= <= == != === !== 重点 :尽量使用 严格相等 ===严格不等 !==,它会同时比较值和类型。

javascript 复制代码
console.log(5 == '5');   // true (会发生类型转换)
console.log(5 === '5');  // false (类型不同,直接 false)
console.log(null == undefined); // true
console.log(null === undefined); // false

为了避免 bug,在任何情况下都优先使用 ===,只在你真的需要类型转换时使用 ==

8.4 逻辑运算符

&&(逻辑与)||(逻辑或)!(逻辑非)

javascript 复制代码
let a = true, b = false;
console.log(a && b); // false (两者都真才真)
console.log(a || b); // true (一真即真)
console.log(!a);     // false
// 短路运算:常用于设置默认值
let userName = "";
let displayName = userName || "匿名用户"; // "匿名用户"

8.5 自增/自减

++--,有前置和后置的区别,初学阶段建议拆分步骤写得更明确,避免混淆。

javascript 复制代码
let counter = 0;
counter++; // counter 变为 1

九、类型转换:数据变形记

JavaScript 会自动进行类型转换(隐式转换),但作为开发者,最好掌握显式转换。

  • 转为字符串String()toString() 方法。

    javascript 复制代码
    let num = 100;
    let str = String(num);   // "100"
    let str2 = num + '';     // 隐式转换也成"100"
  • 转为数字Number()parseInt()parseFloat()

    javascript 复制代码
    console.log(Number('123'));    // 123
    console.log(Number('123abc')); // NaN
    console.log(parseInt('123abc')); // 123,它会尽量解析
    console.log(parseFloat('3.14.15')); // 3.14
    console.log(+'45');           // 一元 + 可转为数字 45
  • 转为布尔值Boolean()。以下为"假值"(falsy),会被转为 false0""nullundefinedNaNfalse。其余全是 true

    javascript 复制代码
    console.log(Boolean(0));     // false
    console.log(Boolean(' '));   // true (空格字符串非空)

十、实战:编写一个简单的控制台计算器

我们已经具备了最基础的知识,现在来把它们用起来。在 Console 或 Node.js 环境中,我们可以通过 prompt(浏览器)或固定的变量来模拟输入。

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>简易计算器</title>
    <style>
        /* 页面样式美化 */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: Arial, sans-serif;
        }
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            background-color: #f0f2f5;
        }
        .calculator {
            background: white;
            padding: 30px;
            border-radius: 12px;
            box-shadow: 0 0 20px rgba(0,0,0,0.1);
            width: 350px;
        }
        h2 {
            text-align: center;
            margin-bottom: 20px;
            color: #333;
        }
        .input-group {
            margin-bottom: 15px;
        }
        label {
            display: block;
            margin-bottom: 5px;
            color: #666;
        }
        input, select {
            width: 100%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 6px;
            font-size: 16px;
        }
        button {
            width: 100%;
            padding: 12px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 6px;
            font-size: 16px;
            cursor: pointer;
            margin: 10px 0;
        }
        button:hover {
            background-color: #0056b3;
        }
        .result {
            margin-top: 20px;
            padding: 15px;
            background-color: #e9f7fe;
            border-radius: 6px;
            text-align: center;
            font-size: 18px;
            color: #333;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <div class="calculator">
        <h2>简易计算器</h2>
        <!-- 输入框1 -->
        <div class="input-group">
            <label>数字1:</label>
            <input type="number" id="num1" placeholder="请输入数字" required>
        </div>
        <!-- 运算符选择 -->
        <div class="input-group">
            <label>运算符:</label>
            <select id="operation">
                <option value="+">+ 加法</option>
                <option value="-">- 减法</option>
                <option value="*">× 乘法</option>
                <option value="/">÷ 除法</option>
            </select>
        </div>
        <!-- 输入框2 -->
        <div class="input-group">
            <label>数字2:</label>
            <input type="number" id="num2" placeholder="请输入数字" required>
        </div>
        <!-- 计算按钮 -->
        <button onclick="calculate()">开始计算</button>
        <!-- 结果显示区域 -->
        <div class="result" id="result"></div>
    </div>

    <script>
        // 计算器核心计算函数
        function calculate() {
            // 获取用户输入的值
            const num1 = parseFloat(document.getElementById('num1').value);
            const num2 = parseFloat(document.getElementById('num2').value);
            const operation = document.getElementById('operation').value;
            let result;

            // 校验输入是否为有效数字
            if (isNaN(num1) || isNaN(num2)) {
                result = '请输入有效的数字!';
            } else {
                // switch 运算逻辑
                switch (operation) {
                    case '+':
                        result = num1 + num2;
                        break;
                    case '-':
                        result = num1 - num2;
                        break;
                    case '*':
                        result = num1 * num2;
                        break;
                    case '/':
                        // 除数不能为0判断
                        if (num2 !== 0) {
                            result = num1 / num2;
                        } else {
                            result = '错误:除数不能为0';
                        }
                        break;
                    default:
                        result = '不支持的运算';
                }
            }

            // 把结果显示在页面上 + 控制台打印
            const resultDom = document.getElementById('result');
            resultDom.innerText = `${num1} ${operation} ${num2} = ${result}`;
            console.log(`${num1} ${operation} ${num2} = ${result}`);
        }
    </script>
</body>
</html>

总结 : 我们走过了 JavaScript 从 1995 年匆匆诞生到现代 ES 规范演进的风雨之路,清楚了它和 ECMAScript 的关系。搭建好了最简开发环境,写出了第一行 console.log。随后详细学习了 let/const 变量声明、七大数据类型、运算符以及类型转换。这些看似枯燥的基础,正是构筑万丈高楼的坚实砖石。


如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享 ,也可以留言告诉我你遇到的其它问题,我会尽快回复。动手练习是掌握编程最快的方法,请务必亲手敲一遍本文的所有示例代码,并截图保存你的成果。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。

相关推荐
月亮邮递员6161 小时前
Markdown语法总结
开发语言·前端·javascript
Kurisu5751 小时前
雾锁王国修改器下载2026最新
前端·修改器代码
Rain5092 小时前
mini-cc 的 MCP 协议:给 AI 装个 USB-C 接口
c语言·开发语言·前端·人工智能·架构·node.js·ai编程
向量引擎2 小时前
从零起步,如何打造专属向量引擎 API 中转工作流?
java·服务器·前端
丷丩3 小时前
MapLibre GL JS第27课:添加COG栅格源
javascript·map·mapbox·maplibre gl js
IT_陈寒3 小时前
Vue这个动态响应坑把我整不会了
前端·人工智能·后端
bestlanzi3 小时前
使用nvm管理node环境
前端·vue.js·npm
SomeOtherTime3 小时前
Geojson相关(AI回答)
java·前端·python
不好听6134 小时前
JavaScript 到底是怎么运行的?从编译阶段到执行上下文全面解析
javascript