- 判断奇偶
一般实现:num%2===0
为偶数
if(num & 1) {
// num是奇数
} else {
// num是偶数
}
- 优雅向下取整
一般实现:Math.floor(num)
(NaN和Infinity返回为本身)
let res = num | 0 // 按或运算
(NaN和Infinity返回为0)
let res = ~~num // 取反操作
(NaN和Infinity返回为0)
3. 整数的转换使用+
一般实现:parseInt和parseFloat转换成number类型的整数型和浮点型
const str = '321'
console.log(typeof +str) // number
- 两个非运算
!!
有时候用来将某个值转化为布尔类型
其中!
标识布尔非运算
let res1 = !!null // false
let res2 = !!'123' // true
- 短路取值
||
遇真则真&&
遇假则假
** 说明: **- 运算从左到右计算,分别当第一个为真值/假值,计算就会停止
&&
比||
优先级要高a && b || c && d
和(a && b) || (c && d)
- 巧用可减少不必要的
if
console.log(true || false) // true
console.log(false || true) // true
console.log(true || true) // true
console.log(false || false) // false
console.log(false && true) // false
console.log(true && false) // false
console.log(true && true) // true
console.log(false && false) // false
console.log(null || 2 || undefined) // 2
- 三目运算
- 减少if使用
let res = status ? 'a' : 'b'
- 可链式运算符
?.
- ES2020提案,可以访问对象内部属性的方式,尤其是深层嵌套的属性。
// 静态属性
const obj = {
a: 1,
b: true
}
let res = obj.b ? obj.b : null
let res1 = obj?.b
// 动态属性
let expression = 'a'
let res2 = obj?.[expression]
// 方法
let parent = {
name: 'parent',
getName: function() {
console.log(this.name)
}
};
parent.getName?.() // parent
parent.getTitle?.() //不会执行
- 与无效合并一起使用,方法处理未定义或为空值和表达提供默认值,可使用
??
表示默认值
console.log(undefined ?? 'hello') // hello
console.log(true ?? 'hello') // true
- JSON.stringify序列化
JSON.stringify(value[, replacer [, space]])
- 将要序列化成 一个 JSON 字符串的值
- 如果是函数,则在序列化过程中处理每个属性;如果是数组,则包含在数组中的属性名才会被序列化;如果为null或者未提供,则所有属性都会被序列化。
- 指定缩进用的空白字符串,如果是数字,则代表有多少空格,上限为10;如果小于1,则代表没有空格;如果为字符串,则取字母,上限10;如果为null或者未提供,则没空格。
** 使用 ** - 可用于深度拷贝,JSON.stringify和 JSON.parse 来拷贝一个完全一样的对象,而对原对象没有任何影响。
- 如果一个对象有 toJSON 属性,当它被序列化的时候,不会对该对象进行序列化,而是将它的toJSON 方法的返回值进行序列化
var obj = {
foo: 'foo',
toJSON: function () {
return 'bar';
}
};
JSON.stringify(obj); // '"bar"'
JSON.stringify({x: obj}); // '{"x":"bar"}'
- 整数变量交换
- 一般会通过一个临时变量做辅助
let temp = x
x = y
y = temp
- 异或运算
x = x ^ y
y = x ^ y
x = x ^ y
[a,b] = [b,a]
x = x + y
y = x - y
x = x - y