【跨端技术ReactNative】JavaScript学习

【跨端技术ReactNative】JavaScript学习 文章目录面试版1. 与Java语言对比1.1 请对比 JavaScript 和 Java 的类型系统差异以及这种差异在 RNAndroid 开发中的实际影响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 的类型系统差异以及这种差异在 RNAndroid 开发中的实际影响核心差异JS弱类型、动态类型→ 声明变量无需指定类型运行时可随意修改类型如 let a1; a‘RN’ 合法类型检查在运行时。Java强类型、静态类型→ 声明变量必须指定类型如 int a1类型不可随意修改编译期就做类型校验不通过直接报错。实际影响结合 RNAndroid开发效率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的区别作用域Scopevar声明的变量是函数作用域function-scoped即变量在它被声明的函数内部都是可见的。let声明的变量是块作用域block-scoped即变量只在它被声明的代码块{}内可见。变量提升Hoistingvar声明的变量会被提升变量声明会被提升到函数或全局作用域的顶部但其赋值不会被提升。let声明的变量也会被提升但不会被初始化因此在声明之前访问该变量会导致ReferenceError称为“暂时性死区”。重复声明使用var可以在同一个作用域内多次声明同一个变量。使用let则不能在同一个作用域内重复声明同一个变量否则会抛出错误。全局对象属性在全局作用域中使用var声明的变量会成为window对象浏览器环境的属性。使用let声明的变量则不会成为window对象的属性。示例代码functionexample(){if(true){varvarVarvar variable;letletVarlet variable;}console.log(varVar);// 输出 var variableconsole.log(letVar);// 报错letVar is not defined}example();console.log(varVar);// 输出 undefined变量提升varvarVarI am var;console.log(letVar);// 报错Cannot access letVar before initializationletletVarI am let;1.2 变量提升Hoisting变量提升Hoisting是 JavaScript 中一种默认的行为它将变量和函数的声明自动移动到当前作用域全局作用域或函数作用域的顶部。需要注意的是只有声明会被提升赋值或初始化不会被提升。通俗理解你可以把它想象成JavaScript 引擎在执行代码之前会先扫描当前作用域内的所有变量和函数声明并将它们的声明“提前”到当前作用域的顶部然后再按顺序执行代码var声明的变量提升console.log(a);// 输出 undefinedvara10;等价于vara;console.log(a);// undefineda10;let和const的变量提升但有“暂时性死区”console.log(b);// 报错Cannot access b before initializationletb20;虽然let b也会被提升但它不会被初始化因此在声明之前访问会抛出错误这个区域称为“暂时性死区Temporal Dead Zone, TDZ”。3. 函数声明提升sayHello();// 输出 HellofunctionsayHello(){console.log(Hello);}函数声明会被完整地提升包括函数体。4. 函数表达式不会被完整提升sayHi();// 报错sayHi is not a functionvarsayHifunction(){console.log(Hi);};这里sayHi是一个变量其声明被提升但赋值函数表达式不会被提升。总结var声明的变量会被提升并初始化为undefined。let和const也会被提升但不会被初始化访问它们会进入“暂时性死区”。函数声明会被完整提升可以在声明前调用。函数表达式不会被完整提升只能在赋值后调用。