JS运算符

577 阅读3分钟

运算符优先级表看这里

运算符优先级看这里

总结

  • 少用自增运算符 a++ ++a 理解起来费劲 推荐a+=1
  • 少让不同类型加起来
  • 永远不要用模糊相等==
  • a=a||10 漏洞挺大的

算术运算符

Number相关运算

  • 自增运算符 a++ ++a
  • 指数运算符 2**3 ===> 8
  • 求值运算符 +x
var a=-8;
console.log(+a); //-8

String相关运算

  • 连接运算符 +

比较运算符

  • == 模糊相等符
  • === 全等
// 对于全等而言,判断逻辑就两点:
// 1.如果是简单类型的话,先比较类型,如果同类型的话再比较值,有一个不相等就不等
// 2.如果是对象类型的话,比较地址
// 3.特例 NaN === NaN // false
[] === [] // 不等,地址不同
{} === {} // 不等,地址不同

布尔运算符

短路&&防止对象不存在

console&&console.log&&console.log(123) // 以防console不存在

短路||设定保底值

a=a||10 // 保底值10,但是这个漏洞挺大的
// 如果不这么写
function add(a){
	if(!a){a=10}
    else{a=a}
	return a
}
// 如果传了五个falsy值任意一个都能让a为false  null undefined '' 0 NaN
var a=0; 
a=a||10; // 10 这不就乱套了吗 这句话原意是a没赋值的时候就给10
// 可问题是a我就给了0 它算作false,给了10

//下面这种新的写法少许好一些
// 只会把五个falsy值中的undefined理解为false
// '' 0 NaN null 都会理解为赋值过的
function add(a=10){
	return a
}
add(0)
add('')
add(NaN)

二进制运算符

或 与 否 异或 左移 右移

点运算符点只能用于对象上

为什么非对象.toString()也可以成立呢?

  • 非对象类型有bool number string这几个最常用的
  • 这几种类型.api() 时JS 会分别为它们创建对应的Boolean类型对象 Number类型对象 String类型对象
  • 以供非对象类型在.api()能用上
// 以下过程是逻辑上的模拟,不能真的去这么执行
var a=1;
a.toString(); // a不是对象 
// JS会在当你正需要调用a.toString()的时候非常快速且临时地把a指向一个对象
// 相当于var a=new Number(1) 
// 但这一步是JS帮你做的,而且是快速临时地,但你自己如果主动去这么做就是错误的,a就真的一直写死成对象了
// 创建完对象后执行你要的a.toString();
// 调用完毕然后a=null; 把这个对象彻底清理掉

逗号运算符

  • 总是return逗号最后的内容
  • 但是也会执行逗号之前所有的内容
var a=(1,2); // 2
var arrow=x=>(console.log('执行这一句并返回逗号后面的'),x+1)

JS吊诡的运算符相关Case

  • 这是JS与别的语言不同的地方,是JS的糟粕
  • 这些难以理解的东西在别的语言中是不允许这么写的,因为根本不符合逻辑,是书写者自己的错误
console.log(1+'2') // '12'
console.log(2-'1') // 1
console.log('2'-1) // 1