JavaScript运算

1. 算术运算符

+

-

*

/

%

算术优先级 * / % 优先级要高于 + - 无论是 + - * / % 都是左结合性(从左至右计算)

var num1 = 10;
var num2 = 20;
var res1 = num1 + num2;
console.log(res1); // 30
var res2 = num1 - num2;
console.log(res2); // -10
var res3 = num1 * num2;
console.log(res3); // 200
var res4 = num2 / num1;
console.log(res4); // 2
var res5 = num2 % num1;
console.log(res5); // 0
1.1 加法运算的注意点
  • 任何非数值类型的数据在参与加法运算之前,都会被转成数值类型,再参与运算

    var num1 = 1;
    // 先把true转换成数值类型,转成1
    var num2 = true;
    // 计算 1 + 1  
    var res1 = num1 + num2
    console.log(res1); // 2 
    
    // null 转换成数值类型0
    var res2 = 1 + null;
    console.log(res2); // 1 
    
  • 任何数据和NaN进行运算,结果都是NaN

    // undefined 转换成数值类型 NaN
    var res3 = 1 + undefined;
    console.log(res3); // NaN
    
    // 字符串转换成数值类型 NaN
    var res4 = 1 + Number("abc");
    console.log(res4); // NaN
    
  • 任何数据和字符串类型相加,都会被先转换成字符串之后再运算

    // 加法运算只要有字符串类型都是字符串的拼接
    var res5 = 1 + "abc";
    console.log(res5); // 1abc
    
1.2 减法运算注意点
  • 任何非数值类型的数据在参与减法运算之前,都会被自动转换成数值类型之后再参与运算

    var res1 = 1 - true;
    console.log(res1); // 0
    
    var res2 = 1 - null;
    console.log(res2); //1
    
  • 任何数据和NaN进行运算,结果都是NaN

    var res3 = 1 - undefined;
    console.log(res3); // NaN
    
    var res5 = 1 - 'abc';
    console.log(res5); // NaN
    
  • 任何数据和字符串相减,都会把字符串转换成数值类型之后再运算

    var res4 = 1 - '12';
    console.log(res4); // -11
    
1.3 乘法注意点
  • 和减法运算的注意点一模一样
var res1 = 1 * true;
console.log(res1); // 1

var res2 = 1 * null;
console.log(res2); // 0

var res3 = 1 * undefined;
console.log(res3); // NaN

var res4 = 1 * '12';
console.log(res4); // 12

var res5 = 1 * 'abc';
console.log(res5); // NaN
1.4 取模(取余)运算注意点

格式: m % n = 余数

  • 如果m>n的, 那么就正常取余

    var res1 = 10 % 3;
    console.log(res1); // 1
    
  • 如果m<n的, 那么结果就是m

    var res2 = 3 % 4;
    console.log(res2); // 3
    
  • 如果n是0, 那么结果就是NaN

    var res3 = 10 % 0;
    console.log(res3); // NaN
    
  • 取余运算结果的正负性, 取决于m而不是n

    var res4 = 10 % -2;
    console.log(res4); // 0
    
    var res5 = -10 % 2;
    console.log(res5); // -0
    
    var res6 = -10 % -2;
    console.log(res6); // -0
    

2. 赋值运算符

赋值运算符就是将等号右边的值存储到等号左边的变量中

2.1 赋值运算符

=+=加等于、-=减等于、*=乘等于、/=除等于、%=模等于

// = 
// 把5赋值给res这个变量
var res = 5;

// 加等于
var number = 3;
// 会将等号左边存储的值取出来和右边进行指定的运算, 运算完毕之后再将运算的结果存储到左边
// number += 2 相当于 number = number + 2 那么就是 number = 3 + 2
// -=、*=、/=、%=、也是一样的步骤
number += 2;
console.log(number); // 5
2.2 赋值运算的优先级和结合性
  • 赋值运算优先级低于算术运算

    // 由于算术运算符的优先级高于赋值运算符,所以先计算1+1然后把结果赋值给res1这个变量
    var res1 = 1 + 1
    console.log(res1); // 2
    
  • 赋值运算符的结合性是右结合性(从右至左的计算)

