JS相关知识点总结

js函数说明

Object.setPrototypeOf

在 JavaScript 中用于设置一个对象的原型(即内部的 [[Prototype]] 属性)。这个方法通常用于改变对象的继承链,或者将一个对象的原型设置为 null 来防止进一步的原型继承。

// 构造函数
function Animal(name) {
  this.name = name;
}

// 添加一个方法到 Animal 原型上
Animal.prototype.speak = function() {
  console.log(this.name + ' makes a sound.');
};

// 使用构造函数创建一个实例
const animal = new Animal('Generic animal');

// 创建另一个构造函数
function Vehicle(make, model) {
  this.make = make;
  this.model = model;
}

// 添加一个方法到 Vehicle 原型上
Vehicle.prototype.describe = function() {
  console.log('This is a ' + this.make + ' ' + this.model + ' vehicle.');
};

// 使用构造函数创建一个 Vehicle 实例
const car = new Vehicle('Toyota', 'Corolla');

// 现在,我们将 car 实例的原型设置为 animal 实例
// 这意味着 car 将继承 animal 实例的所有属性和方法
Object.setPrototypeOf(car, animal);

// 验证原型链是否已改变
console.log(Object.getPrototypeOf(car) === animal); // 输出: true

// 由于 car 的原型现在是 animal,它继承了 speak 方法
car.speak(); // 输出: Generic animal makes a sound.

// 为了演示,我们也可以将 car 的原型设置为 null,这样它就不再有原型
Object.setPrototypeOf(car, null);

// 再次验证原型链
console.log(Object.getPrototypeOf(car) === null); // 输出: true

// 现在 car 没有原型,因此不能访问 speak 方法
car.speak(); // 输出: TypeError: car.speak is not a function

在这个例子中,我们首先定义了两个构造函数 AnimalVehicle,并分别为它们的原型添加了方法 speakdescribe。然后,我们分别使用这两个构造函数创建了 animalcar 实例。接下来,我们使用 Object.setPrototypeOf 方法将 car 实例的原型设置为 animal 实例。这意味着 car 现在继承了 animal 实例的所有属性和方法。我们通过调用 car.speak() 来验证这一点,它输出了 animal 实例的名字和声音。最后,我们再次使用 Object.setPrototypeOf 方法将 car 的原型设置为 null,这意味着 car 将不再继承任何属性和方法。当我们尝试调用 car.speak() 时,由于 car 没有 speak 方法,因此抛出了一个类型错误。这个例子展示了 Object.setPrototypeOf 方法如何用于修改对象的原型链,以及如何通过改变原型来控制对象继承的属性和方法。setPrototypeOf函数在影响了继承链的同时,也对控制对象的继承方法和属性有了更好的理解。

Object.getOwnPropertyDescriptor

Object.getOwnPropertyDescriptor 方法在 JavaScript 中用于获取指定对象上给定属性的描述信息。描述信息是一个包含属性的各种元数据的对象,例如属性是否可枚举、是否可写、默认值以及 getter 和 setter 函数等。这个方法对于深入了解对象属性的具体行为和特征非常有用,尤其是在调试或者需要精确控制对象属性时。

// 创建一个对象,并定义一个属性
const myObject = {
  myProperty: 'Hello, World!'
};

// 定义一个 getter 和一个 setter 函数
const getter = function () {
  return this.myProperty + ' (accessed via getter)';
};

const setter = function (newValue) {
  this.myProperty = newValue + ' (updated via setter)';
};

// 使用 Object.defineProperty 为对象添加一个带有 getter 和 setter 的属性
Object.defineProperty(myObject, 'accessorProperty', {
  get: getter,
  set: setter,
  enumerable: true,
  configurable: true
});

// 使用 Object.getOwnPropertyDescriptor 获取属性描述信息
const descriptor = Object.getOwnPropertyDescriptor(myObject, 'accessorProperty');

// 打印属性描述信息
console.log(descriptor);
// 输出:
// {
//   value: 'Hello, World! (accessed via getter)',
//   writable: false,
//   enumerable: true,
//   configurable: true,
//   get: [Function: getter],
//   set: [Function: setter]
// }

