操作符(持续完善中ing)

67 阅读2分钟
一元操作符(++、--、+、-、!、~、typeofvoiddelete)
二元操作符(+、-、*、/、%、==、!=、<、>等)
三元操作符(? :)

一元操作符

递增递减操作符(++、--)

前置递增/递减

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

13.5.4 Unary + Operator

Note:The unary + operator converts its operand to Number type.

13.5.4.1 Runtime Semantics: Evaluation UnaryExpression : + UnaryExpression

    1. Let expr be ? Evaluation of UnaryExpression.
    1. 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:

  1. If argument is a Number, return argument.
  2. If argument is either a Symbol or a BigInt, throw a TypeError exception.
  3. If argument is undefined, return NaN.
  4. If argument is either null or false, return +0𝔽.
  5. If argument is true, return 1𝔽.
  6. If argument is a String, return StringToNumber(argument).
  7. Assert: argument is an Object.
  8. Let primValue be ? ToPrimitive(argument, number).
  9. Assert: primValue is not an Object.
  10. 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