数组扩展

  1. 拆分多维数组flat

    let arr = [1,2,[3,4,[5,6]]]
    console.log(arr.flat(2))
    // [1, 2, 3, 4, 5, 6]
  2. 数组元素修改fill

     /*
     fill(value)
     fill(value, start)
     fill(value, start, end)
     */
    let arr = [1, 2, 3, 4, 5]
    console.log(arr.fill(10, 2))
    // [1, 2, 10, 10, 10]
  3. 只改变数组其中一个元素with

    let arr = [1, 2, 3, 4, 5]
    console.log(arr.with(1, 100))
    // [1, 100, 3, 4, 5]

对象扩展

1. 判断一个对象是否存在特定属性

let obj = {
    name: 'xiaoming',
    age: 18
}

// hasOwnProperty
console.log(obj.hasOwnProperty('name'))

// in
console.log('name' in obj)

// Reflect.has()
console.log(Reflect.has(obj, 'name'))

2. Object.assign() 拼接

let obj1 = {
    name: 'John',
    age: 30,
    city: 'New York'
}
let obj2 = {
    age: 25,
    country: 'USA'
}
let obj3 = Object.assign(obj1, obj2)
console.log(obj3)
// {name: 'John', age: 25, city: 'New York', country: 'USA'}

很多人可能会想到这种方式可不可以用来复制一个对象,我告诉你结果:不完全可以,为什么这样说,大家看如下代码:

let obj4 = {
    nameValue: 'xiaoming',
    age: 18,
    get name() {
        console.log('get name')
    },
    set name(value) {
        console.log('set name')
    }
}
let obj5 = {}
let obj6 = Object.assign(obj5, obj4)
console.log(obj6)
// {nameValue: 'xiaoming', age: 18, name: undefined}

当这个对象中有get 或者 set 时就不行了

3. getOwnPropertyDescriptors()返回给定对象的所有自有属性描述符

let obj4 = {
    nameValue: 'xiaoming',
    age: 18,
    get name() {
        console.log('get name')
    },
    set name(value) {
        console.log('set name')
    }
}
let obj7 = Object.getOwnPropertyDescriptors(obj4)
obj7.name.get()
// get name

4. Object.keys()

​ 返回一个由给定对象自身的可枚举的字符串键属性名组成的数组。

let obj1 = {
     name: 'John',
     age: 30,
     city: 'New York'
}
console.log(Object.keys(obj1))
// ['name', 'age', 'city']

5. Object.values()

​ 返回一个由所有自身属性值的数组,包括不可枚举属性值。

console.log(Object.values(obj1))
// ['John', 30, 'New York']

6. Object.entries()

​ 返回一个数组,包含给定对象自有的可枚举字符串键属性的键值对。

console.log(Object.entries(obj1))
/*
[
    ['name', 'John']
    ['age', 30]
    ['city', 'New York']    
]
*/

7. Object.create

​ 以一个现有对象作为原型,创建一个新对象。

 let obj1 = {
     nameValue: 'John',
     age: 30,
     city: {
         name: 'New York',
         population: 800000
     },
     get name() {
         console.log('get name')
         return this.nameValue
     },
     set name(value) {
         console.log('set name')
     }
 }
 
  let obj3 = Object.create(
      Object.getPrototypeOf(obj1),
      Object.getOwnPropertyDescriptors(obj1),
  );

console.log(obj3)
// {nameValue: 'John', age: 30, city: {…}}
console.log(obj3.name)
// get name
// John

获取css中的变量

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>简单的背景选择</title>
    <style>
        :root{
            --color: #000;
        }
        body{
            height: 96vh;
            background-color: var(--color);
        }
    </style>
</head>
<body>
    <input type="color" id="color">
    <script>
        // 获取css中变量的值
        const rootColor = getComputedStyle(document.documentElement).getPropertyValue('--color');
        
        let colorSelector = document.querySelector('#color');
        colorSelector.addEventListener('change', (e) => {
            // 通过改变css变量,改变页面背景色
            document.documentElement.style.setProperty('--color', e.target.value);
        });
    </script>
</body>
</html>

class新增

  1. 在属性面前在一个#,就是私有属性

    class Person {
        static a = 1;
        // 定义私有属性
        #privateName = 'tiechui'
        constructor(name, age) {
            this.name = name;
            this.age = age;
            this.privateName = this.#privateName
        }
        // 定义一个方法
        sayHello() {
            console.log(`Hello, my name is ${this.name}`);
        }
    }
  2. 静态代码块,当这个类被定义后,代码块会自动执行

    class test{
        static n = 1
        static {
            console.log('静态代码块', this.n)
        }
    }
    // 静态代码块 1

异步迭代

function ajax(str, time) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(str);
        }, time);
    });
}
// 迭代器
async function* foo() {
    yield ajax('a',1000);
    yield ajax('b',1000);
    yield ajax('c',1000);
}

let str = '';
let Foo = foo();
Foo.next().then(res=>{
    console.log(res);
})
// {value: 'a', done: false}
async function generate() {
    for await (var val of foo()) {
        str = str + val;
        console.log(val);
    }
    console.log(str);
}

generate();
// a
// b
// c
// abc

正则扩展

let str = '今天是2023-12-23'
let reg = /(?<year>\d{4})-(?<mounth>\d{1,2})-(?<day>\d{2})/
let reg1 = /(?<year>\d{4})-(?<mounth>\d{1,2})-(?<day>\d{2})/d
console.log(reg.exec(str))
// ['2023-12-23', '2023', '12', '23', index: 3, input: '今天是2023-12-23', groups: {…}]


console.log(reg1.exec(str))
// ['2023-12-23', '2023', '12', '23', index: 3, input: '今天是2023-12-23', groups: {…}, indices: Array(4)]

字符串扩展

  1. includes函数可以判断字符串中是否含有指定字符串

    let str = "helloworld"
    console.log(str.includes("h"))
    // true
  2. startsWith和endsWith方法可以判断字符串是否以指定字符串开头或结尾

    let str = "hello"
    console.log(str.startsWith("h"))
    // true
    console.log(str.startsWith("h", 1))
    // false
    console.log(str.endsWith("o"))
    // true
  3. 字符串的repeat方法可以重复字符串

    let str = "hello"
    console.log(str.repeat(3))
    // hellohellohello
    
    console.log(str.repeat(0)==='')
    // true
  4. 字符串的padStart和padEnd方法可以对字符串进行填充

    let str = "hello"
    console.log(str.padStart(10, "world"))
    // worldhello
    
    console.log(str.padEnd(10, "world"))
    // helloworld

at方法(寻找数组内的元素)

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

console.log(arr.at(1))
// 2

console.log(arr.at(-1))
// 10