// 直接访问属性值
console.log(myObject.accessorProperty); // 输出: 'Hello, World! (accessed via getter)'

// 修改属性值
myObject.accessorProperty = 'Goodbye, World!';
console.log(myObject.accessorProperty); // 输出: 'Goodbye, World! (updated via setter)'

    在这个例子中,我们首先创建了一个对象 myObject 并给它定义了一个普通的属性 myProperty。接着,我们定义了一个 getter 函数和一个 setter 函数,并将它们与 Object.defineProperty 方法一起使用,为 myObject 添加了一个带有访问器(accessor)的属性 accessorProperty。使用 Object.getOwnPropertyDescriptor 方法,我们获取了 accessorProperty 的描述信息,并打印出来。描述信息对象包含了属性的值、是否可写、是否可枚举、是否可配置以及 getter 和 setter 函数的引用。然后,我们通过直接访问 accessorProperty 来触发 getter 函数,并打印出它的返回值。之后,我们尝试修改 accessorProperty 的值,这将触发 setter 函数,并将修改后的值打印出来。通过这个例子,我们可以看到 Object.getOwnPropertyDescriptor 方法如何帮助我们获取和理解对象属性的详细信息。

另外要提醒一下,对于定义在对象里面的不可枚举的一些属性的时候,getOwnPropertyDescriptor 方法是不可以枚举出这些属性的。要用getOwnPropertyNames 方法。

Object.getOwnPropertyNames

  Object.getOwnPropertyNames 方法在 JavaScript 中用于获取一个对象的所有可枚举的自有属性的名称,包括那些不可枚举的属性。这个方法返回一个字符串数组,数组中的每个元素都是对象的一个属性名。这个方法对于理解对象的内部属性非常有用,尤其是当你想要获取对象所有的属性,包括那些可能在常规枚举中被忽略的属性时。下面是一个使用 Object.getOwnPropertyNames 方法的例子:

// 定义一个对象
const myObject = {
  enumerableProperty: 'I am enumerable',
  nonEnumerableProperty: 'I am not enumerable'
};

// 添加一个不可枚举的属性
Object.defineProperty(myObject, 'anotherNonEnumerableProperty', {
  value: 'Another non-enumerable property',
  enumerable: false
});

// 使用 Object.keys 获取对象的键(只能获取可枚举的键)
const keys = Object.keys(myObject);
console.log(keys); // 输出: ["enumerableProperty"]

// 使用 Object.getOwnPropertyNames 获取对象的所有自有属性名称
const allPropertyNames = Object.getOwnPropertyNames(myObject);
console.log(allPropertyNames); // 输出: ["enumerableProperty", "nonEnumerableProperty", "anotherNonEnumerableProperty"]

   在这个例子中,我们首先定义了一个对象 myObject,它包含一个可枚举属性 enumerableProperty 和一个不可枚举属性 nonEnumerableProperty。然后,我们使用 Object.defineProperty 方法添加了另一个不可枚举属性 anotherNonEnumerableProperty。当我们使用 Object.keys 方法时,它只返回了可枚举的属性 enumerableProperty。然而,当我们使用 Object.getOwnPropertyNames 方法时,它返回了所有的自有属性名称,包括那些不可枚举的属性 nonEnumerablePropertyanotherNonEnumerableProperty。这个方法在调试或者当你需要分析一个对象的所有属性时非常有用,尤其是当你不确定对象中是否存在某些属性时。

Object.getOwnPropertySymbols

在 JavaScript 中用于获取一个对象的所有自有符号属性(Symbol properties)。符号属性是一种特殊的属性,它通过 Symbol 函数创建,具有唯一性,即使两个不同的 Symbol 看起来可能相同,它们在技术上也是不同的。这个方法对于处理那些希望避免属性名冲突的高级用例非常有用,因为 Symbol 值是唯一的,不会与其他属性名或 Symbol 值冲突。

下面是一个使用 Object.getOwnPropertySymbols 方法的例子:

// 创建一个对象
const myObject = {};

// 定义两个符号属性并添加到对象中
const sym1 = Symbol('uniqueDescription1');
const sym2 = Symbol('uniqueDescription2');

