【前端面试3+1】13 JS特性、JS是单线程还是多线程、JS中的一部和同步、【合并两个有序数组】

一、JavaScript特性

  1. **弱类型:**JavaScript是一种弱类型语言,变量的类型可以动态改变,不需要事先声明类型。
  2. 动态性:JavaScript是一种动态语言,可以在运行时修改对象的结构和属性。
  3. **基于原型的:**JavaScript是一种基于原型的语言,对象可以继承另一个对象的属性和方法。
  4. **函数式编程:**JavaScript支持函数式编程范式,可以作为参数传递、赋值给变量等。
  5. **事件驱动:**JavaScript常用于处理事件,如用户交互、网络请求等。
  6. **客户端脚本语言:**JavaScript通常在浏览器中运行,用于操作DOM、响应用户交互等。
  7. 异步编程:JavaScript通过回调函数、Promise、async/await等机制实现异步编程。
  8. 动态网页:JavaScript可以实现动态网页效果,如实时更新内容、表单验证、动画效果等。
  9. 跨平台:JavaScript不仅可以在浏览器中运行,还可以在服务器端(Node.js)和移动端(React Native、Ionic)等环境中运行。

二、JavaScript是单线程还是多线程?

JavaScript(JS)是一种单线程语言。

这意味着JavaScript代码在执行时只有一个主线程,依次执行代码,一次只能处理一个任务。这与一些其他编程语言(如Java、C++)不同,这些语言支持多线程并行执行。虽然JavaScript是单线程的,但它仍然可以利用异步编程技术来实现并发操作。通过事件循环机制和回调函数,JavaScript可以处理异步任务,如网络请求、定时器、事件处理等,而不会阻塞主线程的执行。这种非阻塞的特性使得JavaScript在处理I/O密集型任务时表现出色。

另外,现代的Web浏览器和Node.js环境提供了Web Workers和Worker Threads等机制,允许JavaScript代码创建多个子线程来执行一些计算密集型任务,但这些子线程并不直接操作DOM,仍然需要通过主线程来操作。

因此,虽然JavaScript是单线程的,但可以通过一些技术手段实现类似多线程的效果。

三、JavaScript中的同步和异步

在JavaScript中,异步和同步是指代码执行的方式和顺序

1、同步:

同步代码是按照顺序执行的,每一行代码都必须等待上一行代码执行完成后才能执行。这种执行方式是阻塞的,即代码执行时会阻止后续代码的执行,直到当前代码执行完成。

复制代码
console.log('Start');
console.log('Middle');
console.log('End');

上面的代码会按照顺序依次输出StartMiddleEnd

2、异步:

异步代码不会阻塞后续代码的执行,而是在后台执行,当异步操作完成后会执行相应的回调函数。常见的异步操作包括网络请求、定时器、事件监听等。在JavaScript中,异步操作可以通过回调函数、Promise、async/await等方式来处理,以确保代码的顺序性和可读性。异步操作常用于处理I/O密集型任务,以避免阻塞主线程。

复制代码
console.log('Start');

setTimeout(() => {
    console.log('Middle');
}, 2000);

console.log('End');

上面的代码会先输出Start,然后等待2秒后输出Middle,最后输出End。这是因为setTimeout是一个异步操作,会在2秒后执行回调函数。

四、【算法】合并两个有序数组

1、题目:

给你两个按 非递减顺序 排列的整数数组 nums1nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

2、解题:

要实现将nums2合并到nums1中,并保持非递减顺序,可以按照以下步骤进行:

  1. 初始化两个指针,分别指向nums1和nums2的末尾元素,以及一个指向nums1合并后的末尾位置。

  2. 从后往前遍历nums1和nums2,将较大的元素放入nums1的末尾,并移动相应指针。

  3. 如果nums2中还有元素未处理完,将其依次放入nums1的前面位置

    复制代码
    void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
        int p1 = m - 1; // 指向nums1末尾元素
        int p2 = n - 1; // 指向nums2末尾元素
        int p = m + n - 1; // 指向合并后的末尾位置
        
        while (p1 >= 0 && p2 >= 0) {
            if (nums1[p1] > nums2[p2]) {
                nums1[p] = nums1[p1];
                p1--;
            } else {
                nums1[p] = nums2[p2];
                p2--;
            }
            p--;
        }
        
        // 如果nums2中还有元素未处理完
        while (p2 >= 0) {
            nums1[p] = nums2[p2];
            p2--;
            p--;
        }
    }
相关推荐
不可能的是11 分钟前
Claude Code 子 Agent 机制全解:怎么跑起来、怎么被管理、怎么互不干扰
javascript
AI进化营-智能译站12 分钟前
ROS2 C++开发系列16-智能指针管理传感器句柄|告别ROS2节点内存泄漏与野指针
java·c++·算法·ai
jeffwang13 分钟前
我做了个让 AI 看屏幕跑测试的工具,因为 Playwright 测不了我的 Flutter Web
前端
HSunR42 分钟前
dify 搭建ai作业批改流
开发语言·前端·javascript
CS创新实验室1 小时前
从盘边到芯端——硬盘接口七十年变迁史
算法·磁盘调度
代码不加糖1 小时前
2026 跨境电商独立站实战:从 0 到 1 搭建高转化 SaaS 商城(附源码)
开发语言·前端·javascript
xvhao20131 小时前
单源、多源最短路
数据结构·c++·算法·深度优先·动态规划·图论·图搜索算法
亲亲小宝宝鸭1 小时前
拖一拖控件,拖出个问卷(低代码平台)
前端·低代码
江南十四行1 小时前
ReAct Agent 基本理论与项目实战(一)
前端·react.js·前端框架
MATLAB代码顾问1 小时前
多种群协同进化算法(MPCE)求解大规模作业车间调度问题——附MATLAB代码
开发语言·算法·matlab