一元操作符(++、--、+、-、!、~、typeof、void、delete)
二元操作符(+、-、*、/、%、==、!=、<、>等)
三元操作符(? :)
一元操作符
递增递减操作符(++、--)
前置递增/递减
let a = 5;
let b = ++a; // a先递增,然后返回新值
console.log(a); // 6
console.log(b); // 6
let c = 5;
let d = --c; // c先递减,然后返回新值
console.log(c); // 4
console.log(d); // 4
后置递增/递减
let a = 5;
let b = a++; // 先返回原值,然后a递增
console.log(a); // 6
console.log(b); // 5
let c = 5;
let d = c--; // 先返回原值,然后c递减
console.log(c); // 4
console.log(d); // 5
特殊情况与类型转换
// 对非数值类型的影响
let str = "5";
console.log(++str); // 6 (字符串转为数字)
let bool = true;
console.log(++bool); // 2 (true转为1,然后递增)
let obj = { valueOf: () => 3 };
console.log(++obj); // 4 (调用valueOf方法)
// 对象没有valueOf时调用toString
let obj2 = { toString: () => "7" };
console.log(++obj2); // 8
// 都没有时
let obj3 = {};
console.log(++obj3); // NaN(obj.valueOf()为自身{};obj.toString()为'[object Object]',都无法转为数字)
// 数组的特殊情况
let arr = [];
console.log(++arr); // 1 ([]转为0,然后递增)
let arr2 = [5];
console.log(++arr2); // 6 ([5]转为5,然后递增)
let arr3 = [1,2];
console.log(++arr3); // NaN ([1,2]转为"1,2",无法转为数字)
一元加减操作符(+、-)
一元加操作符(+)
// 数值转换
console.log(+5); // 5
console.log(+"5"); // 5
console.log(+true); // 1
console.log(+false); // 0
console.log(+null); // 0
console.log(+undefined); // NaN
// 复杂类型转换
console.log(+[]); // 0
console.log(+[5]); // 5
console.log(+[1,2]); // NaN
console.log(+{}); // NaN
// 日期转换
let date = new Date();
console.log(+date); // 时间戳数值
ECMA262
Note:The unary + operator converts its operand to Number type.
13.5.4.1 Runtime Semantics: Evaluation UnaryExpression : + UnaryExpression
-
- Let expr be ? Evaluation of UnaryExpression.
-
- Return ? ToNumber(? GetValue(expr)).
7.1.4 ToNumber ( argument )
The abstract operation ToNumber takes argument argument (an ECMAScript language value) and returns either a normal completion containing a Number or a throw completion. It converts argument to a value of type Number. It performs the following steps when called:
- If argument is a Number, return argument.
- If argument is either a Symbol or a BigInt, throw a TypeError exception.
- If argument is undefined, return NaN.
- If argument is either null or false, return +0𝔽.
- If argument is true, return 1𝔽.
- If argument is a String, return StringToNumber(argument).
- Assert: argument is an Object.
- Let primValue be ? ToPrimitive(argument, number).
- Assert: primValue is not an Object.
- Return ? ToNumber(primValue).
一元减操作符(-)
// 负数转换
console.log(-5); // -5
console.log(-"5"); // -5
console.log(-true); // -1
console.log(-[]); // -0
console.log(-[5]); // -5
console.log(-{}); // NaN
// 特殊值
console.log(-Infinity); // -Infinity
console.log(-(-5)); // 5 (双重否定)
逻辑非操作符(!)
// Falsy 值 (转为 true)
console.log(!false); // true
console.log(!0); // true
console.log(!""); // true
console.log(!null); // true
console.log(!undefined); // true
console.log(!NaN); // true
// Truthy 值 (转为 false)
console.log(!true); // false
console.log(!1); // false
console.log(!"hello"); // false
console.log(!{}); // false
console.log(![]); // false
// 双重否定转换为布尔值
console.log(!!"hello"); // true
console.log(!!0); // false
console.log(!![]); // true