myObject[sym1] = 'This is a symbol property with description 1';
myObject[sym2] = 'This is another symbol property with description 2';

// 使用 Object.getOwnPropertyNames 获取对象的所有自有字符串属性名称
const stringPropertyNames = Object.getOwnPropertyNames(myObject);
console.log(stringPropertyNames); // 输出: []

// 使用 Object.getOwnPropertySymbols 获取对象的所有自有符号属性
const symbolProperties = Object.getOwnPropertySymbols(myObject);
console.log(symbolProperties); // 输出: [Symbol(uniqueDescription1), Symbol(uniqueDescription2)]

// 打印符号属性的描述和值
symbolProperties.forEach(sym => {
  console.log(`Symbol description: ${sym.description}, Symbol value: ${myObject[sym]}`);
});
// 输出:
// Symbol description: uniqueDescription1, Symbol value: This is a symbol property with description 1
// Symbol description: uniqueDescription2, Symbol value: This is another symbol property with description 2

在这个例子中,我们首先创建了一个空对象 myObject,然后定义了两个具有不同描述的符号,并使用这些符号作为属性名将它们添加到 myObject 中。我们还为这些符号属性赋予了字符串值。当我们使用 Object.getOwnPropertyNames 方法时,它没有返回任何属性名称,因为 myObject 中没有可枚举的字符串属性。然而,当我们使用 Object.getOwnPropertySymbols 方法时,它返回了一个包含所有自有符号属性的数组。最后,我们遍历了符号属性数组,并打印了每个符号的描述和对应的值。这展示了如何访问和使用符号属性,尽管在大多数情况下,我们更倾向于使用 Object.keysObject.getOwnPropertyNames 来处理常规属性。

Object.getPrototypeOf

Object.getPrototypeOf方法在 JavaScript 中用于获取指定对象的原型对象,即对象链中的下一个链接。原型对象是对象继承属性和方法的来源。这个方法对于理解对象的继承结构和访问对象原型上的属性和方法非常有用。用来改变原有的继承链,也同时像setPrototypeOf 一样,去改变原有的继承对象的属性与方法。下面是一个使用 Object.getPrototypeOf 方法的例子:

// 构造函数
function Animal(name) {
  this.name = name;
}

// 添加一个方法到 Animal 原型上
Animal.prototype.speak = function() {
  console.log(this.name + ' makes a sound.');
};

// 使用构造函数创建一个实例
const animal = new Animal('Generic animal');

// 获取 animal 实例的原型对象
const proto = Object.getPrototypeOf(animal);

// 由于 Animal.prototype 被设置为 animal 的原型,proto 将指向 Animal.prototype
console.log(proto === Animal.prototype); // 输出: true

// 调用通过原型继承的 speak 方法
proto.speak.call(animal); // 输出: Generic animal makes a sound.

// 创建另一个对象,使用 Object.create 方法设置其原型为 animal 实例
const anotherAnimal = Object.create(animal);

// 此时,anotherAnimal 的原型是 animal 实例
const anotherProto = Object.getPrototypeOf(anotherAnimal);
console.log(anotherProto === animal); // 输出: true

// 由于 anotherAnimal 是以 animal 为原型创建的,它不会继承 Animal.prototype 上的方法
anotherProto.speak.call(anotherAnimal); // 输出: undefined makes a sound.

    在这个例子中,我们首先定义了一个 Animal 构造函数,并为其原型添加了一个 speak 方法。然后,我们使用 new 关键字创建了一个 animal 实例。通过 Object.getPrototypeOf 方法,我们获取了 animal 实例的原型对象,它指向 Animal.prototype。因此,当我们调用 proto.speak.call(animal) 时,它能够正确地输出 animal 实例的名字和它发出的声音。接下来,我们使用 Object.create 方法创建了一个新的对象 anotherAnimal,其原型被设置为 animal 实例。这意味着 anotherAnimal 继承自 animal 实例,而不是 Animal.prototype。当我们尝试通过 anotherProto.speak.call(anotherAnimal) 调用 speak 方法时,由于 animal 实例上没有 speak 方法,所以输出为 undefined makes a sound.。这个例子展示了 Object.getPrototypeOf 方法如何帮助我们访问和理解对象的原型链,以及如何通过原型链访问对象的属性和方法。

