JS复制Object对象的几种方式以及性能对比

在 JavaScript 中,有多种方式可以复制一个对象。每种方法都有它们自己的优缺点,所以你应该根据你的应用程序的需要来选择适当的方法。 以下是几种复制 JavaScript 对象的方法,以及它们的性能对比: Object.assign() 使用 Object.assign() 方法:这是最简单的方法,可以使用它来浅复制一个对象。它将对象的所有可枚举属性复制到一个新的对象中。 const original = { a: "诚哥博客", b: "诚哥" }; const copy = Object.assign({}, original); console.log(Object.is(original, copy)); 优点:简单易用,可以很容易地浅复制一个对象。 缺点:它只能浅复制对象,如果对象中有嵌套的对象或数组,则它们的指针仍然是指向原始对象的。 JSON.parse() 和 JSON.stringify() 使用 JSON.parse() 和 JSON.stringify() 方法 这种方法可以深复制一个对象。它将对象转换为 JSON 字符串,然后再将其转换回对象。 const original = { a: "诚哥博客", b: "诚哥" }; const copy = JSON.parse(JSON.stringify(original)); console.log(Object.is(original, copy)); 优点:可以深复制对象,包括嵌套的对象和数组。 缺点:无法复制函数和原型链,并且性能较差。 使用自定义函数 可以自定义复制的方式。你可以使用递归的方式来遍历对象的所有属性,并根据需要进行复制。 例如,下面是一个简单的复制函数: function deepCopy(obj) { if (obj === null || typeof obj !== "object") { return obj; } let copy; if (obj instanceof Array) { copy = []; for (let i = 0; i < obj.length; i++) { copy[i] = deepCopy(obj[i]); } } else { copy = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { copy[key] = deepCopy(obj[key]); } } } return copy; } const original = { a: "诚哥博客", b: "诚哥", c: { d: "博客" } }; const copy = deepCopy(original); console.log(Object.is(original, copy)); ...

2023年1月5日 · 1 分钟 · 诚哥博客

前端web一些兼容性的写法优化

在项目浏览器兼容测试中,发现有很多兼容性的问题,大多数是用户较少的浏览器,如 2345 浏览器和 32 位的 360 极速兼容性较差,所以总不能人少就不去修复吧,当然 IE 是个例外(人多我也不去修)。(以下我自己记录,可能还有其他优秀写法欢迎指教) ?? 号 虽然这个号在现在用的比较多,但是兼容性还是不行,所以还是老实用回 || 但是得注意他们之间的区别 String 中的 replaceAll 在字符串中有两函数,其中 replaceAll 是在 ES12+后加入的,所有有些浏览器并不支持,所以改为 replace 的正则写法兼容性是最好的如 const str = "Rakers Rakers"; str.replaceAll("Rakers", "Rakers1024"); //Rakers1024 Rakers1024 str.replace(/Rakers/g, "Rakers1024"); //Rakers1024 Rakers1024 //使用正则的replace正则的形式结果是一致的 数组取值 在平常我们遇到可能为空的数组,又想用简单的式子读出来数组内容,又不想他报错,特别是写在前端页面的式子,报错就导致页面都加载不出来了 const arr = Math.random() > 0.5 ? [] : [1]; //一般写法 console.log(arr[0]); //在不知道是否返回空数组的情况下很容易报错 console.log(arr && arr.length > 0 ? arr[0] : undefined); //一般都这么写,但是会导致式子很长,特别是如果数组不是变量,而是很长的对象内函数值就更长了 console.log(arr?.at(0)); //这种应该是最短的了,而且不会报错 但是需要支持ES6语法

2022年5月23日 · 1 分钟 · 诚哥博客

Vite2、js、vue2别名设置

今天给旧项目升级时,碰到 Vite2+js+vue2 的项目结构,但是 VSCode 打开后别名路径一直识别不了,打开 WebStorm 也一样识别不了,看来之前升级 vite2 时肯定是没配好,网上查了查,基本都试了一遍,每一个能真正识别出来的,于是自己倒腾出来了。 配置 vite.config.js 这个很简单,官方例子很多 resolve: { alias: [ { find: '@', replacement: path.resolve(__dirname, './src') } ] } 网上的列子 jsconfig.json 先来看看网上例子,都是这样的,但是在我这个项目上是怎样都不生效。 { "compilerOptions": { "baseUrl": "./", "paths": { "@/*": ["src/*"] } }, "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"] } 我例子的 jsconfig.json { "compilerOptions": { "baseUrl": ".", "paths": { "@/*": ["src/*"] }, "target": "es2020", "module": "commonjs", "allowSyntheticDefaultImports": true }, "include": ["src/**/*"], "exclude": ["node_modules", "dist"] } 成功识别!

2022年3月17日 · 1 分钟 · 诚哥博客

Centos安装Nodejs简单方式

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。本文主要讲的是如何在 Linux 即 Centos 上安装 Nodejs 的简单方式,有比设置环境变量更加简单的方式,那就是设置软链接,软连接到已经设置环境变量的路径即可,如 /usr/bin 1. 官网 下载编译好的包 官网下载: 下载 | Node.js 中文网 (nodejs.cn) cd /usr/local wget https://npmmirror.com/mirrors/node/v16.18.1/node-v16.18.1-linux-x64.tar.xz 2.解压重命名到 nodejs tar -xvf node-v16.18.1-linux-x64.tar.xz mv node-v16.18.1-linux-x64 nodejs rm -rf node-v16.18.1-linux-x64.tar.xz 3.安装一些全局包并创建软链接 因为我们是解压到了指定目录,但是无法全局执行,可以设置环境变量,但是那样就需要改 /etc/profile 文件,其实只需要加软连接到已经环境变量的路径即可 ln -s /usr/local/nodejs/bin/node /usr/bin ln -s /usr/local/nodejs/bin/npm /usr/bin ln -s /usr/local/nodejs/bin/npx /usr/bin npm install -g pnpm ln -s /usr/local/nodejs/bin/pnpm /usr/bin ln -s /usr/local/nodejs/bin/pnpx /usr/bin npm install -g yarn ln -s /usr/local/nodejs/bin/yarn /usr/bin ln -s /usr/local/nodejs/bin/yarnpkg /usr/bin 运行测试 node -v npm -v

2021年12月17日 · 1 分钟 · 诚哥博客