typeof "Hello" // 返回 "string"
typeof 42 // 返回 "number"
typeof true // 返回 "boolean"
typeof undefined // 返回 "undefined"
typeof null // 返回 "object"(这是一个历史遗留问题)
typeof {} // 返回 "object"
typeof [] // 返回 "object"
typeof function() {} // 返回 "function"
const obj = {};
obj instanceof Object; // 返回 true
const arr = [];
arr instanceof Array; // 返回 true
function Person() {}
const person = new Person();
person instanceof Person; // 返回 true
Object.prototype.toString.call("Hello"); // 返回 "[object String]"
Object.prototype.toString.call(42); // 返回 "[object Number]"
Object.prototype.toString.call(true); // 返回 "[object Boolean]"
Object.prototype.toString.call(undefined); // 返回 "[object Undefined]"
Object.prototype.toString.call(null); // 返回 "[object Null]"
Object.prototype.toString.call({}); // 返回 "[object Object]"
Object.prototype.toString.call([]); // 返回 "[object Array]"
Object.prototype.toString.call(function() {}); // 返回 "[object Function]"
Array.isArray([]); // 返回 true
Array.isArray({}); // 返回 false
document.cookie
进行读取和设置。
- 存储容量有限,一般为几 KB。
- 可以设置过期时间,可以是会话级的(关闭浏览器后失效)或具体的日期时间。
- 可以设置域名和路径,控制
Cookies
的作用范围。
- 存储用户的登录状态,实现记住登录功能。
- 跟踪用户行为,进行统计和分析。
Web Storage 提供了比 Cookies 更大的存储容量,并且在客户端存储的数据不会随着每次请求被发送到服务器。
Web Storage 分为两种类型:localStorage
和sessionStorage
。
- 存储容量较大,一般为几 MB。
- 数据在浏览器关闭后仍然存在,除非显式删除。
- 可以通过
localStorage.setItem(key, value)
、localStorage.getItem(key)
、localStorage.removeItem(key)
等方法进行读取和设置。
- 存储容量与
localStorage
相同。- 数据在当前会话(窗口或标签页)关闭后即被删除。
- 可以通过
sessionStorage.setItem(key, value)
、sessionStorage.getItem(key)
、sessionStorage.removeItem(key)
等方法进行读取和设置。
- 存储用户的偏好设置和个性化配置。
- 缓存数据,提高页面加载速度。
- 在不同页面之间共享数据。
- 存储大量结构化数据,如离线应用的数据。
- 需要执行复杂查询操作的场景。
CommonJS 是一种用于服务器端的模块化方案,主要在 Node.js 中使用。它使用 require 函数来加载模块,使用 module.exports 或 exports 导出模块。CommonJS 模块是同步加载的,它会阻塞后续代码的执行,直到模块加载完成。这种同步加载的特性使得 CommonJS 模块非常适合在服务器端环境中使用。
示例:
// 导入模块
const moduleA = require('./moduleA');
// 导出模块
module.exports = {
foo: 'Hello',
bar: 'World'
};
ES6 模块是 ECMAScript 6 引入的官方标准模块化方案,它使用
import
和export
关键字进行模块的导入和导出。ES6 模块是静态加载的,它在编译时就能确定模块的依赖关系,因此具有更好的性能和可靠性。ES6 模块可以在浏览器环境和服务器端环境中使用。
示例:
// 导入模块
import moduleA from './moduleA';
// 导出模块
export default {
foo: 'Hello',
bar: 'World'
};
区别:
require
和 module.exports
,而 ES6 模块使用 import
和 export
。export default
导出默认值,而 CommonJS 模块没有默认导出的机制。在实际开发中,如果你在浏览器环境中使用,可以优先选择使用 ES6 模块。而在服务器端使用 Node.js,则可以选择使用 CommonJS。如果你在项目中需要同时使用两种模块化方案,可以通过工具进行转换,如 Babel 等。
Webpack 是一个模块打包工具,它可以将各种资源文件打包成静态资源,用于在浏览器中加载。在 Webpack 中,常用的 Loader 和 Plugin 可以扩展其功能和处理各种类型的文件。
Loader 是用于转换文件的加载器,在模块的加载过程中对文件进行处理。常见的 Loader 有:
Plugin 是用于扩展 Webpack 功能的插件,可以在整个构建过程中执行自定义的任务。常见的 Plugin 有:
图解 HTTP 缓存
call
, apply
, 和 bind
是 JavaScript 中用于改变函数执行上下文(即函数内部的 this
值)的方法。
function.call(thisArg, arg1, arg2, ...)
call
方法会立即调用函数,并将函数的执行上下文(this
值)设置为 thisArg 参数指定的值,同时可以传递多个参数作为函数的参数进行调用。示例:
function greet(name) {
console.log(`Hello, ${name}! My name is ${this.name}.`);
}
const person = {
name: 'John',
};
greet.call(person, 'Alice');
// 输出: Hello, Alice! My name is John.
function.apply(thisArg, [argsArray])
apply
方法与 call 方法类似,区别在于它接受一个数组(或类数组对象)作为参数列表,而不是单独的参数。示例:
function greet(name) {
console.log(`Hello, ${name}! My name is ${this.name}.`);
}
const person = {
name: 'John',
};
greet.apply(person, ['Alice']);
// 输出: Hello, Alice! My name is John.
function.bind(thisArg, arg1, arg2, ...)
bind
方法创建一个新的函数,并将原函数的执行上下文(this
值)设置为 thisArg
参数指定的值,同时可以传递多个参数作为新函数的参数。不同于 call
和 apply
,bind
不会立即执行函数,而是返回一个绑定了执行上下文的新函数。示例:
function greet(name) {
console.log(`Hello, ${name}! My name is ${this.name}.`);
}
const person = {
name: 'John',
};
const greetPerson = greet.bind(person);
greetPerson('Alice');
// 输出: Hello, Alice! My name is John.
函数柯里化(Currying)是一种将接受多个参数的函数转换为一系列接受单个参数的函数的技术。
通过函数柯里化,我们可以更灵活地处理函数的参数,提高代码的可读性、复用性和可维护性。
示例:
function add(a, b, c) {
return a + b + c;
}
// 将 add 函数柯里化
function curryAdd(a) {
return function(b) {
return function(c) {
return add(a, b, c);
}
}
}
// 使用柯里化的函数进行调用
const result = curryAdd(1)(2)(3);
console.log(result); // 输出: 6
在上面例子中,我们通过
curryAdd
函数将add
函数进行柯里化。通过传递参数1
、2
和3
,我们分别得到了一个新的函数,并最终执行了函数调用,得到了结果6
。
函数柯里化在实际开发中的应用场景,比如:
闭包(Closure)是指一个函数能够访问并操作其词法作用域外部的变量的能力。具体来说,闭包是由函数以及函数内部能够访问的变量组合而成的包裹(Closure)。
闭包的主要特点包括:
闭包的作用有以下几个方面:
示例:
function outerFunction() {
var outerVariable = 'Hello';
function innerFunction() {
console.log(outerVariable);
}
return innerFunction;
}
var closure = outerFunction();
closure(); // 输出: Hello
在上面的例子,
innerFunction
是一个闭包,它可以访问outerFunction
中的变量outerVariable
,即使在outerFunction
执行完毕后依然可以访问。