joken-前端工程师

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

es6新语法

解构赋值和剩余参数优化

// 对象解构赋值和剩余参数
let abcvdf = {
    a: 'sdfsdf',
    b: "sdlfjslfdsf",
    c: "sdfksjlfdsd"
};

// 使用解构赋值获取对象的属性
const { a, b, c } = abcvdf;
console.log(a, b, c, "解构获取属性"); // 输出 'sdfsdf sdlfjslfdsf sdfksjlfdsd'

// 使用剩余参数收集对象的剩余属性
function abcde(...args) {
    console.log(args, "args"); // 输出收集到的对象属性
}

abcde(abcvdf); // 输出 [{ a: 'sdfsdf', b: 'sdlfjslfdsf', c: 'sdfksjlfdsd' }],收集对象为数组的第一个参数

数组方法和类型转换优化

// 数组方法和类型转换
let abcd = [2342, 2342, 435432, 42, 34, 2, 432];

let at3 = abcd.at(3); // 使用数组的 at 方法获取索引为 3 的元素
console.log(at3, "at3"); // 输出 42

// 类型转换
let numStr = "123";
let num = parseInt(numStr); // 字符串转换为整数
console.log(num, typeof num); // 输出 123 'number'

let str = num.toString(); // 数字转换为字符串
console.log(str, typeof str); // 输出 '123' 'string'

Symbol 和对象属性优化

// Symbol 和对象属性
let myOnlyKey = Symbol();

let obj2 = {
    a: "sdlfksjdff",
    [myOnlyKey]: "slkfjsldjflskjfd"
};

console.log(obj2, "obj2"); // 输出对象及其 Symbol 属性

// Symbol 作为对象的属性不可枚举
for (let i in obj2) {
    console.log(i, "obj2 的键"); // 不能遍历到 Symbol 参数的键,因为它们是不可枚举的
}

其他 JavaScript 方法优化

// 其他 JavaScript 方法优化
console.log(Object.is(objOne, objTwo), "对象比较"); // false,因为引用不同
console.log(Object.is(1, 1), "Object.is"); // true,基本数据类型比较
console.log(Object.is(NaN, NaN), "Object.is"); // true,NaN 与自身相等

console.log("T".toLowerCase()); // 't',大小写转换
console.log("t".toUpperCase()); // 'T'

数学运算和函数箭头类型声明优化

// 数学运算和函数箭头类型声明
let x = 10;
let y = 5;
console.log(x + y); // 输出 15,加法运算
console.log(x - y); // 输出 5,减法运算
console.log(x * y); // 输出 50,乘法运算
console.log(x / y); // 输出 2,除法运算

// 函数类型声明和箭头函数
let fn1: (...args: any[]) => Promise<any>;

fn1 = (...args) => {
    console.log(args, "函数参数"); // 输出函数收到的所有参数
    return Promise.resolve(String(args[0])).then((res: string) => {
        return 8888;
    }) as Promise<any>; // 返回 Promise<any> 类型的值
};

fn1(1, 11111).then((res) => {
    console.log(res, "函数返回值"); // 输出函数返回的值
});

总结

通过这些优化建议,你的代码不仅更加清晰和优雅,而且具备了更好的性能和可维护性。关注代码风格的一致性和最佳实践,合理使用 JavaScript 和 TypeScript 的功能特性,可以使你的代码在开发和维护过程中更加高效和可靠。继续保持学习和探索新的语言特性,可以让你的编程技能不断进步。

对象解构和展开运算符优化

let abcvdf = {
    a: 'sdfsdf',
    b: "sdlfjslfdsf",
    c: "sdfksjlfdsd"
};

// 使用解构运算符展开对象的属性
console.log(...Object.values(abcvdf), "解构对象属性"); // 输出 'sdfsdf sdlfjslfdsf sdfksjlfdsd'

// 使用解构运算符获取对象的子属性
const { a, b } = abcvdf;
console.log(a, b, "解构获取属性"); // 输出 'sdfsdf sdlfjslfdsf'

类型转换和数学运算

let abc3 = Symbol;

console.dir(abc3, "abc3"); // 打印 Symbol 构造函数