另外说一下,在实际的工作场景中使用到这个方法的案例不是特别常见,我们可以通过在不同的场景对象下使用不同的方法来获取到原型对象:

在p实例化对象的场景下,用.__proto__的方法,即是p.__proto__;在person构造函数的情况下用.prototype的方法来获取到原型对象,最后得到的结果是一样的。

    在上面这个例子中的 p 对象的原型链结构图如下:
    p 对象 ----->Person.prototype------->Object.prototype--------->null
    对这个实例化对象而言,访问对象的属性,是首先在对象本身去找,如果没有,就会去他的原型对象中找,一直找到原型链的终点;如果是修改对象的属性,如果这个实例化对象中有这个属性,就修改,没 有这个属性就添加这个属性。
     这里面说明一下,如果写了Person.prototype.myname = 'hello world' 那么 Person.prototype 上原本是没有这个属性的就会加上这个属性,如果有就修改,有点字典那意思 Person.prototype就是原型对象,如果给他加一个属性myname, 那么所有通过 Person 实例化出来的对象 都可以调用myname 这个属性,做到属性在实例化对象间共享,但是如果哪个实例化对象被赋值了自己 的myname 属性,那么再调用就用它自己的了,这就像子类和父类,这里实例化对象有就用自己的属 性,没有就用原型对象的属性,实例对象如果要修改原型对象的属性,可以这样 p . __proto__ . myname = 'haha'

Object.keys

Object.keys 方法在 JavaScript 中用于获取一个对象自身的所有可枚举属性的键名(属性名),并以数组的形式返回。这个方法通常用于遍历对象的属性,尤其是当你需要对对象的属性进行操作时。下面是一个使用 Object.keys 方法的例子:

// 创建一个对象,包含多个属性,其中一些属性是不可枚举的
const myObject = {
  enumerableProperty: 'This property is enumerable',
  nonEnumerableProperty: 'This property is not enumerable',
  anotherEnumerableProperty: 'Another enumerable property'
};

// 使用 Object.defineProperty 为对象添加一个不可枚举的属性
Object.defineProperty(myObject, 'anotherNonEnumerableProperty', {
  value: 'This is another non-enumerable property',
  writable: true,
  enumerable: false,
  configurable: true
});

// 使用 Object.keys 获取对象的可枚举属性键名
const keys = Object.keys(myObject);
console.log(keys); // 输出: ["enumerableProperty", "anotherEnumerableProperty"]

// 尝试使用 for...in 循环遍历对象的所有属性
for (const key in myObject) {
  console.log(key + ': ' + myObject[key]);
}
// 输出:
// enumerableProperty: This property is enumerable
// nonEnumerableProperty: This property is not enumerable
// anotherEnumerableProperty: Another enumerable property
// anotherNonEnumerableProperty: This is another non-enumerable property

// 说明:for...in 循环会枚举对象自身的属性以及其原型链上可枚举的属性

在这个例子中,我们首先创建了一个 myObject 对象,它包含一个可枚举属性 enumerableProperty,一个不可枚举属性 nonEnumerableProperty,以及一个通过 Object.defineProperty 添加的不可枚举属性 anotherNonEnumerableProperty。当我们使用 Object.keys 方法时,它只返回了可枚举的属性键名,即 enumerablePropertyanotherEnumerableProperty。不可枚举的属性 nonEnumerablePropertyanotherNonEnumerableProperty 没有被包含在内。随后,我们使用 for...in 循环遍历对象的所有属性,包括可枚举和不可枚举的属性。这是因为 for...in 循环不仅枚举对象自身的属性,还会枚举其原型链上可枚举的属性。通过这个例子,我们可以看到 Object.keys 方法如何用于获取对象的可枚举属性键名,这对于编写只处理可枚举属性的代码非常有用。同时,我们也了解了 for...in 循环与 Object.keys 方法在枚举属性方面的差异。

Object.preventExtensions

