fe ? not exsit ?

走进基础:关于一些运算符的了解

虽然博客面向的人可能也就1-2个哈哈,纯属记录学习抒情,不喜欢就喷呀。鲁迅说过:菜不在乎之。刚到新东家的时候在代码中经常遇到~、>>符号,经常以猜测逃避的态度去对待,是时候突击一学习一波了。

What’s this guy called?

首先要明确知道上述的这些东西叫做ECMAScript运算符,你一定想起了算术运算符逻辑运算符。是的先来楼列一下运算符的种类

  • 一元运算符 ( delete、void、前增减量/后增减量运算符、一元加减法)
  • 位运算符 ( ~、 & 、| 、^ 、<< 、>> 、>>>)
  • 逻辑运算符 ( && || !)
  • 乘性运算符 ( * / )
  • 加性运算符 ( + - )
  • 关系运算符 ( > < )
  • 等性运算符 ( == != === !==)
  • 条件运算符 ( 三目 )
  • 赋值运算符 ( = )
  • 逗号运算符 ( , )

How to understand it

目前菜鸡状态就只给大家介绍前两种运算符,可能只是本人不太了解吧所以稍稍熟悉一下免得被人说没见识。😯😯😯

一元运算符

  1. delete

用于删除对象的属性及成员方法,成功返回true,否则返回false, 如果删除的不存在仍然会返回true

1
2
3
4
5
var obj = {
name: 'litchi'
}
delete obj.name; // true
delete obj.sex; // true

不能删除不可配置属性(像Math, Array, Object内置对象的属性)

1
2
3
4
var obj = {};
Object.defineProperty(obj, 'name', {configurable: false});
delete obj.name; //false
delete Math.PI //false

只能删除固有属性,不能删除原型链

1
2
3
4
5
function Person() { this.name='litchi'; }
Person.prototype.name = 'dad';
var person = new Person();
delete person.name;
console.log(person.name) //dad

可删除数组元素,删除元素值位undefined

1
2
3
var a = [1,2,3];
delete a[0];
console.log(a); //[undefined,2,3]
  1. void

对于javascript uris 用户点击链接,会eval uri中的代码,除非返回undefined。而void运算符返回undefined,可以用来避免浏览器的默认行为

1
<a href="javascript:void(window.open('about:blank'))">Click me</a>

可以使v8引擎识别自执行函数为函数表达式

1
void function iife() {}();
  1. 前增后增运算符略
  2. 一元加减法

本质上对数字无影响,对于字符串,可以将一部分类似parseInt转化成数字。一元加法能将Ox开头的字符串转化成十进制。(剑法则不能)。另外+ new Date() 则是转化number格式,调用date原型上的valueof从而返回时间戳。

1
2
3
4
5
6
7
8
var a = '200';
console.log(+a) // 200 number
a = '0xa';
console.log(+a) // 10
a = '-20';
console.log(+a) // -20
a = new Date();
console.log(a) //1527599050292

位运算符

ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数)。在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢?
有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数。数值范围从 -2147483648 到 2147483647。另外需要注意的是所有整数字面量都默认存储为有符号整数。只有 ECMAScript 的位运算符才能创建无符号整数。

上述是w3c的原话,这就抛出了我的一个问题

  1. 就是有符号整数的范围是 -2^31 - 2^31-1 即 -2147483648 到 2147483647。。
  2. 字面量的值默认是有符号整数存储

so, 那么如何理解Math.pow(2,32)或者大于2147483647这些值。。。这些值就不是有符号整数了吗?。。。我该如何理解呢

javascript number是双精度64位二进制,位运算一般用于32位二进制。看到的网上的泛泛资料可能是翻译有出入可能是当时电脑内存的局限等等(猜测)。字面量的值默认是有符号整数存储这句话就有点不适用了。。

  1. ~ Not

计算值的顺序为: 把运算数转化为32位二进制 => 求反码 => 二进制求浮点数

1
2
3
var iNum1 = 25;   //25 等于 00000000000000000000000000011001
var iNum2 = ~iNum1; //转换为 11111111111111111111111111100110
alert(iNum2); //输出 "-26"
  1. & And

计算值的顺序为: 把运算数转化为32位二进制 => 取数字对齐的数位取并 => 二进制求浮点数

1
2
3
4
 25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
AND = 0000 0000 0000 0000 0000 0000 0000 0001
  1. | Or

计算值的顺序为: 把运算数转化为32位二进制 => 取数字对齐的数位取或 => 二进制求浮点数

1
2
3
4
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
--------------------------------------------
OR = 0000 0000 0000 0000 0000 0000 0001 1011
  1. ^ Xor

计算值的顺序为: 把运算数转化为32位二进制 => 取数字对齐的数位取异或(0和1才为true) => 二进制求浮点数

1
2
3
4
 25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010
  1. ‘<<’ 左移

它把数字中的所有数位向左移动指定的数量

1
2
3
var a = 2;   // 10
var b = 2<<5; // 1000000
console.log(b); // 64
  1. ‘>>’ 有符号右移。

它把数字中的所有数位向右移动指定的数量,保留该数的正负。

1
2
3
var a = 2;   // 10
var b = 2>>5; // 0000000
console.log(b); // 0
  1. ‘>>>’ 无符号右移。

它把数字中的所有数位向右移动指定的数量,保留该数的正负。

1
2
3
4
// 正数一致,负数一般得到一个大数
var a = -2;
var b = -2>>>5;
console.log(b); //134217727

运用

  1. ~~ 常用语取整 通过两次Not运算得到一个number值
1
2
var a = '111';
~~a // 111.
  1. ‘>>>’ 这可不是远远远大于符号哟,
1
'1' >>> 0  == 1  //true