• javascript权威指南,第5章,表达式和运算符


    5.1 什么是表达式?

    表达式就是javascript的一个“短语”,javascript的解释器可以计算,从而生成一个值。

    5.2 运算符概述

    javascript运算符包括:关键字运算符和标点运算符

    下面的表会给出运算符的优先级(优先级控制执行操作的顺序),结合性等。

    p列给出运算符的优先级,数字较大的优先级高于数字较小的。A列给出运算符的结合性,结合性L(从左到右),R(从右到左),运算符的的说明放在后面讨论。

    5.2.1 运算数的个数

    大多数是二元运算符,例如常用的+,-;

    一元运算符,常用的-,表示是对值取反;

    三元运算符,条件运算符? :;

    5.2.3 运算符的优先级

    在表5-1中,p数字较大的运算符的优先级大于p数字较小的运算符的优先级。

    5.2.4 运算符的结合性

    一个优先级相同,按照运算符的结合性去执行。

    一元运算符,赋值运算符,三元条件运算符的结合性是从右到左。

    5.3 算数运算符

    算术运算符用于执行变量与/或值之间的算术运算。

    给定 y=5,下面的表格解释了这些算术运算符:

    运算符   描述             例子       结果
    +       加               x=y+2     x=7
    -       减               x=y-2     x=3
    *       乘               x=y*2     x=10
    /       除               x=y/2     x=2.5
    %       求余数 (保留整数)  x=y%2     x=1
    ++      累加              x=++y     x=6
    --      递减             x=--y     x=4 

    疑点剖析:i++和++i的区别

    • ++i 的用法(以 a=++i ,i=2 为例)

    先将 i 值加 1 (也就是 i=i+1 ),然后赋给变量 a (也就是 a=i ),

    则最终 a 值等于 3 , i 值等于 3 。

    所以 a=++i 相当于 i=i+1 ,a=i

    • i++ 的用法(以 a=i++ ,i=2 为例)

    先将 i 值赋给变量 a (也就是 a=i ),然后 i 值加 1 (也就是 i=i+1 ),

    则最终 a 值等于 2 ,i 值等于 3 。

         所以 a=i++ 相当于 a=i , i=i+1

    • ++i 与 i++

    a=++i 相当于这两句 i+1 , a=i

    a=i++ 相当于这两句 a=i , i+1

    var i=1
    var j= i++;//执行 j=i,i=i+1
    alert(j);//结果为1
    alert(i);//结果为2
    var i=1
    var j= ++i;//执行i=i+1,j=i
    alert(j);//结果为2
    alert(i);//结果为2
    • ++i 与 i++ 单独使用时,相当于 i=i+1

    如果赋给一个新变量,则 ++i 先将 i 值加 1 ,而 i++ 先将 i 赋给新变量。

    5.4 等性运算符

    判断两个变量是否相等是程序设计中非常重要的运算。在处理原始值时,这种运算相当简单,但涉及对象,任务就稍有点复杂。

    JavaScript提供了两套等性运算符:等号和非等号用于处理原始值,全等号和非全等号用于处理对象。

    等号和非等号

    在 JavaScript 中,等号由双等号(==)表示,当且仅当两个运算数相等时,它返回 true。

    非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回 true。

    为确定两个运算数是否相等,这两个运算符都会进行类型转换。

    执行类型转换的规则如下:

    • 如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
    • 如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
    • 如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
    • 如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。

    在比较时,该运算符还遵守下列规则:

    • 值 null 和 undefined 相等。
    • 在检查相等性时,不能把 null 和 undefined 转换成其他值。
    • 如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
    • 如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。

    重要提示:即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。

    下表列出了一些特殊情况,以及它们的结果:

    表达式                 值
    null == undefined     true
    "NaN" == NaN          false
    5 == NaN              false
    NaN == NaN            false
    NaN != NaN            true
    false == 0            true
    true == 1             true
    true == 2             false
    undefined == 0        false
    null == 0             false
    "5" == 5              true

    全等号和非全等号

    等号和非等号的同类运算符是全等号和非全等号。这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。

    全等号由三个等号表示(===),只有在无需类型转换运算数就相等的情况下,才返回 true。

    例如:

    var sNum = "66";
    var iNum = 66;
    alert(sNum == iNum);    //输出 "true"
    alert(sNum === iNum);    //输出 "false"

    在这段代码中,第一个 alert 使用等号来比较字符串 "66" 和数字 66,输出 "true"。如前所述,这是因为字符串 "66" 将被转换成数字 66,,然后才与另一个数字 66 进行比较。第二个 alert 使用全等号在没有类型转换的情况下比较字符串和数字,当然,字符串不等于数字,所以输出 "false"。

    非全等号由感叹号加两个等号(!==)表示,只有在无需类型转换运算数不相等的情况下,才返回 true。

    例如:

    var sNum = "66";
    var iNum = 66;
    alert(sNum != iNum);    //输出 "false"
    alert(sNum !== iNum);    //输出 "true"

    这里,第一个 alert 使用非等号,把字符串 "66" 转换成数字 66,使得它与第二个运算数 66 相等。因此,计算结果为 "false",因为两个运算数是相等的。第二个 alert 使用的非全等号。该运算是在问:"sNum" 与 "iNum" 不同吗?这个问题的答案是:是的(true),因为 sNum 是字符串,而 iNum 是数字,它们当然不同。

    5.5关系运算符

    • JavaScript关系运算符负责判断两个值是否符合给定的条件,
    • JavaScript关系运算符包括比较运算符(>,<,>=,<=,!=,==,===,!==;),in运算符,instanceof运算符。
    • 用关系运算符和运算对象(操作数)连接起来,符合规则的JavaScript语法的式子,称JavaScript关系表达式;
    • JavaScript关系表达式返回的值为true(正确[真])或false(错误[假]);

    5.5.1JavaScript比较运算符包括>,<,>=,<=,!=,==,===,!==;

                                                                                     JavaScript比较运算符与关系表达式

    容易混淆的知识点===与!==

    ===代表恒等于,不仅判断数值,而且判断类型。

    比如

    var a=5,b="5"; //a是数值类型,b是字符串类型,虽然数值相等但是类型不等。
    document.write(a==b); //返回true,数值上相等
    document.write(a===b); //返回false,虽然树枝上相等,但是类型不同

    !==代表恒不等于,也是要判断数值与类型。

    比如

    var a=5,b="5";//
    document.write(a!=b);//返回false,数值上相等
    document.write(a!==b);//返回true,虽然数值上相等,但是类型不同

    5.5.2 in运算符

    判断对象是否为数组/对象的元素/属性;

    格式:(变量 in 对象),

    当“对象”为数组时,“变量”指得是数组的“索引”;

    当“对象”为对象时,“变量”指的是对象的“属性”。

    var arr = ["a","b","2","3","str"];
    var result = ("b" in arr);//结果为false
    var result1 = (4 in arr);//结果为true

    5.5.3 instanseof运算符

    • 用于判断一个对象是否为某一数据类型,或一个变量是否为一个对象的实例;
    • 返回boolean类型;
    • 语法为  0 instanceif A。

    例如

     1 <script type="text/javascript">
     2 <!3 alert("typeof(1):" + typeof(1));//number
     4 alert("typeof(\"abc\"):" + typeof("abc"));//string
     5 alert("typeof(true):" +typeof(true));//boolean
     6 alert("typeof(2009-2-4):" + typeof(2009-2-4));//number
     7 alert("typeof(\"2009-2-4\"):" + typeof("2009-2-4"));//string
     8 alert("typeof(m):" + typeof(m));//undefined
     9 var d=new Date();
    10 alert("typeof(d):" + typeof(d));//object
    11  function Person(){};
    12 alert("typeof(Person):" + typeof(Person));//function
    13 var a=new Array();
    14 alert("typeof(a):" + typeof(a));//object
    15 alert("a instanceof Array:" + (a instanceof Array));
    16 var h=new Person();
    17  var o={};
    18 alert("h instanceof Person:" + (h instanceof Person));//true
    19 alert("h instanceof Object:" + (h instanceof Object));//true
    20 alert("o instanceof Object:" + (o instanceof Object));//true
    21 alert(typeof(h));//object
    22 //–>
    23 </script>

    5.6逻辑运算符

    • 包括逻辑与(&&)运算符、逻辑或(||)运算符,逻辑非(!)运算符;
    • 用于测定变量或值之间的逻辑。

    给定 x=6 以及 y=3,下表解释了逻辑运算符:

    运算符     描述     例子                           用法说明
    &&        and     (x < 10 && y > 1) 为 true      只有在两边表达式都为true时,结果才为ture
    ||        or      (x==5 || y==5) 为 false,       两个表达式有一个为true时,结果为true,否则为false
    !         not     !(x==y) 为 true,               表达式为true,结果为false,反之亦然

    5.7 位运算符

    • 按位运算符是把操作数看作一系列单独的位,而不是一个数字值。解释下什么是“位”,数值或字符在内存内都是被存储为0和1的序列,每个0和1被称之为1个位,比如说10进制数据2在计算机内被存储为 0 0 0 0 0 0 1 0,当我们将内存内的位值改变之后,这个值代表的意义也就变了,比如把2前移动一位, 现在存储单元里面变成了0 0 0 0 0 1 0 0,这个值表示的是十进制的4,这也就是按位操作符的运算原理
    • 包括:& 按位与、|按位或、^按位异或、~取反、>>右移、<<左移

    5.7.1 & 运算符
    &是二元运算符,它以特定的方式的方式组合操作数中对应的位 如果对应的位都为1,那么结果就是1, 如果任意一个位是0 则结果就是0
    1 & 3的结果为1
    来看看它的怎么运行的:
    1的二进制表示为 0 0 0 0 0 0 1
    3的二进制表示为 0 0 0 0 0 1 1
    根据 & 的规则 得到的结果为 0 0 0 0 0 0 0 1,十进制表示就是1

    只要任何一位是0 &运算的结果就是 0,所以可以用&把某个变量不必要的位设为0, 比如某个变量的二进制表示为 0 1 0 0 1 0 0 1, 我想保留低4位,消除高4位 用 & 0x0F就可以了(住:0x0F为16进制表示法,对应的二进制为 0 0 0 0 1 1 1 1)。

    5.7.2 | 运算符
    | 跟 & 的区别在于 如果对应的位中任一个操作数为1 那么结果就是1
    1 | 3 的结果为3

    5.7.3^ 运算符
    ^运算符跟 | 类似,但有一点不同的是 如果两个操作位都为1的话,结果产生0
    0 1 0 0 0 0 0 1
    0 1 0 1 1 0 1 0
    产生 0 0 0 1 1 0 1 1

    5.7.4 ~ 运算符
    ~是对位求反 1变0, 0变1

    5.7.5 移位运算符移位运算符把位按指定的值向左或向右移动
    << 向左移动 而 >> 向右移动,超过的位将丢失,而空出的位则补0

    如 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1(十进制16387) 向左移动两位将变成
    0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 (十进制12)
    向右移动两位则是
    0 0 0 1 0 0 0 0 0 0 0 0 0 0 0(十进制4096)

    5.8 赋值运算符

    • JavaScript赋值运算符负责为变量赋值;
    • JavaScript赋值运算符包括=,+=,-=,*=,/=,%=

                                                                           JavaScript赋值运算符与赋值表达式

  • 相关阅读:
    SpringBoot-10-之初阶整合篇(下)
    09--SpringBoot之初阶整合篇(上)
    07--SpringBoot之数据库JPA(CRUD)
    go 文件操作 io
    类型断言
    多态
    golang interface
    go strcut 封装
    go struct 抽象
    poj-3280 Cheapest Palindrome (dp)
  • 原文地址:https://www.cnblogs.com/huanhuan8808/p/3054207.html
Copyright © 2020-2023  润新知