第三章基本概念(二)操作符(一)

  • 算术操作符
  • 关系操作符
  • ECMA里面的操作符的与众不同之处在于他能适用于很多只,例如:字符串,数字值,布尔值,甚至对象.不过在应用于对象的时候,相应的操作符通常会调用valueof()或者String()方法.以便可以取得操作的值.

一元操作符

  • 只能操作一个值得操作符叫一元操作符。

递增操作符和递减操作符

它分为前置型和后置型。前置型应该以为要操作的变量之前。而后置型则放在要操作的变量之后。
因此使用前置递增操作符给数值加1时,要把两个加号(++)放在变量前面.比如:

var age = 29;
++age;
在这个例子中前置递增操作符把age的值变成了30(29+1)
实际上他执行了下面的效果
var age = 29;
age += 1; 等价于 age = age+1;

执行前置递减操作的方法也类似。结果会从一个数值中减去1,使用前置递减操作符时候,要把(--)放在相应变量的前面

var age = 29;
--age;
这样age就变成了 28(从29中减去了1)
执行前置递增或递减时,变量的值都是在语句被求值以前改变的。
例如:
var age = 29;
var anotherAge = --age+2;
window.alert(age); //输出28
window.alert(anotherAge); //输出30
这个例子中变量anotherAge的初始值等于变量age的值前置递减后+2由于先执行了减法。age的值变成了28,所以在加2的结果变成了30

由于前置递增和递减操作与执行语句的优先级相等

var num1 = 2;
var num2 = 20;
var num3 = --num1+num2; //等价于21
var num4 = num1++num2; //等于21
在这里正是由于num1先减去了1才和num2相加。

后置型递增和递减操作符的语法不变(仍然是++和--),只不过要放在变量的后面而不是前面.后置型递增与递减与前置性递增和递减有一个最重要的区别,就是递增和递减操作是在包含它们的语句被求值之后才执行的。

例如: var age =29;
age++;
把递增操作符放在变量的后面并不会改变语句的结果。因为上面是这条语句唯一的操作。但是当语句中还包含其他操作时候,上述区别就非常明显了。
var num1 = 2;
var num2 = 20;
var num3 = num1--+num2; //等于22但是执行完后num1变成了1
var num4 = num1+num2; //等于21


  • ++和--对任何值都适用.也就是说他们不仅适用于整数,还可以用于字符串,布尔值,浮点数和对象。在应用于不同的值时候,递减和递减操作符遵循下面的原则:
  1. 再应用于一个包含有效数字字符的字符串时,先将其转换成数字值。在执行加减1的操作。字符串变量变成数值变量。
  2. 在应用于一个不包含有效数字字符串时候,将变量的值设置为NaN,祖父穿变量变成数值变量.
  3. 在应用于布尔值false,先将其转换为0在执行减1操作。布尔值变成数值变量.
  4. 在应用于布尔值true,先将其转换成1在执行减去1的操作。布尔值变成数值变量.
  5. 在应用于浮点数值时,执行加减1的操作。
  6. 在应用于对象是,先调用对象的valueof()方法。取得一个可供操作的值。然后对该值应用前规则。如果结果是NaN,则调用toString()方法,对象变量变成数值变量.

例如:
var s1 = "2";
var s2 = "z";
var b = false;
var f = 1.1;
var o = {
valueof:function(){return -1;}

}

s1++; //3
s2++; //NaN
b++; //1
f-- //值变成0.100000000000000009(浮点数舍入错误导致)
o-- //值变成-2

一元加和减操作符

一元加操作符以一个加号(+)表示。放在数值前面。对数值不会影响
var num = 25;
num = +num; //仍然是25
不过在非数值应用一元加操作符时,该操作符会想Number()一样对这个值进行转换。换句话说。布尔值false和true将会被转换为0和1

var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1 ;
var o ={
valueof:function(){return -1;}
}
s1 = +s2;    //值变成1
s2 = +s2;    //值变成1.1
s3 = +s3;    //值变成NaN
b = +b;     //值变成0
f = +f;     //值未变,仍然是1.1
o = +o ;     //值变成-1