abc3 = 234243234; // 重新分配给 abc3 一个新的值
console.log(abc3, "abc3"); // 输出 234243234,Symbol 变量可以多次重新赋值

abc3 = 65756567;
console.log(abc3, "abc3"); // 输出 65756567

// 数字和字符串之间的转换
let numStr = "123";
let num = parseInt(numStr); // 字符串转换为整数
console.log(num, typeof num); // 输出 123 'number'

let str = num.toString(); // 数字转换为字符串
console.log(str, typeof str); // 输出 '123' 'string'

// 数字运算
let x = 10;
let y = 5;
console.log(x + y); // 输出 15,加法运算
console.log(x - y); // 输出 5,减法运算
console.log(x * y); // 输出 50,乘法运算
console.log(x / y); // 输出 2,除法运算

函数类型声明和箭头函数优化

// 函数类型声明和箭头函数
let fn1: (...args: any[]) => Promise<any>;

fn1 = (...args) => {
    console.log(args, "函数参数"); // 输出函数收到的所有参数
    return Promise.resolve(String(args[0])).then((res: string) => {
        return 8888;
    }) as Promise<any>; // 返回 Promise<any> 类型的值
};

fn1(1, 11111).then((res) => {
    console.log(res, "函数返回值"); // 输出函数返回的值
});

URL 相关操作的补充

// 使用 URLSearchParams 对象处理 URL 查询参数
var urlStr = "https://baidu.com?a=sdsfsdf&b=23432424&c=9999";
const urlParams = new URLSearchParams(urlStr);

// 获取参数 'a' 的值
console.log(urlParams.get('a')); // 输出 'sdsfsdf'

// 使用 URL 对象获取 URL 的各个部分
const urlObject = new URL(urlStr);
console.log(urlObject, "urlObject");

// 将 URL 的查询参数部分转换为 URLSearchParams 对象
const param = new URLSearchParams(urlObject.search);

// 遍历所有参数并输出
for (const [key, value] of param.entries()) {
    console.log(`${key}: ${value}`, "获取url参数");
}

总结

通过上述优化建议,你可以进一步提升代码的可读性、可维护性和性能。关注代码风格的一致性,合理使用语言特性和内置函数,可以让你的代码更加优雅和高效。同时,深入理解每个功能和方法的用途和作用域,有助于更好地利用 TypeScript 的类型安全性和 JavaScript 的灵活性。

你的代码涉及到了许多不同的 JavaScript 和 TypeScript 特性和功能。这里我会逐段分析并进行优化建议:

生成器函数优化

// 生成多个随机数,每个数都可以通过 for of 迭代器访问
function* mytest() {
    for (let i = 0; i < 5; i++) {
        yield Math.random() * 1000; // Math.random() 返回 [0, 1) 之间的随机数
    }
}

for (let i of mytest()) {
    console.log(i, "i");
}

优化建议

  • 生成随机数时,应该使用 Math.random() 而不是 Math.random(10) * 1000,因为 Math.random() 返回的是 [0, 1) 的随机数。
  • 如果想要更大的随机数范围,可以使用 Math.floor(Math.random() * 1000) 或者其他更复杂的随机数生成方法。

对象迭代器实现

// 使用 Symbol.iterator 实现对象的迭代器,可以通过 for of 遍历对象的值
Object.prototype[Symbol.iterator] = function* () {
    for (let key of Object.keys(this)) {
        yield this[key];
    }
};

let abcObj = {
    a: "sdfsdfs",
    b: "sdlfjsfdjsd"
};

for (let i of abcObj) {
    console.log(i, "迭代对象的值");
}

优化建议

  • 尽量避免直接修改 Object.prototype,这可能会导致全局范围内的影响和不可预料的行为。推荐在实际应用中使用更安全的方式扩展对象的功能。

Symbol 的使用

let myOnlyKey = Symbol();

let obj2 = {
    a: "sdlfksjdff",
    [myOnlyKey]: "slkfjsldjflskjfd"
};

console.log(obj2, "obj2");

// Symbol 作为对象的属性不可枚举
for (let i in obj2) {
    console.log(i, "obj2 的键");
}

