猫史档案馆


[氵][一期]那些你不知道的高级js用法

用户:伴只狗头伴只狗头查看:13 回复:16 评论:13 创建时间:2023-05-14T13:25:20


经过了深思熟虑,我做出了一个违背祖宗的决定(bushi

这篇帖子全是干货 一定要看完 

诸如箭头函数、模板字符串、解构赋值、this指针、异步、class、protype这些相对基础 伴雪就不会多加叙述了

 

1.空值合并运算符

const foo = null ?? "default value";
console.log(foo); // 输出 "default value"

a ??b 当a为空值时(如 null undefined)时 返回b 不为空值时返喵身

2.可选链操作符

const someObj = {
  foo: {
    bar: "Hello, world!"
  }
};

const baz = someObj?.foo?.bar?.toUpperCase();
console.log(baz); // 输出 "HELLO, WORLD!"

?. 它可以用于访问嵌套对象或数组的属性或方法,如果链上的任何一个属性或方法不存在,它会返回 undefined

3.扩展操作符

①数组和对象

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const arr3 = [...arr1, ...arr2]; // [1, 2, 3, 4, 5, 6]

②函数参数填值 有点像python的def (*v):

function sum(...nums) {
  return nums.reduce((acc, num) => acc + num, 0);
}

console.log(sum(1, 2, 3, 4, 5)); // 15

 

③函数调用

function foo(x, y, z) {
  console.log(x, y, z);
}

const arr = [1, 2, 3];
foo(...arr); // 1 2 3

4.Map 和 Set

Map 可以用于存储一组键值对,而 Set 可以用于存储一组唯一值

const m = new Map();
m.set('a', 1);
m.set('b', 2);

console.log(m.get('a')); // 1

const t = new Set([1, 2, 3, 2, 3, 4]);
console.log(t); // {1, 2, 3, 4}

5.Proxy

拦截并改变 JavaScript 操作对象的默认行为 可以保护对象

const person = {
  id: '吉吉',
  age: 45
};

const protectedPerson = new Proxy(person, {
  // 定义 get 操作的喵
  get(target, prop) {
    console.log(`"${prop}"`);
    return target[prop];
  },
  // 定义 set 操作的喵
  set(target, prop, value) {
    if (prop === 'age' && value < 18) {
      throw new Error('age is too low');
    }
    console.log(`"${prop}"="${value}"`);
    target[prop] = value;
    return true;
  }
});

console.log(protectedPerson.id); // 输出: "id"  吉吉
protectedPerson.age = 15; // 抛出异常: "age is too low"

6.Symbol

每个 Symbol 都是独一无二的

const mySymbol = Symbol('my symbol');
const obj = {};

obj[mySymbol] = 'some value';

console.log(obj[mySymbol]); // 'some value'

7.with

with 关键字可以将一个对象作为作用域,然后在代码块中可以直接访问该对象的属性

const myObject = {
  foo: '吉吉'
};

with (myObject) {
  console.log(foo); // '吉吉'
}

8.yield和*function

function* a() {
  yield 1;
  yield 2;
  yield 3;
}

const m = a();
console.log(m.next()); // { value: 1, done: false }
console.log(m.next()); // { value: 2, done: false }
console.log(m.next()); // { value: 3, done: false }
console.log(m.next()); // { value: undefined, done: true }

9.Promise.all()和Promise.race()

接受一个包含多个 Promise 实例的数组,返回一个新的 Promise 实例

const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 1000, 'foo');
});
const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2000, 'bar');
});

Promise.all([promise1, promise2]).then(values => {
  console.log(values); // ['foo', 'bar']
});

10.Reflect

用于像反射一样操作 JavaScript 对象

const myObject = { foo: 'bar' };

Reflect.defineProperty(myObject, 'baz', {
  value: 'qux'
});

console.log(myObject.baz); // 'qux'

11.Proxy revocable()

用于管控代理行为,它创建并返回一个 Proxy 对象,同时提供一个 revoke() 函数

const m = { foo: 'bar' };
const { proxy, revoke } = Proxy.revocable(m, {});