// 由于赋值运算符的结合性是右结合性,所以将会把5赋值给num2然后再将num2中的值赋给num1
var num1, num2;
num1 = num2 = 5;
console.log(num1); // 5
console.log(num2); // 5
  • 赋值运算符的左边只能放变量,不能放常量

3. 自增自减运算符

3.1 自增运算符 ++

可以快速的对一个变量中保存的数据进行+1的操作

var num1 = 2;
//num1 = num1 + 1
// num1 += 1; ===>  num1 = num1 + 1;
// num++; ===> num1 = num1 + 1;
++num1
console.log(num1); // 3
3.2 自减运算符 --

可以快速的对一个变量中保存的数据进行-1的操作

let num2 = 2;
// num2 = num2 - 1;
// num2 -= 1; ===> num2 = num2 - 1
// num2--; ===> num2 = num2 - 1
--num2;
console.log(num2); // 1
3.3 自增自减写在变量前面和后面的区别
  • 自增自减写在变量的前面,表示变量先自增或自减,然后再参与其他运算
  • 自增自减写在变量的后面,表示变量先进行运算,然后再自增或自减
// 写在变量的后面
var num = 1;
// 这里拆解成这样 var res = 1 + 1; num++; 
var res = num++ + 1;
console.log(res); // 2
console.log(num); // 2

// 写在变量的前面
var num = 1;
// 这里拆解成这样  ++num; var res = 2 + 1;
var res = ++num + 1;
console.log(res); // 3
console.log(num); // 2

// 在企业开发中不推荐这样写法 var res = a++ + b; // var res = a + b; a++;
var a = 5;
var b = 10;
var res = a + b;
a++;
console.log(res); // 15
console.log(a); // 6

4. 关系运算符

> 大于

< 小于

>= 大于等于

<= 小于等于

== 等于

!== 不等于

=== 全等于

!== 不全等于

关系运算符只有两个返回值,truefasle

关系成立,返回 true

关系不成立,返回 false

console.log(1 > 2); // false
console.log(5 > 2); // true
console.log(1 == 1); // true

关系运算符的注意点

  • 如果是非数值类型比较,那么会先转换成数值类型再比较

    console.log(1 > false); // true
    console.log(1 > true); // false
    console.log(1 > undefined); // false
    console.log(1 > null); // true
    console.log(1 > ''); // true
    console.log(1 > ' '); // true
    console.log(1 > 'a'); //flase
    
  • 对于关系运算符来说,任何数据和 NaN 比较都是 false

    console.log(1 > NaN); // false
    console.log(undefined == NaN); // false
    console.log(null == NaN); // false
    console.log('a' > NaN); // false
    console.log(true == NaN); // false
    //如果想判断某一个数据是否是NaN那么可以通过isNaN来进行判断
    let num = NaN;
    let res = isNaN(num)
    console.log(res); // true
    
  • 如果是两边都是字符串类型,那么不会转换成数值类型,而是比较字符串相对应的Unicode编码

    console.log('a' > 'b'); // false
    console.log('a' < 'b'); // true
    // 如果字符串中有多个字符, 会从左至右的依次比较, 直到条件不满足为止
    console.log( "ab" > "ac"); // false
    
  • ===!== 会比较值和数据类型是否相等 ==!= 只会比较值

    console.log("123" == 123); // true
    console.log("123" != 123); // false
    console.log("123" === 123); // false
    console.log("123" !== 123); // true
    
  • 关系运算符都是左结合性(从左往右运算)

    // 因为关系运算符是左结合性 所以会先运算 10 > 3 返回 true  再计算 1 > 2  最后的结果为false
    console.log(10 > 3 >2);
    // STEP1  10 < 25 返回true  STEP2 运算 1 < 20  结果为true
    console.log(10 < 25 < 20);
    
  • 关系运算符中 > 大于、< 小于、>= 大于等于、<= 小于等于的优先级大于 ==!====!==

    // 先会计算 10 > 3  返回 true  再计算 1 == 5  最后结果返回false
    console.log(10 > 3 == 5);
    // 先会计算 10 > 0  返回 true 再计算 10 == 1  最后结果false
    console.log(10 == 10 > 0);
    

