摘要: 本文是 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。按下
F12或Ctrl+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 中,我们用 let 和 const 来声明变量。
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 = '这是旧写法';

let 和 const 的好处 :拥有块级作用域,避免了很多奇奇怪怪的问题。一般原则:先用 const,如果确定变量的值需要改变,再改成 let。
变量命名规则:只能包含字母、数字、下划线 _ 和美元符号 $,且不能以数字开头。区分大小写,myName 和 myname 是两个不同的变量。建议使用"驼峰命名法":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(布尔值)
只有 true 和 false 两个值,用于逻辑判断。
javascript
let isLoggedIn = true;
let isMember = false;
console.log(5 > 3); // true

7.4 Undefined 和 Null
-
undefined:变量声明了但未赋值,就是undefined。javascriptlet x; console.log(x); // undefined
-
null:表示一个空值或不存在的对象引用,一般需要手动设置。javascriptlet 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()方法。javascriptlet num = 100; let str = String(num); // "100" let str2 = num + ''; // 隐式转换也成"100" -
转为数字 :
Number()、parseInt()、parseFloat()。javascriptconsole.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),会被转为false:0、""、null、undefined、NaN、false。其余全是true。javascriptconsole.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 变量声明、七大数据类型、运算符以及类型转换。这些看似枯燥的基础,正是构筑万丈高楼的坚实砖石。
如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享 ,也可以留言告诉我你遇到的其它问题,我会尽快回复。动手练习是掌握编程最快的方法,请务必亲手敲一遍本文的所有示例代码,并截图保存你的成果。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。