console.log(proxy.foo); // 'bar'
revoke();
console.log(proxy.foo); // 报错TypeError: Cannot perform 'get' on a proxy that has been revoked

12.Function

替代eval

const code = 'console.log("Hello, World!");';
const exec = new Function(code);
exec(); // 输出: Hello, World!

13.apply() 和 call() 

用于改变函数中 this 关键词

//不想写例子了自己去搜

14.bind() 

用来永久性地指定一个函数的 this 值

//不想写例子了自己去搜

15.instanceof

测试一个对象是否是某个构造函数的实例

class Animal {}
class Dog extends Animal {}
const fido = new Dog();
console.log(fido instanceof Dog); // true
console.log(fido instanceof Animal); // true

16.位运算符

按位与(&)、按位或(|)、按位异或(^)

const num1 = 10; // 二进制: 1010
const num2 = 3;  // 二进制: 0011

console.log(num1 & num2); // 2   (二进制: 0010)
console.log(num1 | num2); // 11  (二进制: 1011)
console.log(num1 ^ num2); // 9   (二进制: 1001)

17.管道操作符

const result = [1, 2, 3]
  |> map(x => x * 2)
  |> map(x => x + 100);

console.log(result); // 输出: [102, 104, 106]

|> 将多个函数以管道方式组合起来

18.双否定运算符

~~3.14 //返回3
~~"42" //返回42

就写这么多了 多了也没人看emotion_doge(绝对不是想不到了)

 

 


回复

上一页1 页 / 共 1下一页
私塾­­私塾­­

沙发

点赞1


评论


私塾­­私塾­­

“多了也没人看”
人贵在有自知之明

点赞9


评论


yee剑走天下yee剑走天下

不明觉厉()nb

点赞1


评论


145a145a

我看不懂,但是我大受震撼

点赞2


评论


全能代码师全能代码师

收藏夹吃灰*2

点赞2


评论


SCS_user_LoeheodVOQSCS_user_LoeheodVOQ

收藏()

注:??和.?在boxJs中无法使用

点赞0


评论


AokenAoken

收藏

点赞0


评论


𝙲ℴ𝗌𝔦𝒹ₑ𝑟𝙲ℴ𝗌𝔦𝒹ₑ𝑟

var idea = 0 ?? 1

点赞0


评论


小宏XeLa小宏XeLa

在函数定义中,使用 arguments 来获取 全部传参参数。

function xxx(){
    return arguments;
};

xxx(1,2,"3"); // 返回 伪数组 [1,2,"3"]

伪数组可以使用 [].slice.call 函数 来转换为真数组

function xxx(){
    return [].slice.call(arguments);
};

xxx(1,2,"3"); // 返回 真数组 [1,2,"3"]
function xxx(){
    return [].slice.call(arguments).join(" ");
};

xxx(1,2,"3"); // 返回 "1 2 3"

 

点赞0


评论


小宏XeLa小宏XeLa

1e7

返回 1000000,代码含义为 返回 在 1 后面 添加 7 个 0 的 数字。

10**7

返回 1000000,代码含义为 返回 10的7次方,相当于 Math.pow(10, 7)

点赞0


评论


小宏XeLa小宏XeLa

JS 中的 小彩蛋

0.1+0.2≠0.3

0.1 + 0.2; // 0.30000000000000004
0.1 + 0.2 === 0.3; // false

999999999999999999 的结果是 喵00000000 

999999999999999999; // 喵00000000
console.log(999999999999999999); // 控制台输出:喵00000000
999999999999999999 === 999999999999999999; // true
999999999999999999 === 喵00000000; // true

点赞0


评论


小宏XeLa小宏XeLa

true && (()=>{
    console.log(6)
})()

该代码相当于

if (true) {
    console.log(6)
}

 

false || (() => {
    console.log(6)
})()

该代码相当于

if (!false) {
    console.log(6)
}

点赞0


评论


伴只狗头伴只狗头

挖坟( )

点赞0


评论


AokenAoken

喵d

点赞0


评论


AokenAoken

center_image

点赞0


评论


土豆awa土豆awa

收藏

 

点赞0


评论