null==a
和a==null
的区别本质上null==a
和a==null
的执行效率是一样的,只是编码风格上有所区别:
null==a
可以有效避免手误将判断双等号写成赋值等号,从而出现执行意外;
+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 0
与 undefined
在一些开源项目中,经常可以看见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.trunc
和Math.floor
功能类似,其中~x
简单计算等价于-(x+1)
console.log(23.9 | 0); // Result: 23
console.log(-23.9 | 0); // Result: -23
**
console.log(2 ** 3); // Result: 8
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
class ValidatorClass {
get [Symbol.toStringTag]() {
return 'Validator'
}
}
Object.prototype.toString.call(new ValidatorClass)
//expected out : '[object Validator]'
void function(){
// code here
}()
//等价于
(function(){
// code here
})()