JS手写题(50道) 副本

查看飞书原文 ↗11,312 字符
JavaScript编程题集(50道)​
​
基础语法题(1-15题)​
​
1. 问题: 如何创建一个具有原型的对象?​
答案:​
let prototype = {
    greet: function() {
        console.log("Hello!");
    }
};
let obj = Object.create(prototype);
// 或者
function Person(name) {
    this.name = name;
}
Person.prototype.sayHello = function() {
    console.log(`Hello, I'm ${this.name}`);
};
let person = new Person("张三");
2. 问题: 写一个函数判断一个数字是否为偶数。​
答案:​
function isEven(num) {
    return num % 2 === 0;
}
// 或者箭头函数
const isEven = (num) => num % 2 === 0;
​
3. 问题: 如何创建一个包含5个元素的数组?​
答案:​
let arr = [1, 2, 3, 4, 5];
// 或者
let arr = new Array(5).fill(0);
// 或者
let arr = Array.from({length: 5}, (_, i) => i + 1);
​
4. 问题: 写一个函数计算两个数的和。​
答案:​
function add(a, b) {
    return a + b;
}
// 或者箭头函数
const add = (a, b) => a + b;
​
5. 问题: 如何获取字符串的长度?​
答案:​
let str = "Hello";
let length = str.length; // 5
​
6. 问题: 写一个for循环打印1到10的数字。​
答案:​
for (let i = 1; i <= 10; i++) {
    console.log(i);
}
​
7. 问题: 如何检查一个变量是否为undefined?​
答案:​
if (variable === undefined) {
    console.log("变量未定义");
}
// 或者
if (typeof variable === 'undefined') {
    console.log("变量未定义");
}
​
8. 问题: 写一个函数将华氏温度转换为摄氏温度。​
答案:​
function fahrenheitToCelsius(fahrenheit) {
    return (fahrenheit - 32) * 5/9;
}
​
9. 问题: 如何创建一个对象并添加属性?​
答案:​
let person = {
    name: "张三",
    age: 25,
    city: "北京"
};
// 或者
let person = {};
person.name = "张三";
person.age = 25;
​
10. 问题: 写一个函数检查字符串是否包含特定子字符串。​
答案:​
function containsSubstring(str, substring) {
    return str.includes(substring);
}
// 或者
function containsSubstring(str, substring) {
    return str.indexOf(substring) !== -1;
}
​
11. 问题: 如何将字符串转换为数字?​
答案:​
let str = "123";
let num = Number(str);
// 或者
let num = parseInt(str);
// 或者
let num = +str;
​
12. 问题: 写一个函数返回数组中的最大值。​
答案:​
function findMax(arr) {
    return Math.max(...arr);
}
// 或者
function findMax(arr) {
    let max = arr[0];
    for (let i = 1; i < arr.length; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    return max;
}
​
13. 问题: 如何反转一个字符串?​
答案:​
function reverseString(str) {
    return str.split('').reverse().join('');
}
// 或者
function reverseString(str) {
    let reversed = '';
    for (let i = str.length - 1; i >= 0; i--) {
        reversed += str[i];
    }
    return reversed;
}
​
14. 问题: 写一个函数检查一个数是否为质数。​
答案:​
function isPrime(num) {
    if (num < 2) return false;
    for (let i = 2; i <= Math.sqrt(num); i++) {
        if (num % i === 0) return false;
    }
    return true;
}
​
15. 问题: 如何获取当前日期和时间?​
答案:​
let now = new Date();
console.log(now);
// 格式化输出
console.log(now.toLocaleDateString());
console.log(now.toLocaleTimeString());
​
数组操作题(16-25题)​
​
16. 问题: 写一个函数移除数组中的重复元素。​
答案:​
function removeDuplicates(arr) {
    return [...new Set(arr)];
}
// 或者
function removeDuplicates(arr) {
    return arr.filter((item, index) => arr.indexOf(item) === index);
}
​
17. 问题: 如何将两个数组合并?​
答案:​
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let merged = [...arr1, ...arr2];
// 或者
let merged = arr1.concat(arr2);
​
18. 问题: 写一个函数计算数组中所有数字的平均值。​
答案:​
function calculateAverage(arr) {
    let sum = arr.reduce((acc, num) => acc + num, 0);
    return sum / arr.length;
}
​
19. 问题: 如何对数组进行排序?​
答案:​
// 数字排序
let numbers = [3, 1, 4, 1, 5];
numbers.sort((a, b) => a - b); // 升序
numbers.sort((a, b) => b - a); // 降序

// 字符串排序
let strings = ['banana', 'apple', 'cherry'];
strings.sort(); // 字母顺序
​
20. 问题: 写一个函数查找数组中特定元素的索引。​
答案:​
function findIndex(arr, element) {
    return arr.indexOf(element);
}
// 或者使用findIndex方法
function findIndex(arr, condition) {
    return arr.findIndex(condition);
}
​
21. 问题: 如何过滤数组中的偶数?​
答案:​
function filterEvenNumbers(arr) {
    return arr.filter(num => num % 2 === 0);
}
​
22. 问题: 写一个函数将数组中的每个元素乘以2。​
答案:​
function multiplyByTwo(arr) {
    return arr.map(num => num * 2);
}
​
23. 问题: 如何检查数组中是否包含某个元素?​
答案:​
function containsElement(arr, element) {
    return arr.includes(element);
}
// 或者
function containsElement(arr, element) {
    return arr.indexOf(element) !== -1;
}
​
24. 问题: 写一个函数将二维数组扁平化。​
答案:​
function flattenArray(arr) {
    return arr.flat();
}
// 或者递归方法
function flattenArray(arr) {
    let result = [];
    for (let item of arr) {
        if (Array.isArray(item)) {
            result.push(...flattenArray(item));
        } else {
            result.push(item);
        }
    }
    return result;
}
​
25. 问题: 如何获取数组的最后一个元素?​
答案:​
function getLastElement(arr) {
    return arr[arr.length - 1];
}
// 或者
function getLastElement(arr) {
    return arr.slice(-1)[0];
}
​
对象操作题(26-35题)​
​
26. 问题: 写一个函数复制对象的所有属性。​
答案:​
function copyObject(obj) {
    return {...obj};
}
// 或者
function copyObject(obj) {
    return Object.assign({}, obj);
}
// 深拷贝
function deepCopy(obj) {
    return JSON.parse(JSON.stringify(obj));
}
​
27. 问题: 如何获取对象的所有键?​
答案:​
function getObjectKeys(obj) {
    return Object.keys(obj);
}
​
28. 问题: 写一个函数检查对象是否有特定属性。​
答案:​
function hasProperty(obj, prop) {
    return obj.hasOwnProperty(prop);
}
// 或者
function hasProperty(obj, prop) {
    return prop in obj;
}
​
29. 问题: 如何合并两个对象?​
答案:​
function mergeObjects(obj1, obj2) {
    return {...obj1, ...obj2};
}
// 或者
function mergeObjects(obj1, obj2) {
    return Object.assign({}, obj1, obj2);
}
​
30. 问题: 写一个函数计算对象中属性的数量。​
答案:​
function countProperties(obj) {
    return Object.keys(obj).length;
}
​
31. 问题: 如何删除对象的某个属性?​
答案:​
function deleteProperty(obj, prop) {
    delete obj[prop];
    return obj;
}
// 或者创建新对象
function deleteProperty(obj, prop) {
    let {[prop]: deleted, ...rest} = obj;
    return rest;
}
​
32. 问题: 写一个函数将对象转换为数组。​
答案:​
function objectToArray(obj) {
    return Object.entries(obj);
}
// 或者只要值
function objectToArray(obj) {
    return Object.values(obj);
}
​
33. 问题: 如何检查一个值是否为对象?​
答案:​
function isObject(value) {
    return typeof value === 'object' && value !== null && !Array.isArray(value);
}
​
34. 问题: 写一个函数反转对象的键值对。​
答案:​
function reverseObject(obj) {
    let reversed = {};
    for (let key in obj) {
        reversed[obj[key]] = key;
    }
    return reversed;
}
​
35. 问题: 如何创建一个具有原型的对象?​
答案:​
let prototype = {
    greet: function() {
        console.log("Hello!");
    }
};
let obj = Object.create(prototype);
// 或者
function Person(name) {
    this.name = name;
}
Person.prototype.sayHello = function() {
    console.log(`Hello, I'm ${this.name}`);
};
let person = new Person("张三");
​
字符串处理题(36-45题)​
​
36. 问题: 写一个函数统计字符串中每个字符的出现次数。​
答案:​
function countCharacters(str) {
    let count = {};
    for (let char of str) {
        count[char] = (count[char] || 0) + 1;
    }
    return count;
}
​
37. 问题: 如何将字符串的首字母大写?​
答案:​
function capitalizeFirst(str) {
    return str.charAt(0).toUpperCase() + str.slice(1);
}
​
38. 问题: 写一个函数检查字符串是否为回文。​
答案:​
function isPalindrome(str) {
    let cleaned = str.toLowerCase().replace(/[^a-z0-9]/g, '');
    return cleaned === cleaned.split('').reverse().join('');
}
​
39. 问题: 如何替换字符串中的所有空格为下划线?​
答案:​
function replaceSpaces(str) {
    return str.replace(/ /g, '_');
}
// 或者
function replaceSpaces(str) {
    return str.split(' ').join('_');
}
​
40. 问题: 写一个函数提取字符串中的所有数字。​
答案:​
function extractNumbers(str) {
    return str.match(/\d+/g) || [];
}
​
41. 问题: 如何截取字符串的前n个字符?​
答案:​
function truncateString(str, n) {
    return str.substring(0, n);
}
// 或者
function truncateString(str, n) {
    return str.slice(0, n);
}
​
42. 问题: 写一个函数将字符串转换为驼峰命名法。​
答案:​
function toCamelCase(str) {
    return str.replace(/[-_\s]+(.)?/g, (_, char) => 
        char ? char.toUpperCase() : ''
    );
}
​
43. 问题: 如何计算字符串中单词的数量?​
答案:​
function countWords(str) {
    return str.trim().split(/\s+/).filter(word => word.length > 0).length;
}
​
44. 问题: 写一个函数移除字符串两端的空白字符。​
答案:​
function trimString(str) {
    return str.trim();
}
// 手动实现
function trimString(str) {
    return str.replace(/^\s+|\s+$/g, '');
}
​
45. 问题: 如何检查字符串是否以特定前缀开始?​
答案:​
function startsWith(str, prefix) {
    return str.startsWith(prefix);
}
// 手动实现
function startsWith(str, prefix) {
    return str.substring(0, prefix.length) === prefix;
}
​
高级应用题(46-50题)​
​
46. 问题: 写一个函数实现防抖(debounce)。​
答案:​
function debounce(func, delay) {
    let timeoutId;
    return function(...args) {
        clearTimeout(timeoutId);
        timeoutId = setTimeout(() => func.apply(this, args), delay);
    };
}
​
47. 问题: 如何实现一个简单的Promise?​
答案:​
class SimplePromise {
    constructor(executor) {
        this.state = 'pending';
        this.value = undefined;
        this.onResolvedCallbacks = [];
        this.onRejectedCallbacks = [];
        
        const resolve = (value) => {
            if (this.state === 'pending') {
                this.state = 'resolved';
                this.value = value;
                this.onResolvedCallbacks.forEach(fn => fn());
            }
        };
        
        const reject = (reason) => {
            if (this.state === 'pending') {
                this.state = 'rejected';
                this.value = reason;
                this.onRejectedCallbacks.forEach(fn => fn());
            }
        };
        
        executor(resolve, reject);
    }
    
    then(onResolved, onRejected) {
        if (this.state === 'resolved') {
            onResolved(this.value);
        }
        if (this.state === 'rejected') {
            onRejected(this.value);
        }
        if (this.state === 'pending') {
            this.onResolvedCallbacks.push(() => onResolved(this.value));
            this.onRejectedCallbacks.push(() => onRejected(this.value));
        }
    }
}
​
48. 问题: 写一个函数实现深度克隆。​
答案:​
function deepClone(obj) {
    if (obj === null || typeof obj !== 'object') {
        return obj;
    }
    
    if (obj instanceof Date) {
        return new Date(obj.getTime());
    }
    
    if (obj instanceof Array) {
        return obj.map(item => deepClone(item));
    }
    
    if (typeof obj === 'object') {
        const cloned = {};
        for (let key in obj) {
            if (obj.hasOwnProperty(key)) {
                cloned[key] = deepClone(obj[key]);
            }
        }
        return cloned;
    }
}
​
49. 问题: 如何实现一个简单的发布订阅模式?​
答案:​
class EventEmitter {
    constructor() {
        this.events = {};
    }
    
    on(eventName, callback) {
        if (!this.events[eventName]) {
            this.events[eventName] = [];
        }
        this.events[eventName].push(callback);
    }
    
    emit(eventName, ...args) {
        if (this.events[eventName]) {
            this.events[eventName].forEach(callback => {
                callback(...args);
            });
        }
    }
    
    off(eventName, callback) {
        if (this.events[eventName]) {
            this.events[eventName] = this.events[eventName].filter(
                cb => cb !== callback
            );
        }
    }
}
​
50. 问题: 写一个函数实现柯里化(curry)。​
答案:​
function curry(fn) {
    return function curried(...args) {
        if (args.length >= fn.length) {
            return fn.apply(this, args);
        } else {
            return function(...args2) {
                return curried.apply(this, args.concat(args2));
            };
        }
    };
}

// 使用示例
function add(a, b, c) {
    return a + b + c;
}

const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3)); // 6
console.log(curriedAdd(1, 2)(3)); // 6
​
​
本文暂未被其它文档引用