Object.preventExtensions 方法在 JavaScript 中用于阻止一个对象被添加新的属性,即冻结对象。如果操作成功,该方法返回 true;如果对象已经是不可扩展的,或者操作失败(例如,对象是密封的),则返回 false。这个方法对于确保对象的完整性和安全性非常有用,尤其是在你不希望对象的结构在运行时被改变的情况下。下面是一个使用 Object.preventExtensions 方法的例子:

// 创建一个对象
const myObject = {
  property1: 42
};

// 检查对象是否可扩展
console.log(Object.isExtensible(myObject)); // 输出: true

// 阻止对象扩展新的属性
const success = Object.preventExtensions(myObject);
console.log(success); // 输出: true

// 尝试添加新的属性
myObject.property2 = 'Hello';
console.log(myObject.property2); // 输出: undefined

// 再次检查对象是否可扩展
console.log(Object.isExtensible(myObject)); // 输出: false

// 修改现有属性的值
myObject.property1 = 100;
console.log(myObject.property1); // 输出: 100

// 删除现有属性
delete myObject.property1; // 返回 true,表示删除成功
console.log(myObject.property1); // 输出: undefined

在这个例子中,我们首先创建了一个对象 myObject 并给它定义了一个属性 property1。使用 Object.isExtensible 方法检查对象是否可扩展,此时输出为 true,表示对象可以添加新属性。接着,我们调用 Object.preventExtensions 方法来防止对象扩展新属性。尝试给对象添加一个新属性 property2,但是操作失败,新属性没有被添加到对象中,且 property2 的值为 undefined。尽管我们阻止了对象扩展新属性,但是现有的属性仍然可以被修改或删除。我们修改了 property1 的值,并成功将其删除。这个例子展示了 Object.preventExtensions 方法如何用于控制对象的结构,防止对象被意外地修改,同时保持对现有属性的灵活性。

拦截器

首先,我们在这儿定义了一个这样的方法,然后给它在这个属性就是my project, 这个对象是绑定了一个方法,绑定这个方法之后,它就有这两个属性。一个属性是get,另一个属性是set,结合上面分别定义了getter和setter方法。get属性起到的作用是通知,当有人调用我们这个方法时,我们会通过定义的getter函数来达到通知的作用。set属性起到的作用是拦截,当有人调用我们这个方法时,通过写好的setter函数来达到拦截的作用。

js中一些知识点补充

js>>>

JavaScript 中,三个大于号( >>> )是一种无符号右移位运算符。它将操作数的二进制表示向右移动 指定的位数,右侧用零填充,然后返回结果。 在这个例子中,16 被右移两位,因此它的二进制表示变为了 100 (即 4 ),然后它被转换为十进制并赋给 num变量。因此,这段代码将打印出 4 。 请注意,这个运算符与另一个右移位运算符(>> )不同,后者是有符号右移,它将在右侧使用符号位进行填充,这可能会导致负数的出现。

js>>

