当前位置: 首页 > news >正文

【跨端技术ReactNative】JavaScript学习

文章目录

  • 面试版
    • 1. 与Java语言对比
      • 1.1 请对比 JavaScript 和 Java 的类型系统差异,以及这种差异在 RN+Android 开发中的实际影响?
      • 1.2 谈谈 JavaScript 单线程和 Java 多线程的核心区别,以及在 RN 开发中如何利用这种差异做优化?
      • 1.3 JavaScript 的原型式面向对象和 Java 的类式面向对象有什么本质区别?在 RN 混合开发中如何体现?
    • 2. 数据类型
    • 3. 作用域与变量
      • 3.1 var/let/const 区别
      • 3.2 什么是变量提升
      • 3.3 什么是暂时性死区
  • 学习版
    • 1. 变量与作用域
      • 1.1 let和var的区别
      • 1.2 变量提升(Hoisting)

面试版

1. 与Java语言对比

1.1 请对比 JavaScript 和 Java 的类型系统差异,以及这种差异在 RN+Android 开发中的实际影响?

  • 核心差异
    JS:弱类型、动态类型→ 声明变量无需指定类型,运行时可随意修改类型(如 let a=1; a=‘RN’ 合法),类型检查在运行时。
    Java:强类型、静态类型→ 声明变量必须指定类型(如 int a=1),类型不可随意修改,编译期就做类型校验,不通过直接报错。
  • 实际影响(结合 RN+Android)
    开发效率:JS 灵活,RN 业务迭代快(无需编译,热更新);Java 严谨,Android 原生模块(如 Native Module)类型安全,减少运行时崩溃。
    问题排查:JS 类型错误只有运行时才暴露(如 RN 传参类型错,App 运行才崩);Java 编译期就能发现类型问题,原生模块更稳定。
    工程实践:RN 中会用TypeScript弥补 JS 弱类型缺陷(接近 Java 的静态类型),既保留 JS 灵活,又降低线上问题。

1.2 谈谈 JavaScript 单线程和 Java 多线程的核心区别,以及在 RN 开发中如何利用这种差异做优化?

  • 核心差异
    JS:单线程 → 基于「事件循环 + 异步任务队列」实现异步,无并发问题,但主线程阻塞会导致页面卡顿(RN 中 JS 线程阻塞会让 UI 无响应)。
    Java:多线程 → 支持真正的并行执行,可创建多线程处理耗时任务(如 Android 子线程请求网络),但需处理同步、锁、死锁问题。
  • RN 优化实践
    耗时操作隔离:RN 中 JS 侧的复杂计算 / 大数据处理,丢给 Android 原生(Java 多线程)处理,避免阻塞 JS 线程。
    异步通信:JS 调用原生模块(如扫码、定位)用 Promise 异步回调,不阻塞 JS 主线程;原生侧用 Handler / 线程池处理耗时任务。
    线程分工:RN 中 JS 线程处理业务逻辑,Android 主线程处理 UI 渲染,原生子线程处理耗时操作,各司其职。

1.3 JavaScript 的原型式面向对象和 Java 的类式面向对象有什么本质区别?在 RN 混合开发中如何体现?

  • 核心差异
    JS:原型式 OOP →无「类」的概念(ES6 class 是语法糖),通过「原型链」实现继承,对象直接继承另一个对象的属性 / 方法,灵活但松散。
    Java:类式 OOP →严格的「类 - 对象」体系,先定义类(模板),再实例化对象,继承基于类的 extends,规则严谨、结构清晰。
  • RN 混合开发体现
    JS 侧:RN 组件(如 FunctionComponent/ClassComponent)基于 JS 原型机制,组件复用 / 扩展靠原型链或组合(而非继承),灵活适配多变的业务。
    原生侧:Android 原生模块(如自定义 Native Module)基于 Java 类继承(如继承 ReactContextBaseJavaModule),结构固定、规范统一,保证桥接稳定性。
    桥接层:JS 侧通过原型扩展的方法调用 Java 类实例的方法,两种 OOP 模型通过 RN 桥接机制无缝协作。

2. 数据类型

3. 作用域与变量

3.1 var/let/const 区别

var:函数作用域、变量提升、可重复声明;
let/const:块级作用域、无提升、不可重复声明;
const:声明必赋值,不能改引用(对象内容可改)

3.2 什么是变量提升

JS 编译期将变量 / 函数声明提升到作用域顶部;
var 提升声明,函数提升整个函数体;
let/const 有「暂时性死区」,无变量提升

3.3 什么是暂时性死区

JavaScript 中的 “暂时性死区”(Temporal Dead Zone, 简称 TDZ) 是指在代码中使用 let 或 const 声明变量时,从当前代码块(block)的开始到变量实际声明语句之间的区域。在这个区域内访问该变量会抛出 ReferenceError,因为变量虽然被提升了声明,但尚未被初始化。

学习版

1. 变量与作用域

