🙏废话不多说系列,直接开整🙏
1. js 的方法细节注意:
- 原生方法 replace的方法:① replace(",","#");// 将字符串中第一个匹配的字符替换掉;② replace(/,/g, "#");// 将字符串中所有匹配的字符替换掉。
function good(){
// 字符串替换:replace(/,/g, "#");// 将字符串中所有的逗号“,”替换为“#”
// 字符串替换:replace(",", "#");// 将字符串中第一个逗号替换为“#”
var a = "80,80,78,90";
console.log("初始的字符串 ==> ", a);
let arr1 = a.replace(",","#");
console.log("替换第一个匹配的字符:", arr1);
let arr2 = a.replace(/,/g, "#");
console.log("全部替换后的字符:", arr2);
let arr = a.split(" ");
console.log("切分后的字符数组:",arr);
arr = null;
console.log("将arr置为null:",arr);
}
结果展示:
2. 注意let 和 const 以及 var 变量的细分区别:
传送门:www.cnblogs.com/zhaoxiaoyin…
更简洁的区分:www.runoob.com/js/js-let-c…
问题:在全局作用域中,用 const / let 声明的变量不在 window 上,那么到底在哪里?如何去获取?
<script>
var a = 10;
function b() { }
console.log(window.a); // 10
console.log(window.b); // b(){}
let c = 20;
const cc = 30;
function ccfun() { }
console.log(window.c); // undefined (在 window 作用域中不能访问到scope域中的数据)
console.log(cc) // 30 (这些变量通常在 scope 作用域中)
console.log(window.ccfun);// ccfun(){}
</script>
3. 获取复选框中被选中的值:
<input type="checkbox" name="customerServiceTypeCheckbox" value="alarm">告警客服<br>
<input type="checkbox" name="customerServiceTypeCheckbox" value="wechat">微信客服
<button id="checkeds">显示复选框中所有所选的value值</button>
<script>
// 第一种:写法(可以获取多种的选择的值)
$("#checkeds").click(function () {
let checked_val = [];
let obj = document.getElementsByName("customerServiceTypeCheckbox");
for (k in obj){
if(obj[k].checked){
checked_val.push(obj[k].value);
}
}
alert(checked_val);
});
</script>
判断复选框是否被选中:
let flag = $("#alarm").is(':checked'); // #alarm 为复选框的ID,is()函数用来判断指定的复选框是否被选中。
4. 获取 <select> 下拉框中的选中的值:
<script>
$("#selected").click(function () {
var selectedOptionValue = $("#customerServiceType").val(); // 获取下拉框中所选中的值
var selectedOptionText = $("select option:selected").text();
var allOptionText = $('#customerServiceType').text(); // 获取下拉框中所有的选框中的text文本内容
alert(selectedOptionValue + " - " + selectedOptionText);
});
</script>
5. 时间转换:
<script>
// 格式化日期,如月、日、时、分、秒保证为2位数
function formatNumber(n) {
n = n.toString()
return n[1] ? n : '0' + n;
}
/**
* 时间戳 → 指定日期字符串
* @param number 时间戳(长整数)
* @param format 格式有两种【1:'Y-M-D h:m:s',2.'Y年M月D日 h:m:s'】如果需要指定部分元素的内容,请按照上述元素提取。
* @returns {*}
*/
function formatTime(number, format) {
let time = new Date(number)
let newArr = []
let formatArr = ['Y', 'M', 'D', 'h', 'm', 's']
newArr.push(time.getFullYear())
newArr.push(formatNumber(time.getMonth() + 1))
newArr.push(formatNumber(time.getDate()))
newArr.push(formatNumber(time.getHours()))
newArr.push(formatNumber(time.getMinutes()))
newArr.push(formatNumber(time.getSeconds()))
for (let i in newArr) {
format = format.replace(formatArr[i], newArr[i])
}
return format;
}
// 时间戳 → 默认时间格式(中国标准时间)
function convertToDateStr(number) {
return new Date(number);
}
</script>
6. chrome浏览器调试前端console.log的技巧:
① 控制台中获取 页面资源的DOM节点:
var dom1 = document.getElementById("#spanId");
console.log(dom1);
第一步:拿到DOM对象;第二步:输出DOM对象;(如果需要拿到对象中的内容,再去按照JS中的使用方法操作,再去输出)
7. 对某个DIV或者DOM元素,进行隐藏:
<!-- 去掉隐藏属性:display:""
注意:和disabled的去边,是标签属性不能有事件,则加入标签属性 disabled="disabled",
如果又需要则请使用Jquert去removeAttr("disabled")这个属性
-->
<!-- 第一种方式:位置和内容全部隐身,打开审查元素可以看到,但是后面的内部可以占用此标签的位置-->
<span style="display:none">你看不到我(我有display:none)</span>
<!-- 第二种方式:表面上隐身,实际上还占着位置;打开审查元素可以看到,但是不能够被后面的内容占用-->
<span style="visibility:hidden">你看不见我,但是我还占这一个位置</span>
<!-- 第三种:隐藏的输入框-->
<input type="hidden" name="hiddenInput" value="你看不到的输入框">
8. 得到当前的时间:
var curDateTime = new Date();
var curTimeZone = curDateTime.getTime();// 当前时间戳
9. 判断当前页面是否存在ID对象:
let objLength = $("#textDemo").length
if(objLength > 0){
return true;// 存在此ID(对象)
}
10. 弹出框换行输出:
var numStr = "123\n123";
alert(numStr + "\n good name.");
// 扩展内容:JS的转义字符
11. 对指定的标签内的元素进行移除和清空:
$("#divContainer").remove();// 移除指定元素自身
$("#divContainer").empty();// 移除指定元素内所有元素(同时也可以用来判断指定标签内是否含有元素)
12. 将数组拼接成字符串:
let arr = [1,2,3,4,5];
let arrStr = arr.join("-");
alert("数据类型:" + (typeof arrStr) + "\n数据值为:" + arrStr);
注意:还有一种写法为:arr.join("-",arr); // 这只是JS描述的规范中忽略掉了多余的参数而已。
13. JS的全匹配函数
传送门:www.w3school.com.cn/js/js_regex…
let content = "abcabcdefdefdeg";
let reg = RegExp(/abc/);
if (content.match(reg)) {
// 如果内容包含了abc,则 do Something……
}
14. 点击复选框后面的文字,也能选中当前复选框(单选框也是如此,各种标签也可以试试)
<!-- 第一种写法:(点击文字不能够选中此复选框,只能点击复选框才能选中此复选框)-->
<input type="checkbox" name="box" id="accept" value="accept">同意
<input type="checkbox" name="box" id="noAccept" value="no_accept">不同意
<!-- 推荐 第二种写法:(点击文字就能同时选中此复选框)-->
<label for="accept">
<input type="checkbox" name="box" id="accept" value="accept">同意
</label>
<label for="noAaccept">
<input type="checkbox" name="box" id="noAccept" value="no_accept">不同意
</label>
15. jQuery 的三种加载页面立即执行的写法
// 推荐:第一种写法:
$(function(){
// Do something when the Page onload.
});
// 第二种写法:(JavaScript自带的页面加载完则执行此方法)
window.onload = function(){
// Do you want to do when the Page onload.
}
// 第三种写法:
$(document).ready(function(){
// Do you want to do when the Page onload.
});
16. 得到一组复选框中被选中的value值
/**
* 得到复选框中被选中的值(基于JavaScript的写法)
* 参数:checkboxIdOfName 为一组复选框中的name值(一组中的复选框的name值一般都是属于一样的)
* 返回:复选框中以“-”拼接的value集合字符串
*/
function getCheckedOfCheckbox_JS(checkboxIdOfName) {
let arr = [], checkedStr = "";
let obj = document.getElementsByName("box");
for (i in obj) {
if (obj[i].checked) {
arr.push(obj[i].value);
}
}
// checkedStr = arr.join('-', arr);
checkedStr = arr.join('-');
return checkedStr;
}
/**
* 得到复选框中被选中的值(基于JQuery的写法)
* 参数: checkboxIdOfName 为一组复选框中的name值(一组中的复选框的name值一般都是属于一样的)
* 返回:复选框中以“#”拼接的value集合字符串
*/
function getCheckedOfCheckbox_JQuery(checkboxIdOfName) {
let arr2 = [], checkedStr2 = "";
let obj2 = $("input[name='" + checkboxIdOfName + "']");
for (k in obj2) {
if (obj2[k].checked) {
arr2.push(obj2[k].value);
}
}
checkedStr2 = arr2.join('#');// 这是返回一个字符串
return checkedStr2;
}
/**
* 得到复选框中被选中的值(基于JQuery的写法)升级版本
* 参数: checkboxIdOfName 为一组复选框中的name值(一组中的复选框的name值一般都是属于一样的)
* 返回:复选框中以“#”拼接的value集合字符串
*/
function getCheckedOfCheckbox_JQueryPlus(checkboxIdOfName) {
let arr = [];
$("input[name='" + checkboxIdOfName + "']:checked").each(function(){
arr.push($(this).val());
});
return arr.join('#');
}
17. JavaScript对象非空判断
function isEmpty(obj) {
return (typeof obj == "undefined" || obj == null || obj == "") ? true : false;
}
18. 时分秒→时间戳形式
function countDown(time) {
let s = 0, hour = time.split(':')[0], min = time.split(':')[1], sec = time.split(':')[2];
s = Number(hour * 3600) + Number(min * 60) + Number(sec);
return s;
}
19. 时间戳→指定日期字符串
/**
* 时间戳 → 指定日期字符串
* @param number 时间戳(长整数)
* @param format 格式有两种【1:'Y-M-D h:m:s',2.'Y年M月D日 h:m:s'】如果需要指定部分元素的内容,请按照上述元素提取。
* @returns {*}
*/
function formatTime(number, format) {
let time = new Date(number), newArr = [], formatArr = ['Y', 'M', 'D', 'h', 'm', 's'];
newArr.push(time.getFullYear());
newArr.push(formatNumber(time.getMonth() + 1));
newArr.push(formatNumber(time.getDate()));
newArr.push(formatNumber(time.getHours()));
newArr.push(formatNumber(time.getMinutes()));
newArr.push(formatNumber(time.getSeconds()));
for (let i in newArr) {
format = format.replace(formatArr[i], newArr[i])
}
return format;
}
20. 生成随机的ID
// 生成长度为10的随机字母数字字符串
function showRandomId(){
const randomId = Math.random().toString(36).substring(2);
// alert("生成随机数ID:" + randomId);
// console.log(randomId);
}
21. 得到随机16进制颜色代码
function getRandomColor(){
const randomColorCode = '#'+Math.floor(Math.random()*0xffffff).toString(16).padEnd(6, '0');
alert("随机16进制颜色代码:" + randomColorCode);
console.log(randomColorCode)
}
22. 优雅地取整
var a = ~~2.33 // 2
var b = 2.33 | 0 // 2
var c = 2.33 >> 0 // 2
parseInt(num); // num 的整数部分
23. 优雅的金钱格式化
/**
* 格式化金钱格式化
* 输入:1234567
* 输出:1,234,567
* @param {string} moneyStr 数字字符串
* @return 格式化的金钱字符串
*/
function formatMoney1(moneyStr){
return moneyStr.split('').reverse().reduce((prev, next, index) => {
return ((index % 3) ? next : (next + ',')) + prev
})
}
24. 五种方法实现值交换
// 1.传统,但需要借助临时变量
var temp = a; a = b; b = temp;
// 2.要求是两个整数
a ^= b; b ^= a; a ^= b;
// 3.借助数组
b = [a, a= b][0];
// 4.ES6,解构赋值
[a, b] = [b, a];
// 5.运用计算规则(要求是数字)
a = a + b;
b = a - b;
a = a - b;
25. 实现深拷贝
var b = JSON.parse(JSON.stringify(a));
26. 递归求阶乘
function factorial(n) {
return (n > 1) ? n * f(n-1) : n;
}
27. 对浏览器控制台进行CSS样式调整
console.info("%c哈哈", "color:red; font-size:30px; font-family:华文楷体");
截图:
28. 数组拷贝(14个小技巧)
(关于如何拷贝和克隆数组的方法)
// 1.使用 Array.slice() 方法
const numbers = [1,2,3,4];
const copy = numbers.slice();
copy.push(5) // 添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); // 输出:[1,2,3,4]
// 2.使用 Array.map() 方法
const numbers = [1,2,3,4]
const copy = numbers.map(num => num)
copy.push(5) // 添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); // 输出:[1,2,3,4]
// 3.使用 Array.from() 方法
const numbers = [1,2,3,4];
const copy = Array.from(new Set(numbers));
copy.push(5); // 添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers);// 输出:[1,2,3,4]
// 4.使用展开操作符
const numbers = [1,2,3,4]
const copy = [...numbers];
copy.push(5); //添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); //输出:[1,2,3,4]
// 5.使用 Array.of 方法和展开操作符
const numbers = [1,2,3,4]
const copy = Array.of(...numbers);
copy.push(5); //添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); //输出:[1,2,3,4]
// 注意: 这里区别:Array.of 和 Array 的区别!
Array.of(7); // 结果是:[7] 这里只有一个元素的数组,此元素为7
Array.of(1,2,3); // 结果是: [1,2,3]
Array(7); // 是创建一个数组长度为7的undifined元素的数组
Array(1,2,3);// [1,2,3]
// 6. 使用 Array 构造函数 和 展开操作符
const numbers = [1,2,3,4]
const copy = new Array(...numbers);
copy.push(5); //添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); //输出:[1,2,3,4]
// 7. 使用解构
const numbers = [1,2,3,4]
const [...copy] = numbers;
copy.push(5); //添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); //输出:[1,2,3,4]
// 8. 使用 Array.concat 方法
const numbers = [1,2,3,4]
const copy = numbers.concat();
copy.push(5); //添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); //输出:[1,2,3,4]
// 9. 使用 Array.push 方法和展开符
const numbers = [1,2,3,4];
let copy = [];
copy.push(...numbers);
copy.push(5); //添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); //输出:[1,2,3,4]
// 10. 使用 Array.unshift() 方法和展开操作符
const numbers = [1,2,3,4];
let copy = [];
copy.unshift(...numbers);
copy.push(5); //添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); //输出:[1,2,3,4]
// 11. 使用 Array.forEach() 方法和展开符
const numbers = [1,2,3,4];
let copy = [];
numbers.forEach((value) => copy.push(value));
copy.push(5); //添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); //输出:[1,2,3,4]
// 12. 使用 for 循环
const numbers = [1,2,3,4];
let copy = [];
for(let i=0; i<numbers.length; i++) {
copy.push(numbers[i]);
}
copy.push(5); //添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); //输出:[1,2,3,4]
// 13. 使用 Array.reduce 方法
const numbers = [1,2,3,4];
const copy = numbers.reduce((acc, x) => {acc.push(x);return acc;}, []);
copy.push(5); //添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); //输出:[1,2,3,4]
// 14. 使用古老的 apply 方法
const numbers = [1,2,3,4]
let copy = [];
Array.prototype.push.apply(copy, numbers);
copy.push(5); //添加新项以证明不会修改原始数组
console.log(copy); // 输出:[1,2,3,4,5]
console.log(numbers); //输出:[1,2,3,4]
// 最后值得注意的是: 上面的方法是浅拷贝,如果是复杂的数据数组拷贝需要进行深拷贝;
// 15.深拷贝
var b = JSON.parse(JSON.string(a));
// 示例如下:
const studentObj = { name: 'Drew', age: 24 };
const copy = JSON.parse(JSON.stringify(studentObj));
copy.age = 20; // 修改age,以证明是深拷贝,验证不会修改原始数组
console.log(copy); // 输出:{name: "Drew", age: 20}
console.log(studentObj); // 输出:{name: "Drew", age: 24}
29. JS 异步加载 和 同步加载
异步加载:(非阻塞模式加载),浏览器在下载JS的同时,同时还会执行后续的页面处理。在 script 标签内,用 JS 创建一个 script 元素并插入到 document 中,这种就是异步加载 JS 文件
// 异步模式
(function(){
var s = document.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'http://localhost/dome.js'
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
})();
-
同步加载:阻塞模式,会阻止浏览器的后续处理。停止了后续的文件的解析,执行,如图像的渲染。浏览器之所以回采取同步模式,就是因为加载 JS 文件中有对 dom 操作,重定向,输出 document 等默认行为,所以同步才是最安全的。 通常,需要把加载的 JS 放在 body 结束标签之前,使得 JS 可在页面最后加载,尽量减少阻塞页面的渲染。这样可以先让页面显示出来。
-
同步加载时瀑布模型,异步加载流程是并发模型。
<!-- 同步模式 -->
<script src="/ABTestPage/js/plugins/otherUtils/demo.js"></script>
30. 角度 弧度 切换
var rad = degrees * (Math.PI/180);
var degrees = rad*(180/Math.PI);
// ==================================== 函数示例如下:======================================
/**
* 角度 → 弧度
* @param {number} degrees
*/
function degreesToRad(degrees) {
var rad = degrees * (Math.PI / 180);
return rad;
}
/**
* 弧度 → 角度
* @param {number} rad
*/
function radToDegrees(rad) {
var degrees = rad * (180 / Math.PI);
return degrees;
}
31. 数组排序
// 1.直接使用 Array.sort() 函数:只能升序, 使用范围为数字(正负)、字符
const arr = [10,2,3,-12], arrStr = ['b', 'a', 'd', 'c'];
console.log(arr.sort());// 输出:[-12, 10, 2, 3]
console.log(arrStr.sort()); // 输出:["a", "b", "c", "d"]
// 2.内部比较器 (可以实现,升序/降序)
function compareAsc(a,b){ return a - b; }
function compareDesc(a,b){ return b - a; }
function testCompareXXX(){
var nums = [32, 42, 10, -10, 0.3];
console.log(nums.sort(compareAsc));// 输出:[-10, 0.3, 10, 32, 42]
console.log(nums.sort(compareDesc));// 输出:[42, 32, 10, 0.3, -10]
}
// 注意: 数组中的元素存在 数字 和 字符
function testAttention(){
// 被非纯数字的字符截断再进行整数排序;纯数字的字符视为数字加入排序。
var nums = [32, 42, 10, 'sfs', '0.12', -10, 3, -101, '0asx0'];
console.log(nums.sort(compare));// 输出:[10, 32, 42, "sfs", -101, -10, "0.12", 3, "0asx0"]
console.log(nums.sort(compareDesc));// 输出:[42, 32, 10, "sfs", 3, "0.12", -10, -101, "0asx0"]
}
32. JavaScript数组常见技巧
-
删除数组的重复项
var fruits = ['apple','orange','grape','banana','apple','grape'] // 第一种方法: var uniqFruits = Array.from(new Set(fruits)); console.log(uniqFruits); // 第二种方法: var uniq_fruits = [...new Set(fruits)]; console.log(uniq_fruits); -
替换数组中的特定值
var userNames = ['小智0', '小智1', '小智2', '小智3', '小智4'] userNames.splice(0, 2, '小智替换位置0', '小智替换位置1') console.log(userNames) -
Array.from 达到 .map 的效果
var friends = [ { name: '小智', age: 22 }, { name: '小明', age: 25 }, { name: '小强', age: 21 }, { name: '小亮', age: 23 } ] var friendsName = Array.from(friends, ({ name }) => name) console.log(friendsName);// ["小智", "小明", "小强", "小亮"] -
置空数组
var arr = [1, 2, 3, 4] arr.length = 0; // 第一种方法 console.log(arr); var arr2 = [1,2,3,4,5] arr2 = []; // 第二种方法 console.log(arr2); -
将数组转换为对象
var friendsName = ['Drew', 'Bob', 'Mary'] var friendsNameObj = {...friendsName} console.log(friendsNameObj); // {0: "Drew", 1: "Bob", 2: "Mary"} -
填充数组
var newFilledArray = new Array(10).fill('good'); console.log(newFilledArray);// (10) ["good", "good", "good", "good", "good", "good", "good", "good", "good", "good"] -
数组合并
var one = [1,1,1], two = [2,2,2], three = [3,3,3] var merged = [...one, ...two, ...three] console.log(merged) // (9) [1, 1, 1, 2, 2, 2, 3, 3, 3] -
数组交集
var numOne = [1,2,3,4,5], numTwo = [3,5,6,7] var repeat = [...new Set(numOne)].filter(item => numTwo.includes(item)); console.log(repeat) // (2) [3, 5] -
从数组中删除虚值(虚值:false, 0, '', null, NaN, undefined)
var mixedArr = [9, false, 'good', NaN, undefined, '', 0, null]; var trueArr = mixedArr.filter(Boolean) console.log(trueArr); // (2) [9, "good"] -
从数组中获取随机值
var names = ['good', 'bad', 'small', 'max', 'min'] var randomName = names[(Math.floor(Math.random() * (names.length)))] console.log(randomName) // 随机从指定的数组中提取一个值 -
反转数组
var number = [1,2,3,4,5] var reversedNumber = number.reverse(); console.log(reversedNumber); // (5) [5, 4, 3, 2, 1] -
对数组中的所有值求和
var number = [1,4,6,7] var sum = number.reduce((x, y) => x + y); console.log(sum); // 18 -
是浏览器当前显示的页面可以直接编辑的JS代码:
document.body.contentEditable=true演示如下:(只不过这时临时的,如果在刷新F5刷新当前页面,人不会改变的。😄)
33. arguments 对象转数组
arguents 对象是函数内可访问的类数组对象,包含了传给函数的参数值。但他跟数组又不太一样,虽然可以访问值和获取长度,却无法使用数组的其他方法。所幸的是,我们可以很方便的转成普通的数组:
var argArrary = Array.prototype.slice.call(arguments);
34. 数组求和
最容易让人想到的是用循环,但其实有更快捷的方法:
var numbers = [3, 5, 7, 2];
var sum = numbers.reduce((x,y) => x+y);
console.log(sum); // 17
35. 短路条件
充分利用JavaScript的逻辑运算符(短路与和短路或)
if(hungry){
goToFridge();
}
// 可以替换为:
hungry && goToFridge(); // 如果hungry为true,那么则不执行 goToFridge();
36. 用逻辑设置变量默认值
function setDefault(args){
args = args || 32;
}
37. 逗号操作符
let x = 1;
x = (x++, x);
console.log(x); // 2
x = (2, 3);
console.log(x); // 3
38. 用 length 重新设置数组大小
var arr = [1,2,3,4,5];
console.log(arr.length); // 5
arr.length = 3;
console.log(arr.length); // 3
console.log(arr); // [1,2,3]
arr.length = 0;
console.log(arr.length); // 0
console.log(arr); // []
39. 巧用数组解构赋值交换两个变量的值
let a = 1, b = 2;
[a, b] = [b, a]
console.log(a); // 2
console.log(b); // 1
40. 数组元素随机顺序(洗牌算法)
var list = [1,2,3,4,5,6,7,8,9,10];
console.log(list.sort(function(){
return Math.random() - 0.5;
})); // [4,8,9,2,1,3,6,7,5,10]
41. 对象动态属性名
// 这是 ES6 新增的用法,可以通过变量的形式指定属性名
const dynamic = 'color';
var item = {
brand: 'Ford',
[dynamic]: 'Blue'
}
console.log(item); // {brand: "Ford", color: "Blue"}
42. 数组去重
面试常考题目,如果不考虑自己实现,可以通过 Set 方便的完成数组去重
const my_array = [1,2,33,4,5,6,2,3,1,2,1,]
const unique_array = [...new Set(my_array)]
console.log(unique_array); // [1,2,33,4,5,6,3]
🙏至此,非常感谢阅读🙏