JavaScript 中,双大于号( >> )是带符号的右位移运算符。这个运算符将一个数的二进制表示向右移 动指定的位数,并用符号位(即正负号位)填充左侧空缺的位数。例如,对于二进制数101101 ,右移两 位变为001011 ,因为符号位是 0 ,所以结果是正数 11 。如果原数是负数,则填充左侧空缺位数的符号位 都是1 ,以保持负数的符号不变。 另外,双大于号(>> )也可用于将数字强制转换为 32 位有符号整数,因为 JavaScript 中的所有数字都是以双精度浮点数的形式存储的。在进行位移运算之前,双大于号(>> )会将数字强制转换为 32 位有符号整数。如果数字大于等于2 31 次方,则结果为负数,否则为正数。-8>>1 -8的二进制表示为 : 将其右移1 位,得到 :
因此,-8>>1 的结果为 -4
var i = e + (x & _ | ~x & t) + (n >>> 0) + a;
这行代码是一个简单的加法表达式,其中包含了四个变量:
\1. e :一个数值类型的变量;
\2. x _ t :三个数值类型的变量,采用了位运算;
\3. n :一个无符号数值类型的变量,通过无符号右移运算符进行位移;
\4. a :一个数值类型的变量。
整个表达式可以拆成三个操作,分别是:
let num = 16 >>> 2 ;
console . log ( num );
原码: 10000000 00000000 00000000 00001000
反码: 11111111 11111111 11111111 11110111
补码: 11111111 11111111 11111111 11111000
补码: 11111111 11111111 11111111 11111100
反码: 11111111 11111111 11111111 11111011
原码: 10000000 00000000 00000000 00000100 \1. x & _ ~x & t 的位运算结果,再相加;
\2. e 和表达式 1 的结果相加;
\3. 表达式 2 的结果和 n >>> 0 相加,再和 a 相加。
其中第 1 步中, & ~ 都是位运算符。 & 是按位与运算, ~ 是按位取反运算。这两个运算符通常用来进行位操作,比如对二进制值的某些位进行控制。 第 2 步简单的将 e 加上第 1 步的结果。第 3 步中, >>> 是无符号右移运算符,在进行右移运时,系统首先给该数值添加了一个符号位,然后将其右移,最后将符号位去掉。使用 >>> 可以让位移得到无符号的结果值,即在高位总是填充零。 总之,这行代码是一条比较复杂的加法表达式,包含了位运算、无符号位移等操作。
JavaScript | || 是不同的操作符,它们的作用也不同。
| 是按位或运算符,用于对两个数的二进制位进行或运算,结果的每一位都是对应位置两数值为 1 时结 果为 1 ,否则为 0
例如:
3 | 5 的结果为 7 ,因为 3 的二进制为 0011 5 的二进制为 0101 ,它们进行按位或运算后,
得到 0111 ,即 7
|| 是逻辑或运算符,用于进行逻辑判断。如果其中一个操作数是真值(除 false undefined null 0
NaN '' 外的值),则结果为 true ;如果都不是真值,则结果为 false
例如: true || false 的结果为 true ,因为其中一个操作数为真值;而 0 || '' 的结果为 ''
因为两个操作数都不是真值。
JavaScript | || 是不同的操作符,它们的作用也不同。
| 是按位或运算符,用于对两个数的二进制位进行或运算,结果的每一位都是对应位置两数值为 1 时结
果为 1 ,否则为 0
例如: 3 | 5 的结果为 7 ,因为 3 的二进制为 0011 5 的二进制为 0101 ,它们进行按位或运算后,
得到 0111 ,即 7
|| 是逻辑或运算符,用于进行逻辑判断。如果其中一个操作数是真值(除 false undefined null 0
NaN '' 外的值),则结果为 true ;如果都不是真值,则结果为 false
例如: true || false 的结果为 true ,因为其中一个操作数为真值;而 0 || '' 的结果为 ''
因为两个操作数都不是真值。

特殊函数调用方式

(0, a[i(_0x58e7("0x171"))])(u + f)
这里 a[i(_0x58e7("0x171"))] 是个混淆后的函数,这里实际上就是调用了这个函数,参数是 u+f
e.headers = e.headers || {},
这段代码是在 JavaScript 中常用的一种写法,它的作用是创建一个空的对象,如果 e.headers 对象已经存 在,则保留原有的对象;如果 e.headers 对象不存在,则将一个新的空对象赋值给它。
function s(n)
{
var n = new z[M1](T1 + n + C1);
return (n = z[I][P1][A1](n)) ? z[g2](n[2]) : F
}

这段代码是一个 JavaScript 函数,它接受一个参数 n ,并对参数进行加密。具体来说,它将一个字符 串"T1 + n + C1" 作为参数传递给 z 构造函数,创建一个新的 z 对象,并将其作为参数传递给 z 对象的 P1 方 法。然后将结果赋值给变量n ,并检查变量 n 是否存在。如果 n 存在,则使用 z 对象的 g2 方法将 n 数组的第 二个元素解密为一个字符串,并返回该字符串。如果n 不存在,则返回 F
s = b = 123 在JavaScript 中,这行代码的含义是将数字 123 分别赋值给变量 b s 。换句话说,变量 b s 都被赋值为 123。这种赋值方式称为链式赋值,其中多个变量可以在一行代码中同时进行赋值。
一元正号运算符 一元正号运算符是一种用于将值转换为数值类型的 JavaScript 运算符。在 JavaScript 中,一元正号运算 符使用加号 + 表示,其作用是将表达式转换为一个数值,例如:
let str = "123";
let num = +str;
console.log(num); // 输出 123