1.1 let和var的区别

  1. 作用域(Scope)

    • var声明的变量是函数作用域(function-scoped),即变量在它被声明的函数内部都是可见的。
    • let声明的变量是块作用域(block-scoped),即变量只在它被声明的代码块{}内可见。
  2. 变量提升(Hoisting)

    • var声明的变量会被提升(变量声明会被提升到函数或全局作用域的顶部),但其赋值不会被提升。
    • let声明的变量也会被提升,但不会被初始化,因此在声明之前访问该变量会导致ReferenceError(称为“暂时性死区”)。
  3. 重复声明

    • 使用var可以在同一个作用域内多次声明同一个变量。
    • 使用let则不能在同一个作用域内重复声明同一个变量,否则会抛出错误。
  4. 全局对象属性

    • 在全局作用域中使用var声明的变量会成为window对象(浏览器环境)的属性。
    • 使用let声明的变量则不会成为window对象的属性。

示例代码

functionexample(){if(true){varvarVar="var variable";letletVar="let variable";}console.log(varVar);// 输出 "var variable"console.log(letVar);// 报错:letVar is not defined}example();
console.log(varVar);// 输出 undefined(变量提升)varvarVar="I am var";console.log(letVar);// 报错:Cannot access 'letVar' before initializationletletVar="I am let";

1.2 变量提升(Hoisting)

变量提升(Hoisting)是 JavaScript 中一种默认的行为,它将变量和函数的声明自动移动到当前作用域(全局作用域或函数作用域)的顶部。需要注意的是,只有声明会被提升,赋值或初始化不会被提升

  • 通俗理解:

你可以把它想象成:JavaScript 引擎在执行代码之前,会先扫描当前作用域内的所有变量和函数声明,并将它们的声明“提前”到当前作用域的顶部,然后再按顺序执行代码

  1. var声明的变量提升
console.log(a);// 输出 undefinedvara=10;

等价于:

vara;console.log(a);// undefineda=10;
  1. letconst的变量提升(但有“暂时性死区”)
console.log(b);// 报错:Cannot access 'b' before initializationletb=20;

虽然let b也会被提升,但它不会被初始化,因此在声明之前访问会抛出错误,这个区域称为“暂时性死区(Temporal Dead Zone, TDZ)”。
3. 函数声明提升

sayHello();// 输出 "Hello"functionsayHello(){console.log("Hello");}

函数声明会被完整地提升,包括函数体。
4. 函数表达式不会被完整提升

sayHi();// 报错:sayHi is not a functionvarsayHi=function(){console.log("Hi");};

这里sayHi是一个变量,其声明被提升,但赋值(函数表达式)不会被提升。


总结:

  • var声明的变量会被提升,并初始化为undefined
  • letconst也会被提升,但不会被初始化,访问它们会进入“暂时性死区”。
  • 函数声明会被完整提升,可以在声明前调用。
  • 函数表达式不会被完整提升,只能在赋值后调用。

http://www.jsqmd.com/news/491505/

相关文章:

  • 长亭 Xray Web 漏洞扫描器
  • 行业大咖谈数据资产|中海油如何规划数据资产管理?央企硬核实践拆解
  • 湘潭品牌设计公司权威推荐榜单
  • 零/负电价来了!储能业主如何抓住机遇?
  • 中小企业可用福尔蒂轻量化改性套件:含17种PA6/PBT配比+免费云端模拟
  • es为什么快面试回答
  • 筋膜提升第几天最肿
  • 深入解析HDFS:定义、架构、原理、应用场景及常用命令
  • 5 分钟搭建 Deepseek 私有化 RAG 知识库!支持多模型切换 + 激活验证 + 增量索引
  • 高级技巧-让AI自我迭代
  • 香港Web3区块链安全公司排行榜前三都有哪些公司?
  • openclaw、workbuddy上必装的12个RAG 应用 Skill 技能
  • 带你轻松了解半导体CIM系统之AMHS (二)
  • Android Studio 安装保姆级教程(mac版)
  • 巴菲特的持股策略:为什么长期持有是关键
  • 2026选不停机换单印刷机源头厂家,看这几点错不了,质量好的不停机换单印刷机技术实力与市场典范解析 - 品牌推荐师
  • 团队最佳实践
  • 改性塑料行业‘iOS生态’初现:福尔蒂开放6大基础配方API供下游二次开发
  • Redis性能提升3倍的5个冷门技巧,90%开发者都不知道!
  • 提示工程容灾备份策略中的网络依赖:架构师教你解决带宽+延迟问题
  • SQL Server 学习笔记:从 MySQL 到 SQL Server
  • 如何用NFC标签直接打开应用的某个功能?技术深度解析与商业落地
  • 开关接触不良?数据说了算!回路电阻测试仪应用与选购实战 - 品牌推荐大师
  • Git操作指南
  • 2026年五年一贯制专转本机构推荐及选择参考 - 品牌排行榜
  • 2026年四川儿童运动能力与感统训练机构深度评测:专业服务引领儿童全脑发展新趋势 - 深度智识库
  • 迦娃餐馆点餐系统的设计与实现小程序
  • 别再瞎打日志了!这才是 Java 后端日志的正确打开方式
  • 无密码管理:特权访问管理(PAM)的核心应用场景
  • 2026年学培课堂好吗?真实体验与选择指南 - 品牌排行榜