其他功能和方法的使用优化建议

  • 使用 Array.prototype.at 可以直接获取数组中指定索引位置的元素,例如 let at3 = abcd.at(3);
  • 使用解构操作符 ... 可以方便地获取对象的子属性值,例如 console.log(...abcvdf, "abcvdf");
  • 使用 Object.is() 可以进行严格相等比较,不同于 === 的行为在处理特殊值如 NaN 时有所不同。

总体来说,你的代码已经很不错了,但需要注意一些 JavaScript 的细节和最佳实践,如避免直接修改内置对象的原型 (Object.prototype),以及确保理解和正确使用 Symbol。通过这些优化建议,可以使你的代码更加清晰、安全和易于维护。

代码测试


// 生成多少个yield 就能被for of 遍历多少次
function* mytest() {
    for (let i = 0; i < 5; i++) {
        yield Math.random(10) * 1000
    }
}

// for of 会迭代生成器里面所有的yield ,有多少个yield就会迭代多少次
for (let i of mytest()) {
    console.log(i, "i")
}


//对象的迭代器实现,实现可以for of迭代,Symbol代表隐式且唯一的属性
Object.prototype[Symbol.iterator]=function* (){
    for(let key of Object.keys(this)){
        yield this[key]
    }
}

let abcObj={
    a:"sdfsdfs",
    b:"sdlfjsfdjsd"
}

for(let i of abcObj){
    console.log(i,"迭代对象的key")
}

let abc3 = Symbol;

console.dir(abc3, "abc3");

abc3 = 234243234; // 重新分配给 abc2 一个新的值
console.log(abc3, "abc3");

abc3=65756567
console.log(abc3,"abc3") //可以打印,说明Symbol变量可以多次重新赋值

let myOnlyKey=Symbol();

let obj2={
    a:"sdlfksjdff",
    [myOnlyKey]:"slkfjsldjflskjfd"
}

console.log(obj2,"obj2")

for(var i in obj2){ //不能遍历到Symbol参数的key ,说明不可枚举
    console.log(i,"obj2-i")
}


let abcd=[2342,2342,435432,42,34,2,432]

let at3=abcd.at(3) //at 索引index位置的数据

console.log(at3,"at3")


let abcvdf={
    a:'sdfsdf',
    b:"sdlfjslfdsf",
    c:"sdfksjlfdsd"
}


console.log(...abcvdf,"abcvdf") //解构子属性
// 这里的 ...args 是函数的剩余参数。它将传递给函数的所有参数收集到一个数组中。因为你传递了一个对象 abcvdf,所以 args 数组中包含一个元素,即 abcvdf 对象。
function abcde(...args){
    console.log(args,"args")
}

abcde(abcvdf)

// 大小写转换
console.log("T".toLowerCase())
console.log("t".toUpperCase())

var urlStr="https://baidu.com?a=sdsfsdf&b=23432424&c=9999"

// let urlParams=new URLSearchParams(urlStr)
// console.log(urlParams,"url-params")

// let getAParams=urlParams.get('a')

// console.log(getAParams,"paramsa")

const params = new URLSearchParams();//实现js参数转urlcode编码,直接可以传到url去请求
params.append('param1', 'value1');
params.append('param2', 'value2');

console.log(params.get('param1')) //获取到参数了


const urlObject = new URL(urlStr);// 先转为url对象,通过对象或者属性search可以获取到参数的字符
console.log(urlObject,"urlObject")
const param = new URLSearchParams(urlObject.search); //参数的字符转URLSearchParams实例对象,再通过api获取参数属性

// 遍历所有参数
for (const [key, value] of param.entries()) {
    console.log(`${key}: ${value}`,"获取url参数");
}


var objOne={
    a:"a"
}
var objTwo={
    a:"a"
}

console.log(Object.is(objOne,objTwo),"对象比较") //比较不了引用类型,不相等

console.log(Object.is(1,1),"Object.is") //可以比较基本数据类型,相当于===

console.log(Object.is(NaN,NaN),"Object.is") //可以比较基本数据类型,相当于===





posted on 2024-06-02 18:13  joken1310  阅读(7)  评论(0编辑  收藏  举报