JavaScript:语言基础、React Native与移动开发

作者: IT Sectr 发布日期: 2026-02-10 阅读时间: 11 分钟

JavaScript — 一种编程语言,已成为整个混合移动技术类别的基础。React Native、Ionic、Apache Cordova 和许多其他框架允许使用与 Web 开发统一的技术栈在 JS 中创建移动应用程序。根据 Stack Overflow 调查(2025),JavaScript 连续第十年仍然是最常用的编程语言。详情请查看 Stack Overflow 调查结果

要点

  • JavaScript — 网络语言,成为混合移动开发的基础
  • React Native — 通过 JS 桥接器与原生组件进行原生 UI 渲染
  • Ionic/Cordova — 容器内使用 HTML/CSS/JS 的 WebView 方法
  • 异步性 — event loop、Promise、async/await 实现非阻塞 I/O
  • Node.js — 服务器平台,将 JS 扩展到浏览器之外

什么是 JavaScript?

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 密集型计算中需要谨慎。

JavaScript 标准:ES5、ES6、ES2025

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 支持
ES62015let/const, Promise, class, modules, arrow functions完整
ES82017async/await, Object.entries完整
ES20202020Optional Chaining, Nullish Coalescing, BigInt完整
ES20222022Top-level await, .at(), Error CauseHermes 有限

JavaScript 语法:类型、函数和原型

JavaScript 语法 — 类似 C,动态类型。变量的类型由值决定,并可在运行时更改。let 和 const(ES6)取代了 var 以实现块级作用域。原始类型:string、number、boolean、null、undefined、symbol、bigint。其他一切都是对象(object、array、function、date、regexp)。

函数作为一等公民

JavaScript — 一种具有高阶函数的语言。函数可以赋值给变量、作为参数传递、从其他函数返回。箭头函数(=>)没有自己的 this — 它们从外部上下文继承 this。闭包(closure) — 记住其创建时作用域中变量的函数。

javascript
// 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
// 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 和 Promise

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 解决,而不阻塞线程。

javascript
// 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:移动平台上的 JavaScript

React Native — Meta(Facebook)推出的用于在 JavaScript 中创建原生移动应用的框架。与 WebView 方法不同,React Native 渲染真正的原生组件(iOS 的 UIView、Android 的 ViewGroup)。JS 代码在单独的线程(Hermes 或 JSC)中执行,并通过 Bridge(旧架构)或 JSI(新 Fabric 架构)与原生 UI 线程通信。

React Native 架构

React Native 由 JS 线程(您的代码)、原生线程(UI)和用于它们交互的 Bridge/JSI 组成。在旧架构(Bridge)中,JSON 消息被序列化并异步传输 — 这在快速动画中会造成延迟。新 Fabric 架构(React Native 0.68+)使用 JSI(JavaScript Interface) — JS 与 C++ 对象直接交互,无需序列化。

javascript
// 带有原生 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 和 Cordova:WebView 容器

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 NativeIonic (Capacitor)Cordova
UI 渲染原生组件WebView (WKWebView)WebView
语言JS/TSJS/TS + HTML/CSSJS/TS + HTML/CSS
原生 APIBridge/JSI + 模块Capacitor PluginsCordova Plugins
性能高 (60 FPS)中等 (取决于 WebView)中等
APK 大小~25-40 MB~10-15 MB~8-12 MB
代码复用~60% 代码~95% 代码与 Web 版本~95%

JavaScript 开发者工具

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 编译。

javascript
// 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?

JavaScript (JS) — 具有动态类型、原型继承和单线程 event loop 模型的编程语言。创建于 1995 年。在移动开发中通过 React Native(原生组件 + JS 逻辑)和 Ionic(WebView 容器)使用。根据 Stack Overflow,连续第十年成为最常用的语言。

JavaScript 如何在 React Native 中工作?

React Native 在单独的线程(Hermes 或 JSC)中执行 JS。JS 线程管理逻辑和状态,原生线程渲染 UI 组件。数据交换 — 通过 Bridge(旧架构,JSON 序列化)或 JSI(新 Fabric 架构,直接 C++ 访问)。Hermes — Meta 的 JS 引擎,具有 AOT 编译,将启动时间减少 50%。

JavaScript 与 TypeScript 有何不同?

JavaScript — 动态类型,类型在运行时检查。TypeScript 添加了静态类型,在编译阶段进行检查,以及接口、泛型和枚举。任何 JS 代码在 TypeScript 中都是有效的。TS 通过 tsc 或 Babel 编译(转译)为纯 JS。在 React Native 中,TS 用于约 65% 的新项目。

哪些移动框架使用 JavaScript?

主要:React Native(Meta) — 具有 Bridge/Fabric 的原生渲染平台。Ionic(Capacitor) — 通过插件访问原生 API 的 WebView 容器。Apache Cordova — Ionic 的前身,也是 WebView。NativeScript — 无需 WebView 直接访问原生 API。Expo — React Native 之上的层,用于快速原型开发,无需原生构建。

JavaScript 中的异步性是什么?

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)。

总结

  • JavaScript — 通过 React Native 和 Ionic 进行混合移动开发的通用语言
  • React Native 通过 Bridge/JSI 在单独线程中渲染原生组件和 JS 逻辑
  • Event Loop — 使用 Promise 和 async/await 实现非阻塞 I/O 的单线程异步模型
  • Hermes — Meta 的 JS 引擎,具有 AOT 编译,用于 React Native
  • Ionic/Capacitor — 具有 95% Web 代码复用的 WebView 方法
  • npm — 最大的包管理器,拥有 2+ 百万个 JS 库
  • Expo — React Native 之上的层,用于无需原生构建设置的加速开发

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读