在这个例子中,将字符串 "123" 赋值给变量 str ,然后使用一元正号运算符将其转换为一个数值,并 将结果赋值给变量 num 。因为加号 + 可以将字符串解析为数值,所以变量 num 的值为 123
var e, r = +new Date() - (m || 0) - 1661224081041
这里 + 将时间转成数字可以用来计算,如果 m 存在就减 m 如果不存在就减 0
"RegExp() { [native code] }" 这段文字其实是 JavaScript 中一个函数的表示方式,表示一个正则表达式 的构造函数。在 JavaScript 中,我们可以使用正则表达式来进行字符串匹配、替换、搜索等操作。 RegExp() 函数是用来创建正则表达式对象的,它可以接受一个或两个参数,第一个参数表示正则表达 式的模式字符串,第二个参数表示正则表达式的标志。例如,下面的代码使用 RegExp() 函数创建了一 个正则表达式对象,用来匹配以 "hello" 开头的字符串:
const regex = new RegExp("^hello");
console.log(regex.test("hello world")); // true
console.log(regex.test("world hello")); // false

在这段代码中, "^hello" 是正则表达式的模式字符串,表示以 "hello" 开头; RegExp() 函数则是用来创 建正则表达式对象的构造函数,用来把模式字符串转换为正则表达式对象。最后,我们调用正则表达式 对象的 test() 方法来测试字符串是否符合该正则表达式的模式,输出结果为 true false
unescape() 在JavaScript 中,可以使用内置的函数 unescape() 来对字符串进行反转义操作。 unescape() 函数接
收一个字符串作为参数,并返回一个新的字符串,其中包含反转义后的字符。例如,下面的代码演示了 如何使用 unescape() 函数将转义后的字符串反转义为原始字符串:
let escapedStr = "Hello%2C%20world%21%20%F0%9F%98%8A";
let unescapedStr = unescape(escapedStr);
console.log(unescapedStr); // 输出: "Hello, world! 😊"

在这个例子中, escapedStr 变量包含一个转义后的字符串,使用 unescape() 函数将其反转义并存储
unescapedStr 变量中。最后,将 unescapedStr 变量的值输出到控制台中。
需要注意的是, unescape() 函数已经被弃用了,并且不推荐在生产环境中使用。在实际开发中,可以 使用decodeURI() decodeURIComponent() DOMParser() 等替代方法来进行反转义操作。
forEach(function(n) {
if (n == p)
return !B;
hasOwnProperty(n) && a['push'](t["params"][n])
})

这段代码是 JavaScript 函数的一部分,其中使用 forEach 循环来遍历一个由变量 'n' 表示的元素数组。循环 检查当前元素'n' 是否等于某个值 'p' 。如果条件为真,则返回布尔值 'B' 的相反值。
如果条件为假,则循环通过使用 'hasOwnProperty()' 方法检查对象 'a' 是否有一个名为 'n' 的属性。如果该属 性存在,则从对象't' 'params' 属性中检索相应的值,并使用 'push()' 方法将其添加到数组 'a' 中。
r.prototype.use = function(e, t) {
return this.handlers.push({
fulfilled: e,
rejected: t
}),
this.handlers.length - 1
}

这段代码是一个 JavaScript 函数的一部分,其中定义了一个名为 use 的方法。这个方法接受两个参数 e 和 t 。它将一个对象推入 handlers 数组,这个对象有两个属性值,一个是 fulfilled ,等于参数 e 的值,另一个是 rejected ,等于参数 t 的值。

node js里转base64的方法