5. 逻辑运算符

逻辑运算符往往用于多个表达式的求值。

5.1 逻辑与(&&

格式: 条件表达式A && 条件表达式B

返回值: true/false

特点:如果有一个条件表达式为假则为假

// true && false 结果为false
console.log((10 > 5) && (1 > 2)); // false
console.log(true && true); // true
console.log(true && false); // false
console.log(false && false); // false
5.2 逻辑或(||

格式: 条件表达式A && 条件表达式B

返回值: true/false

特点:如果有一个条件表达式为真则为真

// true || false 结果为true
console.log((10 > 5) || (1 > 2)); // true
console.log(true || true); // true
console.log(true || false); // true
console.log(false || false); // false
5.3 逻辑非(!

格式: !条件表达式

返回值: true/false

特点:真变假,假变真

// 非true 就是 false
console.log( !true ); // false
// 先计算括号里的 1 > 2 返回 false 取反 变为 true
console.log( !(1 > 2) ); // true
5.4 逻辑运算符的优先级和结合性

逻辑运算符的结合性是左结合性

逻辑与的优先级大于逻辑或

// 左结合性就是从左往右运算 就计算 true && false 结果为 false
var res = true  && false;
console.log(res); // false
// 赋值运算就是右结合性 先运算 1 + 1 返回把结果赋值给 res 这个变量
var total = 1 + 1
console.log(total); // 2
5.5 逻辑运算符的注意点
  • 在逻辑与运算中, 如果参与运算的不是布尔类型, 返回值有一个特点

    如果条件A不成立, 那么就返回条件A

    如果条件A成立, 无论条件B是否成立, 都会返回条件B

    // 条件A为flase 那么就会返回条件A 值为0
    console.log(0 && 123); // 0
    // 条件A为true 那么条件B 不论真假都会返回B
    console.log(1 && 123); // 123
    
  • 在逻辑或运算中, 如果参与运算的不是布尔类型, 返回值有一个特点

    如果条件A成立, 那么就返回条件A

    如果条件A不成立, 无论条件B是否成立, 都会返回条件B

    // 条件A为flase 那么就会返回条件B 值为123
    console.log(0 || 123); // 123
    // 条件A为true 那么条件B 不论真假都会返回A 值为1
    console.log(1 || 123); // 1
    

6. 三元(目)运算符

三元运算符格式:条件表达式 ? 返回结果A : 返回结果B

在三元运算符中如果条件表达式为真,那么返回结果A

在三元表达式中如果条件表达式为假,那么返回结果B

// 10 > 6 返回 true 返回条件A Hello
console.log(10 > 6 ? 'Hello' : 'World'); // Hello 
// 5 > 6 返回 false 返回条件B World
console.log(5 > 6 ? 'Hello' : 'World'); // World
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容

  • 运算符基本概念 JavaScript运算符的概念和C语言一样, 都是告诉程序执行特定算术或逻辑操作的符号。 运算符...
    极客江南阅读 2,233评论 0 19
  • 01javascript语法规范 <!DOCTYPE html> javascript语法...
    ouyangqinbin阅读 1,304评论 0 0
  • 算术运算符 和C语言不同的是JavaScript中整数除以整数结果是小数 任何值和NaN运算, 得到的结果都是Na...
    箩篼阅读 329评论 0 0
  • JS基本数据类型及变量声明在js中有三种声明变量的方式:var let const,let var const的区...
    web佳阅读 903评论 1 8
  • 2016年的春节假期终于过去了。丙申年开始了。猴年。C记FY16上半年的业绩不错。大家的心情也不错。今年,ACI有...
    taoza阅读 202评论 0 0