一元减操作符只要是表示负数,例如将1转换成-1

例如:
var num = 25;
num = -num; //-25
一元减操作符应用于数值时,该值会变成负数。而当应用于非数值的时候,一元加与一元减规则相同。最后再将得到数值变成负数。

var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1 ;
var o ={
valueof:function(){return -1;}
}
s1 = -s1;   //值变成了-1
se = -s2;   //值变成了-1.1
s3 = -s3;   //值变成了NaN
b = -b;     //值变成了0
f = -f;     //值变成了-1.1
o = -o ;    //值变成了数值1    

布尔操作符

布尔操作符一共有3个,非(NOT),与(AND),或(OR)

  • 逻辑非
    逻辑非由一个感叹号(!)表示,无论这个值是什么数据类型,这个操作符符都会返回一个布尔值。

    逻辑非操作符首先会将它的操作数转换成一个布尔值,然后在求反

    他遵循下面的规则;

    1.如果操作数是一个对象,则返回false
    2.如果操作数是一个空字符串,返回就是true
    3.如果操作数是一个非空字符串,返回false
    4.如果操作数是数值0,返回true
    5.如果操作数是任意非0数值,返回就是false
    6.如果操作数是null,返回true
    7.如果操作数是NaN,返回true
    8.如果操作数是undefined ,返回true
    例如:
    window.alert(!false); //true
    window.alert(!"blue"); //false
    window.alert(!0); //true
    window.alert(!NaN); //true
    window.alert(!""); //true
    window.alert(!12345); //false

  • 逻辑与
    逻辑与操作符由2个和号(&&)表示。我们也叫做短路与
    例如var result = true && false;
    逻辑与的真值表如下:

    第一个操作数:true 第二个操作数 true 结果true
    第一个操作数:true 第二个操作数 false 结果false
    第一个操作数:false 第二个操作数 true 结果false
    第一个操作数:false 第二个操作数 false 结果false

逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔的情况下,逻辑与操作不一定返回布尔值。此时他遵循下面的原则:
1.如果第一个操作数是对象,则返回第二个操作数
2.如果第二个操作数是对象,只有第一个操作数的求值结果为true的情况下才会返回该对象
3.如果两个操作数都是对象,则返回第二个操作数
4.如果有一个操作数是null,则返回Null
5.如果有一个操作数是NaN,则返回NaN 
6.如果有一个操作数是undefined 则返回undefined

一句话总结:逻辑与是短路与,判断优先前面。取值则是后面。判断前面要是通不过,直接PASS,取值则是完全后面说的算,null,undefined,NaN,返回的都是本身,前提是第二个值必须有定义,不能没定义

例如:
var found = true;
var result = (found &&someUnder); //这里会发生错误
window.alert(result); //这一行不会执行


这里当执行逻辑与操作时会发生错误。因为变量someUnder没有声明.由于变量found的值是true,所以逻辑与操作符会继续对变量someUnder求值。但是someUnder尚未定义,因此会导致错误。这说明不能在逻辑与中操作未定义的值

  • 逻辑或
    逻辑或由两个(||)表示,有两个操作数。只要有一个是真的就是真的
    逻辑或的真值:
    1.第一个操作数:True 第二个操作数: true 结果:true
    2.第一个操作数:True 第二个操作数: false 结果:true
    3.第一个操作数:false 第二个操作数:true 结果:true
    4.第一个操作数:false 第二个操作数:false 结果:false
与逻辑与类似如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值

他遵循下面的原则:

  1. 如果第一个操作数是对象,则返回第一个操作数.
  2. 如果第一个操作数的求值为false,则返回第二个操作数
  3. 如果两个操作数都是对象,则返回第一个操作数
  4. 如果两个数都是null,则返回null
  5. 如果两个数都是NaN,则返回NaN
  6. 如果两个数都是undefined ,则返回undefined

一句话概括逻辑或:只要有一个对的他就是对的,返值只返回第一个,除非第1个是false他才返回第二个,要是前面是false,后面必须有定义。要是没定义则会报错误


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

推荐阅读更多精彩内容