Skip to content

JS手写题

JavaScript编程题集(50道)

基础语法题(1-15题)

数组操作题(16-25题)

对象操作题(26-35题)

字符串处理题(36-45题)

高级应用题(46-50题)


基础语法题(1-15题)

1. 如何创建一个具有原型的对象?

答案:

javascript
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. 写一个函数判断一个数字是否为偶数。

答案:

javascript
function isEven(num) {
  return num % 2 === 0
}

// 或者箭头函数
const isEven = num => num % 2 === 0

3. 如何创建一个包含5个元素的数组?

答案:

javascript
let arr = [1, 2, 3, 4, 5]

// 或者
let arr = new Array(5).fill(0)

// 或者
let arr = Array.from({ length: 5 }, (_, i) => i + 1)

4. 写一个函数计算两个数的和。

答案:

javascript
function add(a, b) {
  return a + b
}

// 或者箭头函数
const add = (a, b) => a + b

5. 如何获取字符串的长度?

答案:

javascript
let str = 'Hello'
let length = str.length // 5

6. 写一个for循环打印1到10的数字。

答案:

javascript
for (let i = 1; i <= 10; i++) {
  console.log(i)
}

7. 如何检查一个变量是否为undefined?

答案:

javascript
if (variable === undefined) {
  console.log('变量未定义')
}

// 或者
if (typeof variable === 'undefined') {
  console.log('变量未定义')
}

8. 写一个函数将华氏温度转换为摄氏温度。

答案:

javascript
function fahrenheitToCelsius(fahrenheit) {
  return ((fahrenheit - 32) * 5) / 9
}

9. 如何创建一个对象并添加属性?

答案:

javascript
let person = {
  name: '张三',
  age: 25,
  city: '北京'
}

// 或者
let person = {}
person.name = '张三'
person.age = 25

10. 写一个函数检查字符串是否包含特定子字符串。

答案:

javascript
function containsSubstring(str, substring) {
  return str.includes(substring)
}

// 或者
function containsSubstring(str, substring) {
  return str.indexOf(substring) !== -1
}

11. 如何将字符串转换为数字?

答案:

javascript
let str = '123'
let num = Number(str)

// 或者
let num = parseInt(str)

// 或者
let num = +str

12. 写一个函数返回数组中的最大值。

答案:

javascript
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. 如何反转一个字符串?

答案:

javascript
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. 写一个函数检查一个数是否为质数。

答案:

javascript
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. 如何获取当前日期和时间?

答案:

javascript
let now = new Date()
console.log(now)

// 格式化输出
console.log(now.toLocaleDateString())
console.log(now.toLocaleTimeString())

数组操作题(16-25题)

16. 写一个函数移除数组中的重复元素。

答案:

javascript
function removeDuplicates(arr) {
  return [...new Set(arr)]
}

// 或者
function removeDuplicates(arr) {
  return arr.filter((item, index) => arr.indexOf(item) === index)
}

17. 如何将两个数组合并?

答案:

javascript
let arr1 = [1, 2, 3]
let arr2 = [4, 5, 6]
let merged = [...arr1, ...arr2]

// 或者
let merged = arr1.concat(arr2)

18. 写一个函数计算数组中所有数字的平均值。

答案:

javascript
function calculateAverage(arr) {
  let sum = arr.reduce((acc, num) => acc + num, 0)
  return sum / arr.length
}

19. 如何对数组进行排序?

答案:

javascript
// 数字排序
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. 写一个函数查找数组中特定元素的索引。

答案:

javascript
function findIndex(arr, element) {
  return arr.indexOf(element)
}

// 或者使用findIndex方法
function findIndex(arr, condition) {
  return arr.findIndex(condition)
}

21. 如何过滤数组中的偶数?

答案:

javascript
function filterEvenNumbers(arr) {
  return arr.filter(num => num % 2 === 0)
}

22. 写一个函数将数组中的每个元素乘以2。

答案:

javascript
function multiplyByTwo(arr) {
  return arr.map(num => num * 2)
}

23. 如何检查数组中是否包含某个元素?

答案:

javascript
function containsElement(arr, element) {
  return arr.includes(element)
}

// 或者
function containsElement(arr, element) {
  return arr.indexOf(element) !== -1
}

24. 写一个函数将二维数组扁平化。

答案:

javascript
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. 如何获取数组的最后一个元素?

答案:

javascript
function getLastElement(arr) {
  return arr[arr.length - 1]
}

// 或者
function getLastElement(arr) {
  return arr.slice(-1)[0]
}

对象操作题(26-35题)

26. 写一个函数复制对象的所有属性。

答案:

javascript
function copyObject(obj) {
  return { ...obj }
}

// 或者
function copyObject(obj) {
  return Object.assign({}, obj)
}

// 深拷贝
function deepCopy(obj) {
  return JSON.parse(JSON.stringify(obj))
}

27. 如何获取对象的所有键?

答案:

javascript
function getObjectKeys(obj) {
  return Object.keys(obj)
}

28. 写一个函数检查对象是否有特定属性。

答案:

javascript
function hasProperty(obj, prop) {
  return obj.hasOwnProperty(prop)
}

// 或���
function hasProperty(obj, prop) {
  return prop in obj
}

29. 如何合并两个对象?

答案:

javascript
function mergeObjects(obj1, obj2) {
  return { ...obj1, ...obj2 }
}

// 或者
function mergeObjects(obj1, obj2) {
  return Object.assign({}, obj1, obj2)
}

30. 写一个函数计算对象中属性的数量。

答案:

javascript
function countProperties(obj) {
  return Object.keys(obj).length
}

31. 如何删除对象的某个属性?

答案:

javascript
function deleteProperty(obj, prop) {
  delete obj[prop]
  return obj
}

// 或者创建新对象
function deleteProperty(obj, prop) {
  let { [prop]: deleted, ...rest } = obj
  return rest
}

32. 写一个函数将对象转换为数组。

答案:

javascript
function objectToArray(obj) {
  return Object.entries(obj)
}

// 或者只要值
function objectToArray(obj) {
  return Object.values(obj)
}

33. 如何检查一个值是否为对象?

答案:

javascript
function isObject(value) {
  return typeof value === 'object' && value !== null && !Array.isArray(value)
}

34. 写一个函数反转对象的键值对。

答案:

javascript
function reverseObject(obj) {
  let reversed = {}
  for (let key in obj) {
    reversed[obj[key]] = key
  }
  return reversed
}

35. 如何创建一个具有原型的对象?

答案:

javascript
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. 写一个函数统计字符串中每个字符的出现次数。

答案:

javascript
function countCharacters(str) {
  let count = {}
  for (let char of str) {
    count[char] = (count[char] || 0) + 1
  }
  return count
}

37. 如何将字符串的首字母大写?

答案:

javascript
function capitalizeFirst(str) {
  return str.charAt(0).toUpperCase() + str.slice(1)
}

38. 写一个函数检查字符串是否为回文。

答案:

javascript
function isPalindrome(str) {
  let cleaned = str.toLowerCase().replace(/[^a-z0-9]/g, '')
  return cleaned === cleaned.split('').reverse().join('')
}

39. 如何替换字符串中的所有空格为下划线?

答案:

javascript
function replaceSpaces(str) {
  return str.replace(/ /g, '_')
}

// 或者
function replaceSpaces(str) {
  return str.split(' ').join('_')
}

40. 写一个函数提取字符串中的所有数字。

答案:

javascript
function extractNumbers(str) {
  return str.match(/\d+/g) || []
}

41. 如何截取字符串的前n个字符?

答案:

javascript
function truncateString(str, n) {
  return str.substring(0, n)
}

// 或者
function truncateString(str, n) {
  return str.slice(0, n)
}

42. 写一个函数将字符串转换为驼峰命名法。

答案:

javascript
function toCamelCase(str) {
  return str.replace(/[-_\s]+(.)?/g, (_, char) =>
    char ? char.toUpperCase() : ''
  )
}

43. 如何计算字符串中单词的数量?

答案:

javascript
function countWords(str) {
  return str
    .trim()
    .split(/\s+/)
    .filter(word => word.length > 0).length
}

44. 写一个函数移除字符串两端的空白字符。

答案:

javascript
function trimString(str) {
  return str.trim()
}

// 手动实现
function trimString(str) {
  return str.replace(/^\s+|\s+$/g, '')
}

45. 如何检查字符串是否以特定前缀开始?

答案:

javascript
function startsWith(str, prefix) {
  return str.startsWith(prefix)
}

// 手动实现
function startsWith(str, prefix) {
  return str.substring(0, prefix.length) === prefix
}

高级应用题(46-50题)

46. 写一个函数实现防抖(debounce)。

答案:

javascript
function debounce(func, delay) {
  let timeoutId
  return function (...args) {
    clearTimeout(timeoutId)
    timeoutId = setTimeout(() => func.apply(this, args), delay)
  }
}

47. 如何实现一个简单的Promise?

答案:

javascript
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. 写一个函数实现深度克隆。

答案:

javascript
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. 如何实现一个简单的发布订阅模式?

答案:

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

答案:

javascript
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

基于 VitePress 的本地知识库