Node.js 环境中,可以使用 Buffer 对象的 toString 方法将字符串编码为 base64 格式,也可以
使用 Buffer 对象的 from 方法将 base64 格式的字符串解码为原始数据
const str = 'hello world';
const base64Str = Buffer.from(str).toString('base64');
console.log(base64Str); // aGVsbG8gd29ybGQ=
将 base64 格式的字符串解码为原始数据
const base64Str = 'aGVsbG8gd29ybGQ=';
const originalData = Buffer.from(base64Str, 'base64').toString();
console.log(originalData); // hello worldfunction hh(n, t) {
t = t || u();
for (var e = (n = n["split"](_))["length"], r = t["length"], a =
"charCodeAt", i = 0; i < e; i++)
n[i] = o(n[i]["charCodeAt"](0) ^ t[(i + 10) % r]["charCodeAt"]
(0));
return join(_)
}

这段代码定义了一个名为 hh JavaScript 函数,接受两个参数 n t
该函数首先将参数 n 以指定字符 ` 为分隔符进行拆分,并将每个元素通过异或运算加密成新的字
符串。其中,异或运算的结果使用 o 函数处理, o` 函数可能是一个自定义加密函数。
该函数还会对参数 t 进行处理,默认值为函数 u() 的返回值,即获取系统时间的毫秒数。循环处理拆 分后的字符串数组 n ,将数组中每个元素取出第一个字符,并将其转化为 Unicode 编码值,然后与 t数组中对应位置的字符进行异或运算加密。其中,每个元素在与 t 中的元素相加时,将其下标加上一个 固定的值 10 ,并对 t 数组长度取模,以达到加密随机性的效果。 最后,将加密后的字符串数组以字符 `` 拼接为一个串,返回加密后的字符串。

获取对象中键的方法

const obj = { a: 1, b: 2 };
const objKeys = Object.keys(obj);
console.log(objKeys); // ['a', 'b']
fromCharCode() 是一个 String 对象上的方法,可以将一个 Unicode 编码的整数序列转换成对应的字符
串。该方法接受一个或多个 Unicode 编码点的整数序列作为参数,并返回对应的字符串。例如:
// 将 Unicode 编码点序列 72, 101, 108, 108, 111 转换为字符串
const str = String.fromCharCode(72, 101, 108, 108, 111);
console.log(str); // output: "Hello"
在这个例子中,fromCharCode() 方法接受了 5 个整数参数,分别是 Unicode 编码点 72 101 108
108 111,然后将它们转换成对应的字符并拼接成字符串 Hello" 并返回。
可以用 fromCharCode() 来生成某个范围内的 Unicode 编码点序列,并将它们转换成字符串,例
如:
// 将 ` `a` 到 ` `z` 的字符转换为对应的 Unicode 编码点序列,然后拼接成字符串
const unicodePoints = [];
for (let i = 97; i &lt;= 122; i++) {
unicodePoints.push(i);
}
const str = String.fromCharCode(...unicodePoints);
console.log(str); // output: "abcdefghijklmnopqrstuvwxyz"

在这个例子中, fromCharCode() 方法将循环遍历从 97 Unicode 编码点 a )到 122 Unicode
码点 z )的范围,将每个 Unicode 编码点压入数组 unicodePoints 中,并最终使用解构语法将数组
中的 Unicode 编码点作为参数传递给 fromCharCode() 方法。最终得到一个字符串
abcdefghijklmnopqrstuvwxyz" JavaScript 中, ... 操作符是展开操作符( Spread Syntax ),用来将一个可迭代对象(数组、字符 串、Set Map 等)展开为一个逗号分隔的列表。 在具体的代码 const str = String.fromCharCode(...unicodePoints) 中, unicodePoints 是一个数组,展开操作符 ... 将数组中的每个元素都取出来,作为参数传递给 String.fromCharCode() 方法。
例如:
   如果 unicodePoints 数组的值为 65, 66, 67] ,那么展开操作符会将其展开成 65, 66,
67 ,相当于调用了 String.fromCharCode(65, 66, 67) 方法,该方法将这些 Unicode 编码转换
成对应的字符串,赋值给 str 变量。 需要注意的是,当可迭代对象中含有过多的元素时,展开操作符会导致性能问题,因为会创建非常大的 列表。在这种情况下,可以考虑使用迭代器(Iterator)等其他方法来避免这个问题。

  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小董和你拼了!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值