一元运算符
一元运算符只有一个操作数
+
// 相加运算符 (+) 用于对两个操作数进行相加运算,如果操作数为字符串则该运算符将两个操作数连接成一个字符串
// 注: '+'两侧只要有一侧是字符串,另一侧的数字则会自动转换成字符串,因为其中存在隐式转换
1 + 1 = 2 // number + number = number
1 + false = 1 // number + boolean = number
1 + 'hi' = '1hi' // number + string = string
-
// 减法运算符使两个操作数相减,结果是它们的差值
// boolean会转换为0和1,string结果为NaN
5 - 3 = 2
5.5 - 3 = 2.5
5 - true = 4
'hi' - 3 = NaN
~
// 按位非运算符(~),反转操作数的位
// 操作数被转换为32位二进制表示(0和1)
// 按位非运算时,任何数字x的运算结果都是-(x + 1)
~2 = -3
~-3 = 2
!
// !可以理解为取反
// !!常用于强制转换为boolean类型
! true // false
!false // true
!'' // true
!'hi' // false
!!'true' // true
delete
// delete 操作符用于删除对象的某个属性;如果没有指向这个属性的引用,那它最终会被释放
// **他只会返回true
const obj = {
a: 1,
b: 2
}
delete obj.a // 也可以写作delete obj[a]
console.log(obj) // 输出{b: 2}
console.log(delete obj.b) // 只会输出true
console.log(delete obj.abcd) // 虽然没什么作用,但是他仍会输出true
void
// void 运算符 对给定的表达式进行求值,然后返回 undefined。
// 适用于
// 1.立即调用的函数表达式
// 2.JavaScript URIs
// 3.在箭头函数中避免泄漏
<a href="javascript:void(0);">
这个链接点击之后不会做任何事情,如果去掉 void(),
点击之后整个页面会被替换成一个字符 0。
</a>
typeof
// 返回一个字符串,表示未经计算的操作数的类型
// typeof返回值
// 1.undefined --> 未定义的变量或值
// 2.boolean --> 布尔类型的变量或值
// 3.string --> 字符串类型的变量或值
// 4.number --> 数字类型的变量或值
// 5.object --> 对象类型的变量或值,或者null
// 6.function --> 函数类型的变量或值
typeof a // undefined
typeof true // boolean
typeof '123' // string
typeof NaN // number
typeof null // object
const obj = new String()
typeof obj // object
const fn = function() {}
typeof fn // function
自增和自减
A++ or ++A
// 自增运算符 (++) 将其操作数递增(加1)并返回一个值
// 前置自增,操作符在操作数前(++A),操作数先自增后返回
// 后置自增,操作数在操作数后(A++),操作数在自增前返回
let x = 3;
y = x++;
// y = 3
// x = 4
let x = 3;
y = ++a;
// y = 4;
// x = 4;
A-- or --A
// 同自增
算术运算符
+
同一元运算符 +
-
同一元运算符 -
*
// 乘法运算符的结果是操作数的乘积
2 * 2 // 4
-2 * 2 // -4
Infinity * 0 // NaN
Infinity * Infinity // Infinity
"foo" * 2 // NaN
/
// 除法运算符的结果是操作数的商 ,左操作数是被除数,右操作数是除数
1 / 2 // 在 JavaScript 中返回 0.5
1 / 2 // 在 Java 中返回 0
// (不需要数字是明确的浮点数)
1.0 / 2.0 // 在 JavaScript 或 Java 中都返回 0.5
2.0 / 0 // 在 JavaScript 中返回 Infinity
2.0 / 0.0 // 同样返回 Infinity
2.0 / -0.0 // 在 JavaScript 中返回 -Infinity
%
// 一个表达式的值除以另一个表达式的值,返回余数
12 % 5 // 2
-1 % 2 // -1
NaN % 2 // NaN
1 % 2 // 1
2 % 3 // 2
-4 % 2 // -0
5.5 % 2 // 1.5
关系运算符
in
// 指定的属性是否在指定的对象或其原型链中
// 如果一个属性是从原型链上继承来的,in 运算符也会返回 true
"PI" in Math // 返回true
"toString" in {}; // 返回true
let obj = {a: 1};
obj.b = undefined;
'a' in obj // true
'b' in obj // true
delete obj.a;
'a' in obj // false
let arr = ['a', 'b'];
arr[5] = undefined;
1 in arr // true
5 in arr // true
instanceof
// 用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
// 定义构造函数
function C(){}
function D(){}
var o = new C();
o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false,因为 D.prototype 不在 o 的原型链上
o instanceof Object; // true,因为 Object.prototype.isPrototypeOf(o) 返回 true
C.prototype instanceof Object // true,同上
C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
o instanceof C; // false,C.prototype 指向了一个空对象,这个空对象不在 o 的原型链上.
D.prototype = new C(); // 继承
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true 因为 C.prototype 现在在 o3 的原型链上
< or >
// < 小于运算符仅当左操作数小于右操作数时返回true
// > 大于运算符仅当左操作数大于右操作数时返回true
<= or >=
// >= 大于等于运算符当左操作数大于或等于右操作数时返回true
// <= 小于等于运算符当左操作数小于或等于右操作数时返回true