JavaScript — 一种编程语言,已成为整个混合移动技术类别的基础。React Native、Ionic、Apache Cordova 和许多其他框架允许使用与 Web 开发统一的技术栈在 JS 中创建移动应用程序。根据 Stack Overflow 调查(2025),JavaScript 连续第十年仍然是最常用的编程语言。详情请查看 Stack Overflow 调查结果。
要点
JavaScript (JS) — 一种高级编程语言,具有动态类型、原型继承和函数作为一等公民。由 Brendan Eich 于 1995 年在 10 天内创建。它是网络技术(HTML、CSS、JS)的三种主要语言之一,也是 Node.js(2009)服务器平台的基础,使 JS 能够走出浏览器。
在移动开发中,JavaScript 用于三种范式:原生编译(带有 Hermes/JSC 的 React Native)、WebView 容器(Ionic、Cordova)和服务器端 JS(用于移动应用后端的 Node.js + Express)。React Native — 主导技术:根据 Statista(2025),38% 的跨平台项目使用 React Native,仅次于 Flutter(46%)。
JavaScript 的关键特性 — 具有非阻塞 I/O 的单线程执行模型。Event loop 允许在单个线程中处理数千个异步操作,而无需创建操作系统线程。这使得 JS 对 I/O 密集型应用(网络请求、数据库操作)高效,但在 CPU 密集型计算中需要谨慎。
ECMAScript (ES) 标准 定义了 JavaScript 规范。ES6(2015)引入了 let/const、箭头函数、类、模块、Promise。ES2020 — Optional Chaining (?.)、Nullish Coalescing (??)。ES2023 — Array findLast、Hashbang Grammar。现代引擎 Hermes(React Native)和 V8(Node.js)支持 ES2022+。React Native Hermes 支持 ES2020+,但对 Proxy 和 Symbol 有特定限制。
| ES 版本 | 年份 | 关键特性 | RN 支持 |
|---|---|---|---|
| ES6 | 2015 | let/const, Promise, class, modules, arrow functions | 完整 |
| ES8 | 2017 | async/await, Object.entries | 完整 |
| ES2020 | 2020 | Optional Chaining, Nullish Coalescing, BigInt | 完整 |
| ES2022 | 2022 | Top-level await, .at(), Error Cause | Hermes 有限 |
JavaScript 语法 — 类似 C,动态类型。变量的类型由值决定,并可在运行时更改。let 和 const(ES6)取代了 var 以实现块级作用域。原始类型:string、number、boolean、null、undefined、symbol、bigint。其他一切都是对象(object、array、function、date、regexp)。
JavaScript — 一种具有高阶函数的语言。函数可以赋值给变量、作为参数传递、从其他函数返回。箭头函数(=>)没有自己的 this — 它们从外部上下文继承 this。闭包(closure) — 记住其创建时作用域中变量的函数。
// JavaScript 中的数据类型和函数
// 原始类型
const name = 'React Native';
let version = 0.71;
var isActive = true; // 已弃用的 var
// 对象和数组
const app = {
platform: 'iOS',
version: 15,
getInfo() {
return `${this.platform} ${this.version}`;
}
};
const items = ['Dart', 'Kotlin', 'Swift'];
// 高阶函数
function filterByVersion(apps, minVersion) {
return apps.filter(app => app.version >= minVersion);
}
// 闭包 (closure)
function createCounter() {
let count = 0;
return function() {
return ++count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
// 用于复制对象的 Spread 运算符
const newApp = { ...app, version: 16 };Spread 运算符 ... 创建对象的浅拷贝。解构(const { platform, version } = app)将字段提取到变量中。filterByVersion 中的箭头函数比 function 表达式更短,并且不创建自己的 this — 这在 this 指向组件类的 React Native 组件中至关重要。
JavaScript 使用原型继承,而不是像 Java 或 C# 那样的类继承。类(ES6) — 原型之上的语法糖。每个对象都有一个指向另一个对象的内部 [[Prototype]] 引用。当访问对象中不存在的属性时,JS 会在原型链中查找。类语法(extends、super)使代码更易读,但底层仍是原型。
// JavaScript 中的类 — 语法糖
class PlatformService {
// 私有字段 (ES2022)
#apiKey;
constructor(name, apiKey) {
this.name = name;
this.#apiKey = apiKey;
}
// 静态方法
static getPlatforms() {
return ['iOS', 'Android'];
}
// Getter
get info() {
return `${this.name} SDK`;
}
// 异步方法
async initialize() {
return await this.#validateKey();
}
#validateKey() {
return this.#apiKey.length > 10;
}
}
// 继承
class AndroidService extends PlatformService {
constructor(apiKey) {
super('Android', apiKey);
}
}私有字段 #apiKey(ES2022)提供了真正的封装,使用 _underscore 约定无法访问。静态方法 getPlatforms 属于类,而不是实例。Getter info 在访问时计算。async/await 使异步代码线性化。React Native Hermes 从 0.71 版本开始支持私有字段。
JavaScript 异步性 基于 event loop — 一个检查调用栈(call stack)和任务队列的无限循环。Call stack — 同步代码,microtask queue — Promise.then/catch/finally,macrotask queue — setTimeout、setInterval、I/O。Event loop 首先从 microtask 获取任务,然后从 macrotask 获取。Call stack 阻塞(无限循环)会停止整个 UI。
Promise — 表示未来值的对象。Promise 可以是 pending(等待中)、fulfilled(成功)、rejected(错误)。.then().catch().finally() 链处理异步结果。async/await(ES8) — 语法糖:async 函数返回 Promise,await 暂停执行直到 promise 解决,而不阻塞线程。
// React Native 中的异步数据加载
import React, { useState, useEffect } from 'react';
import { View, Text, ActivityIndicator } from 'react-native';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
let cancelled = false;
async function fetchUser() {
try {
const response = await fetch(
`https://api.example.com/users/${userId}`
);
if (!response.ok) {
throw new Error('Network error');
}
const data = await response.json();
if (!cancelled) {
setUser(data);
setLoading(false);
}
} catch (error) {
if (!cancelled) {
console.error('Fetch failed:', error);
setLoading(false);
}
}
}
fetchUser();
return () => { cancelled = true; };
}, [userId]);
if (loading) return <ActivityIndicator />;
return (
<View>
<Text>{user?.name ?? 'Unknown'}</Text>
</View>
);
}useEffect 钩子与 async 函数 fetchUser 在组件挂载时执行 HTTP 请求。cancelled 标志防止在卸载后 setState — React Native 中的常见问题。Optional Chaining user?.name 和 Nullish Coalescing ?? 无错误地处理 undefined。ActivityIndicator 在加载期间显示 — 每个 JS 开发者都熟悉的异步模式。
React Native — Meta(Facebook)推出的用于在 JavaScript 中创建原生移动应用的框架。与 WebView 方法不同,React Native 渲染真正的原生组件(iOS 的 UIView、Android 的 ViewGroup)。JS 代码在单独的线程(Hermes 或 JSC)中执行,并通过 Bridge(旧架构)或 JSI(新 Fabric 架构)与原生 UI 线程通信。
React Native 由 JS 线程(您的代码)、原生线程(UI)和用于它们交互的 Bridge/JSI 组成。在旧架构(Bridge)中,JSON 消息被序列化并异步传输 — 这在快速动画中会造成延迟。新 Fabric 架构(React Native 0.68+)使用 JSI(JavaScript Interface) — JS 与 C++ 对象直接交互,无需序列化。
// 带有原生 API 的 React Native 组件
import React, { useState, useEffect } from 'react';
import {
View, Text, TouchableOpacity, Platform,
PermissionsAndroid, Alert
} from 'react-native';
import Geolocation from '@react-native-community/geolocation';
function LocationTracker() {
const [location, setLocation] = useState(null);
useEffect(() => {
requestLocationPermission();
}, []);
async function requestLocationPermission() {
if (Platform.OS === 'android') {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
);
if (granted !== PermissionsAndroid.RESULTS.GRANTED) {
Alert.alert('Permission denied');
return;
}
}
getCurrentPosition();
}
function getCurrentPosition() {
Geolocation.getCurrentPosition(
pos => setLocation({
lat: pos.coords.latitude,
lng: pos.coords.longitude
}),
error => Alert.alert('Error', error.message),
{ enableHighAccuracy: true, timeout: 15000 }
);
}
return (
<View>
<Text>Lat: {location?.lat ?? 'N/A'}</Text>
<Text>Lng: {location?.lng ?? 'N/A'}</Text>
<TouchableOpacity onPress={getCurrentPosition}>
<Text>Update Location</Text>
</TouchableOpacity>
</View>
);
}LocationTracker 组件演示了使用原生地理定位 API 的工作。Platform.OS 区分 Android 和 iOS。PermissionsAndroid.request — Android 的原生权限对话框。Geolocation.getCurrentPosition — @react-native-community/geolocation 模块,通过 npm 连接。React Native 为摄像头、蓝牙、加速度计和其他传感器提供 JS 接口。
Ionic — 用于混合移动应用的框架,使用 WebView 渲染 HTML/CSS/JS。与 React Native 不同,Ionic 不创建原生组件 — 应用在 iOS(WKWebView)和 Android(Android WebView)上的 Web 容器(WebView)内运行。这提供了 100% 的 Web 代码复用,但限制了复杂动画的性能。
Apache Cordova — Ionic 的基础,通过 JavaScript 插件提供对原生 API 的访问。摄像头、GPS、通讯录、文件系统 — 一切都可通过 cordova-plugin-* 访问。Ionic 7+ 使用 Capacitor — Cordova 的继任者,具有更好的性能、ESM 支持以及通过 Swift 和 Kotlin 直接访问 iOS/Android SDK。
| 特性 | React Native | Ionic (Capacitor) | Cordova |
|---|---|---|---|
| UI 渲染 | 原生组件 | WebView (WKWebView) | WebView |
| 语言 | JS/TS | JS/TS + HTML/CSS | JS/TS + HTML/CSS |
| 原生 API | Bridge/JSI + 模块 | Capacitor Plugins | Cordova Plugins |
| 性能 | 高 (60 FPS) | 中等 (取决于 WebView) | 中等 |
| APK 大小 | ~25-40 MB | ~10-15 MB | ~8-12 MB |
| 代码复用 | ~60% 代码 | ~95% 代码与 Web 版本 | ~95% |
JS 开发者工具 用于移动应用包括 Node.js、npm/yarn、Expo、React Native CLI 和 Metro bundler。Node.js — 浏览器外的 JS 运行时环境,生态系统的基础。npm(Node Package Manager) — 拥有 2+ 百万个库的包管理器。npx — 用于运行 npm 包而无需安装的工具。
Expo — React Native 之上的层,简化了开发:无需 Xcode/Android Studio 即可开始,提供带有预安装库的 Managed Workflow。Expo Application Services(EAS) — 云端构建和发布。Metro — React Native 的打包器,将 JS 代码和依赖项收集到一个文件中。Hermes — Meta 的 JS 引擎,针对移动设备进行了优化,具有 AOT 编译。
// package.json — React Native 项目配置
{
"name": "MyMobileApp",
"version": "1.0.0",
"scripts": {
"start": "npx react-native start",
"android": "npx react-native run-android",
"ios": "npx react-native run-ios",
"test": "jest",
"lint": "eslint . --ext .ts,.tsx"
},
"dependencies": {
"react": "^18.2.0",
"react-native": "^0.73.0",
"@react-navigation/native": "^6.1.0",
"@react-native-community/geolocation": "^3.2.0"
},
"devDependencies": {
"jest": "^29.7.0",
"eslint": "^8.56.0",
"metro-react-native-babel-preset": "^0.77.0"
}
}package.json 文件 — 每个 JS 项目的基础。start、android、ios 脚本启动 Metro 打包器和构建。依赖项分为 dependencies(运行时)和 devDependencies(测试、linter)。React Navigation — 标准路由器。Jest — 测试框架。ESLint — 静态分析器,检查代码样式和潜在错误。
常见问题
JavaScript (JS) — 具有动态类型、原型继承和单线程 event loop 模型的编程语言。创建于 1995 年。在移动开发中通过 React Native(原生组件 + JS 逻辑)和 Ionic(WebView 容器)使用。根据 Stack Overflow,连续第十年成为最常用的语言。
React Native 在单独的线程(Hermes 或 JSC)中执行 JS。JS 线程管理逻辑和状态,原生线程渲染 UI 组件。数据交换 — 通过 Bridge(旧架构,JSON 序列化)或 JSI(新 Fabric 架构,直接 C++ 访问)。Hermes — Meta 的 JS 引擎,具有 AOT 编译,将启动时间减少 50%。
JavaScript — 动态类型,类型在运行时检查。TypeScript 添加了静态类型,在编译阶段进行检查,以及接口、泛型和枚举。任何 JS 代码在 TypeScript 中都是有效的。TS 通过 tsc 或 Babel 编译(转译)为纯 JS。在 React Native 中,TS 用于约 65% 的新项目。
主要:React Native(Meta) — 具有 Bridge/Fabric 的原生渲染平台。Ionic(Capacitor) — 通过插件访问原生 API 的 WebView 容器。Apache Cordova — Ionic 的前身,也是 WebView。NativeScript — 无需 WebView 直接访问原生 API。Expo — React Native 之上的层,用于快速原型开发,无需原生构建。
JS 异步性 基于 event loop:call stack(同步代码)→ microtask queue(Promise.then)→ macrotask queue(setTimeout、I/O)。Promise — 用于异步操作的对象。async/await — Promise 之上的语法糖。单线程模型不会阻塞 UI,但 CPU 密集型任务需要 Web Workers 或单独的线程(在 React Native 中 — InteractionManager)。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。