一些js简写技巧

null==aa==null的区别

本质上null==aa==null的执行效率是一样的,只是编码风格上有所区别:

null==a可以有效避免手误将判断双等号写成赋值等号,从而出现执行意外;

js中+a

+a相当于类型转换Number(a)

const str = '123'
const strToNum = +str
// strToNum = 123

在这里,有一个日常写法需要注意,通常我们在写+运算时,是可以忽略+号左右的空格的,例如

var c = a   +   b
// 等价于 
var c = a+b

但在某些连写的时候,空格就显得尤为重要,忽略空格可能发生严重错误

var a = 'a'
+a++a	// Uncaught SyntaxError: Unexpected identifier

此时会报语法错误,将其改写下

var a = 'a'
+a+ +a	// NaN
//相当于
(+a)+(+a)
//NaN + NaN = NaN

void 0undefined

在一些开源项目中,经常可以看见if (a==void 0) 的判断,比如vue框架里就有很多这样的判断

var createEmptyVNode = function (text) {
    if ( text === void 0 ) text = '';

    var node = new VNode();
    node.text = text;
    node.isComment = true;
    return node
  };

为什么要这样写而不是直接判断undefined呢?

undefined不是js保留字,直接使用不安全,void 0返回值是undefined

function test() {
  var undefined = "a";
  alert(undefined); // a
}
// 注意此处必须是函数内部局部变量,不能是全局变量
test()

属性连续判断

参考vue源码中的某些写法

var i;
var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;
//相当于判断
a.data && a.data.attrs && a.data.attrs.type

~~ 取整数位

const int = ~~"15.123"
console.log(int); // Result: 15
console.log(typeof int); Result: "number"

Math.truncMath.floor功能类似,其中~x简单计算等价于-(x+1)

快速浮点数转整数

console.log(23.9 | 0);  // Result: 23
console.log(-23.9 | 0); // Result: -23

幂运算**

console.log(2 ** 3); // Result: 8

格式化JSON

console.log(JSON.stringify({ alpha: 'A', beta: 'B' }, null, '\t'));
// Result:
// '{
//     "alpha": A,
//     "beta": B
// }'

Date.parse(new Date)!==Date.now()

console.log(Date.parse(new Date()),Date.now())
// expected out : 1600916270000 1600916270109

为什么二者不相等?
Date.parse(s: string){} 根据函数声明可知,该函数接收string类型参数,传入new Date会进行隐式数据类型转换,调用toString方法,toString后丢失了毫秒信息,故而转换后的时间戳后三位毫秒为0

重写 Object.prototype.toString.call() 的返回值

class ValidatorClass {
    get [Symbol.toStringTag]() {
        return 'Validator'
    }
}
Object.prototype.toString.call(new ValidatorClass)
//expected out : '[object Validator]'

使用void书写立即执行函数

void function(){
  // code here
}()

//等价于
(function(){
  // code here
})()

你可能感兴趣的:(javascript,开发语言,ecmascript)