JavaScript小技巧

·  阅读 54

JavaScript小技巧

现代 JavaScript 教程:zh.javascript.info

JavaScript小技巧:

声明多个变量

// 常规写法
let a;
let b = 1;
let c = true;

// 简写
let a, b = 1, c = true;
复制代码

给多个变量赋值

// 常规写法
let a, b, c;
a = "a";
b = 1;
c = true;

// 简写
let [a, b, c] = ["a", 1, true];
复制代码

交换变量的值

let str1 = "aaa";
let str2 = "bbb";

[str1, str2] = [str2, str1]
console.log(str1) // "bbb"
console.log(str2) // "aaa"
复制代码

数字和字符串相互转换

const num = 99;
// 数字转字符串
console.log(num + '') // "99"

const str = '99';
// 字符串转数字
console.log(+str) // 99  
复制代码

可选链操作符 ?.

  • 可选链操作符 ( ?. ) 允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空 (nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined
const user = {
  info: {
    name: "廊坊吴彦祖"
  }
};

console.log(user.info?.name) // "廊坊吴彦祖"
console.log(user.data?.name) // undefined
console.log(user.data.name) // TypeError: Cannot read properties of undefined (reading 'name')
复制代码

空值合并操作符 ??

  • 空值合并操作符(??)是一个逻辑操作符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数
console.log(null ?? "廊坊吴彦祖") // "廊坊吴彦祖"
console.log(undefined ?? "廊坊吴彦祖") // "廊坊吴彦祖"
console.log("廊坊吴彦祖" ?? "??") // "廊坊吴彦祖"
console.log(0 ?? 9) // 0
复制代码

使用&&代替if判断为真

// if判断
if(true) {
  console.log("true") // "true"
}

// 使用&&代替if判断
true && console.log("true") // "true"
复制代码

获取数组最后一位

const array  = [2, 1, 3, 5, 3, 6, 11];

// 通过.length获取数组最后一位
console.log(array[array.length - 1]) // 11

// 通过.at获取数组最后一位
console.log(array.at(-1)) // 11
复制代码

打乱数组

const array  = [2, 1, 3, 5, 3, 6, 11];

// 通过sort方法和Math.random()打乱数组
array.sort(() => {
    return Math.random() - 0.5;
});
console.log(array) // [6, 2, 5, 1, 3, 3, 11]
复制代码

获取对象的键和值数组

let obj = {a: 1, b: 2, c: 3}

// 通过Object.keys()获取obj对象键数组
console.log(Object.keys(obj)) // ["a", "b", "c"]
            
// 通过Object.values()获取obj对象值数组
console.log(Object.values(obj)) // [1, 2, 3]
复制代码

Object.freeze() 冻结对象

  • Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象
let obj = {a: 1, b: 2}

// 将obj对象进行冻结
Object.freeze(obj)

// 无法给obj对象添加属性
obj.c = 3
console.log(obj) // {a: 1, b: 2}

// 无法删除obj对象某一个属性
delete obj.a
console.log(obj) // {a: 1, b: 2}
复制代码

禁止输入框键入键盘某个键

<input type="text" placeholder="" onKeydown="keydown"/>
复制代码
// 通过onKeydown事件判断
keydown(e) {
  // 不能输入'-'
  if (e.key === '-') {
    e.returnValue = false;
  }
},
复制代码

区分IE和非IE浏览器

if (!+[1]) {
  // IE浏览器
} else {
  // 非IE浏览器
}
复制代码

滚动到页面顶部

window.scrollTo(0, 0)
复制代码

获取时间的毫秒数

// +new Date()相当于new Date().getTime()
console.log(+new Date("2022-07-12")) // 1657584000000
console.log(new Date("2022-07-12").getTime()) // 1657584000000
复制代码

获取两个日期之间的天数

const getDay = (startDate, endDate) => Math.ceil(Math.abs(startDate.getTime() - endDate.getTime()) / 86400000)
    
const day = getDay(new Date("2022-7-12"), new Date("2021-7-12"))
console.log(day) // 365
复制代码

利用reduce求数组总和、最小值和最大值

const array  = [2, 1, 3, 5, 3, 6, 11];

// 求总和
const total = array.reduce((a, b) => a+b);
console.log(total) // 31

// 求最小值(等同于Math.min())
const min = array.reduce((a, b) => a<b ? a : b);
console.log(min) // 1
console.log(Math.min(...array)) // 1

// 求最大值(等同于Math.max())
const max = array.reduce((a, b) => a>b ? a : b);
console.log(max) // 11
console.log(Math.max(...array)) // 11
复制代码

数组去重

const array  = [1, 4, 4, 6, 8, 9, 11, 9, 'a', 'a'];

// 通过filter和indexOf方法
const ary1 = array.filter((item, index, arr) => arr.indexOf(item) === index);
console.log(ary1) // [1, 4, 6, 8, 9, 11, "a"]

// 通过Set
const ary2 = [...new Set(array)];
console.log(ary2) // [1, 4, 6, 8, 9, 11, "a"]
复制代码

获取两个数组的交集

const ary1 = [1, 4, 6, 7, 9];
const ary2 = [ 8, 6, 11, 9];

// 通过filter和indexOf方法
const getIntersection = (ary1, ary2) => ary1.filter(item => ary2.indexOf(item) > -1);
console.log(getIntersection(ary1, ary2)) // [6, 9]
复制代码

获取两个数组的并集

const ary1 = [1, 4, 6, 7, 9];
const ary2 = [ 8, 6, 11, 9];

// 通过concat和includes方法
const getUnion = (ary1, ary2) => ary1.concat(ary2.filter(item => !ary1.includes(item)))
console.log(getUnion(ary1, ary2)) // [1, 4, 6, 7, 9, 8, 11]
复制代码

es6扩展运算符合并数组和对象

const ary1 = [1, 4, 4, 6];
const ary2 = [ 8, 9, 11, 9];

// 合并数组
const ary = [...ary1, ...ary2];
console.log(ary) // [1, 4, 4, 6, 8, 9, 11, 9]

const obj1 = {a: 1, b: 2};
const obj2 = {a: 3, c: 4};

// 合并对象
const obj = {...obj1, ...obj2};
console.log(obj) // {a: 3, b: 2, c: 4}
复制代码

金额显示增加千位符

const getThousandsNum = num => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");

const money = getThousandsNum(100000000);
console.log(money) // "100,000,000"
复制代码

五星好评效果

const getStartScore = rate => "★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate);

console.log(getStartScore(3)) // "★★★☆☆"
console.log(getStartScore(5)) // "★★★★★"
复制代码

通过length清空和截取数组

const array  = [2, 1, 3, 5, 3, 6, 11];

// 通过设置length来截取指定长度数组
array.length = 3;
console.log(array) // [2, 1, 3]

// 通过设置length为0来清空数组
array.length = 0;
console.log(array) // []
复制代码

字符串首字母大写

const getUpperCaseStr = str => str.charAt(0).toUpperCase() + str.slice(1);

const upperCaseStr = getUpperCaseStr("beijing");
console.log(upperCaseStr) // "Beijing"
复制代码

翻转字符串

const getReverseStr = str => str.split('').reverse().join('');

const reverseStr = getReverseStr("beijing");
console.log(reverseStr) // "gnijieb"
复制代码

去除字符串中的空格

// 去除首尾的空格
const getTrimStr = str => str.replace(/(^\s*)|(\s*$)/g, "");
console.log(getTrimStr(" bei jing ")) // "bei jing"// 去除全部空格
const getTrimAllStr = str => str.replace(/\s+/g,"");
console.log(getTrimAllStr(" bei jing ")) // "beijing"
复制代码

获取随机字符串

const str = Math.random().toString(36).substring(2);

console.log(str) // "fropwvrg7ke"
复制代码

获取随机16进制颜色

const color = "#" + Math.floor(Math.random() * 0xffffff).toString(16).padEnd(6, "0");

console.log(color) // "#71e3fd"
复制代码

rgb颜色转16进制颜色

const getRgbToHex = (r, g, b) => "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);

console.log(getRgbToHex(255, 255 ,255)) // "#ffffff"
复制代码

判断数据类型

  • 默认情况下,toString() 方法被每个 Object 对象继承,如果此方法在自定义对象中未被覆盖, toString() 方法会返回一个 “[object xxxx]” 的字符串(xxxx 为数据具体类型)。可以通过 toString() 来获取每个对象的类型,为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 call() 或者 apply() 的形式来调用,传递要检查的对象作为第一个参数,即 Object.prototype.toString.call()(或者 Object.prototype.toString.apply())
const getTypeOf = val => Object.prototype.toString.call(val).slice(8, -1).toLowerCase();

console.log(getTypeOf(1)) // "number"
console.log(getTypeOf("廊坊吴彦祖")) // "string"
console.log(getTypeOf(true)) // "boolean"
console.log(getTypeOf(undefined)) // "undefined"
console.log(getTypeOf(function() {})) // "function"
console.log(getTypeOf(null)) // "null"
console.log(getTypeOf([1,2,3])) // "array"
console.log(getTypeOf({a: 'b'})) // "object"
复制代码

for循环简写

  • for...of 语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句
  • for...in 语句以任意顺序迭代一个对象的除 Symbol 以外的可枚举属性,包括继承的可枚举属性
const array  = [2, 1, 3, 5, 3, 6, 11];

// for循环
for (let i = 0; i < array.length; i++) {
  console.log(array[i]) // 2 1 3 5 3 6 11
}

// for...of获取数组每一项
for (let item of array) {
  console.log(item) // 2 1 3 5 3 6 11
}

// for...in获取数组索引
for (let index in array) {
  console.log(index) // "0" "1" "2" "3" "4" "5" "6"
}
复制代码
分类:
前端
收藏成功!
已添加到「」, 点击更改