作为前端开发者,JavaScript是我们必须掌握的核心技能。无论你是准备面试还是想巩固基础知识,这篇博客都将帮助你全面理解JavaScript的核心概念。我将用通俗易懂的方式,带你梳理100道常见的JavaScript基础知识。
JavaScript有7种基本数据类型:
typeof 1 // 'number'
typeof 'abc' // 'string'
typeof true // 'boolean'
typeof undefined // 'undefined'
typeof null // 'object'(历史遗留问题)
typeof Symbol() // 'symbol'
typeof 123n // 'bigint'
这是一个JavaScript早期设计留下的bug,一直保留到现在。记住这个特殊情况就好。
使用Array.isArray()
方法:
Array.isArray([1, 2, 3]); // true
Array.isArray('abc'); // false
==
会进行类型转换后再比较===
严格相等,不会进行类型转换'5' == 5 // true(字符串'5'转换为数字5再比较)
'5' === 5 // false(类型不同)
undefined
:变量声明了但未赋值null
:值为空,通常用来清空对象或手动赋空var
:函数作用域,有变量提升let
和const
:块级作用域const
声明的变量不能被重新赋值var a = 1;
let b = 2;
const c = 3;
使用var
声明的变量和函数会被提升到作用域顶部:
console.log(a); // undefined
var a = 10;
ES6引入的let
和const
实现的作用域:
{
let a = 1;
const b = 2;
}
console.log(a); // ReferenceError
一种立即执行的函数,用于创建私有作用域:
(function() {
console.log('执行了');
})();
// 函数声明
function foo() {}
// 函数表达式
const bar = function() {};
箭头函数没有自己的this
,它的this
来自外部作用域:
const sum = (a, b) => a + b;
function greet(name = 'guest') {
console.log('Hello, ' + name);
}
greet(); // Hello, guest
把多个参数的函数转化为一系列单参数函数的技术:
function add(a) {
return function(b) {
return a + b;
}
}
const add5 = add(5);
console.log(add5(3)); // 8
每个对象都有一个内部属性[[Prototype]]
,可以通过__proto__
访问。原型链是对象访问属性时的查找机制。
const obj = {};
console.log(obj.__proto__ === Object.prototype); // true
常见方式:
class Animal {
speak() {
console.log('Animal speaks');
}
}
class Dog extends Animal {
speak() {
console.log('Dog barks');
}
}
new Dog().speak(); // Dog barks
{ ...obj }
JSON.parse(JSON.stringify(obj))
或structuredClone(obj)
const obj1 = { a: 1 };
const obj2 = { b: 2 };
const merged = { ...obj1, ...obj2 };
const arr = [1, 2, 2, 3];
const unique = [...new Set(arr)];
回调函数是作为参数传递给另一个函数的函数:
function load(callback) {
setTimeout(() => {
callback('完成');
}, 1000);
}
load((res) => console.log(res));
Promise是异步操作的封装,有三种状态:
const p = new Promise((resolve, reject) => {
resolve('成功');
});
async
函数返回Promise,await
用于等待异步结果:
async function fetchData() {
const data = await fetch('/api');
return data;
}
document.getElementById('id');
document.querySelector('.class');
document.querySelectorAll('div');
element.addEventListener('click', function() {
console.log('点击了');
});
将事件绑定在父级元素,通过事件冒泡捕获子元素的事件:
document.getElementById('list').addEventListener('click', function(e) {
if (e.target.tagName === 'LI') {
console.log('点击了 li');
}
});
BOM(Browser Object Model)是浏览器提供的API,代表对象有:
const params = new URLSearchParams(window.location.search);
console.log(params.get('id'));
以上只是部分基础知识的简要总结。记住,理解原理比死记硬背更重要。建议结合实际项目多加练习,做到知其然,也知其所以然。
推荐更多阅读内容
JavaScript中的10种排序算法:从入门到精通
JavaScript里this的奇妙表现:对象方法调用VS独立调用
JavaScript 页面刷新:从传统到现代的全面解析
使用 react-org-tree 实现卡片模式组织架构图
一次性搞懂 JavaScript 数组方法:reduce、every、some
JavaScript中的对象字段过滤:只保留特定值的字段
JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep:深度拷贝的比较与基础知识
如何在 JavaScript 中优雅地移除对象字段?