金融网站框架模板做京挑客的网站

当前位置: 首页 > news >正文

金融网站框架模板,做京挑客的网站,重新安装 wordpress,网站建设完整版第一节 算数运算符

  1. 概述 JavaScript 共提供10个算术运算符#xff0c;用来完成基本的算术运算。 加法运算符x y减法运算符 x - y乘法运算符 x * y除法运算符x / y指数运算符x ** y余数运算符x % y自增运算符x 、x自减运算符–x 、x–数值运算符 x负数值运算符-x 减法、…第一节 算数运算符
  2. 概述 JavaScript 共提供10个算术运算符用来完成基本的算术运算。 加法运算符x y减法运算符 x - y乘法运算符 x * y除法运算符x / y指数运算符x ** y余数运算符x % y自增运算符x  、x自减运算符–x  、x–数值运算符 x负数值运算符-x 减法、乘法、除法运算法比较单纯就是执行相应的数学运算。下面介绍其他几个算术运算符重点是加法运算符。 2. 加法运算符 2.1 基本规则 加法运算符 是最常见的运算符用来求两个数值的和。 1 1 // 2 JavaScript 允许非数值的相加。 true true // 2 1 true // 2 上面代码中第一行是两个布尔值相加第二行是数值与布尔值相加。这两种情况布尔值都会自动转成数值然后再相加。 比较特殊的是如果是两个字符串相加这时加法运算符会变成连接运算符返回一个新的字符串将两个原字符串连接在一起。 a bc // abc 如果一个运算子是字符串另一个运算子是非字符串这时非字符串会转成字符串再连接在一起。 1 a // 1a false a // falsea 加法运算符是在运行时决定到底是执行相加还是执行连接。也就是说运算子的不同导致了不同的语法行为这种现象称为“重载”overload。由于加法运算符存在重载可能执行两种运算使用的时候必须很小心。 3 4 5 // 345 3 4 5 // 75 上面代码中由于从左到右的运算次序字符串的位置不同会导致不同的结果。 除了加法运算符其他算术运算符比如减法、除法和乘法都不会发生重载。它们的规则是所有运算子一律转为数值再进行相应的数学运算。 1 - 2 // -1 1 * 2 // 2 1 / 2 // 0.5 上面代码中减法、除法和乘法运算符都是将字符串自动转为数值然后再运算。 2.2 对象的相加 如果运算子是对象必须先转成原始类型的值然后再相加。 var obj { p: 1 }; obj 2 // [object Object]2 上面代码中对象 obj转成原始类型的值是 [object Object]再加 2就得到了上面的结果。 对象转成原始类型的值规则如下。 首先自动调用对象的 valueOf方法。 var obj { p: 1 }; obj.valueOf() // { p: 1 } 一般来说对象的 valueOf方法总是返回对象自身这时再自动调用对象的 toString方法将其转为字符串。 var obj { p: 1 }; obj.valueOf().toString() // [object Object] 对象的 toString方法默认返回 [object Object]所以就得到了最前面那个例子的结果。 知道了这个规则以后就可以自己定义 valueOf方法或 toString方法得到想要的结果。 var obj {valueOf: function () {return 1;} };obj 2 // 3 上面代码中我们定义 obj对象的 valueOf方法返回 1于是 obj 2就得到了 3。这个例子中由于 valueOf方法直接返回一个原始类型的值所以不再调用 toString方法。 下面是自定义 toString方法的例子。 var obj {toString: function () {return hello;} };obj 2 // hello2 上面代码中对象 obj的 toString方法返回字符串 hello。前面说过只要有一个运算子是字符串加法运算符就变成连接运算符返回连接后的字符串。 这里有一个特例如果运算子是一个 Date对象的实例那么会优先执行 toString方法。 var obj new Date(); obj.valueOf function () { return 1 }; obj.toString function () { return hello };obj 2 // hello2 上面代码中对象 obj是一个 Date对象的实例并且自定义了 valueOf方法和 toString方法结果 toString方法优先执行。 3. 余数运算符 余数运算符 %返回前一个运算子被后一个运算子除所得的余数。 12 % 5 // 2 需要注意的是运算结果的正负号由第一个运算子的正负号决定。 -1 % 2 // -1 1 % -2 // 1 所以为了得到负数的正确余数值可以先使用绝对值函数。 // 错误的写法 function isOdd(n) {return n % 2 1; } isOdd(-5) // false isOdd(-4) // false// 正确的写法 function isOdd(n) {return Math.abs(n % 2) 1; } isOdd(-5) // true isOdd(-4) // false 余数运算符还可以用于浮点数的运算。但是由于浮点数不是精确的值无法得到完全准确的结果。 6.5 % 2.1 // 0.19999999999999973 4. 自增和自减运算符 自增和自减运算符是一元运算符只需要一个运算子。它们的作用是将运算子首先转为数值然后加上1或者减去1。它们会修改原始变量。 var x 1; x // 2 x // 2–x // 1 x // 1 上面代码的变量 x自增后返回 2再进行自减返回 1。这两种情况都会使得原始变量 x的值发生改变。 运算之后变量的值发生变化这种效应叫做运算的副作用side effect。自增和自减运算符是仅有的两个具有副作用的运算符其他运算符都不会改变变量的值。 自增和自减运算符有一个需要注意的地方就是放在变量之后会先返回变量操作前的值再进行自增/自减操作放在变量之前会先进行自增/自减操作再返回变量操作后的值。 var x 1; var y 1;x // 1 y // 2 上面代码中 x是先返回当前值然后自增所以得到 1 y是先自增然后返回新的值所以得到 2。 5. 数值运算符负数值运算符 数值运算符 同样使用加号但它是一元运算符只需要一个操作数而加法运算符是二元运算符需要两个操作数。 数值运算符的作用在于可以将任何值转为数值与 Number函数的作用相同。 true // 1 [] // 0 {} // NaN 上面代码表示非数值经过数值运算符以后都变成了数值最后一行 NaN也是数值。具体的类型转换规则 负数值运算符 -也同样具有将一个值转为数值的功能只不过得到的值正负相反。连用两个负数值运算符等同于数值运算符。 var x 1; -x // -1 -(-x) // 1 上面代码最后一行的圆括号不可少否则会变成自减运算符。 数值运算符号和负数值运算符都会返回一个新的值而不会改变原始变量的值。 6. 指数运算符 指数运算符 **完成指数运算前一个运算子是底数后一个运算子是指数。 2 ** 4 // 16 注意指数运算符是右结合而不是左结合。即多个指数运算符连用时先进行最右边的计算。 // 相当于 2 ** (3 ** 2) 2 ** 3 ** 2 // 512 上面代码中由于指数运算符是右结合所以先计算第二个指数运算符而不是第一个。 7. 赋值运算符 赋值运算符Assignment Operators用于给变量赋值。 最常见的赋值运算符当然就是等号 。 // 将 1 赋值给变量 x var x 1;// 将变量 y 的值赋值给变量 x var x y; 赋值运算符还可以与其他运算符结合形成变体。下面是与算术运算符的结合。 // 等同于 x x y x y// 等同于 x x - y x - y// 等同于 x x * y x * y// 等同于 x x / y x / y// 等同于 x x % y x % y// 等同于 x x ** y x ** y 下面是与位运算符的结合 // 等同于 x x y x y// 等同于 x x y x y// 等同于 x x y x y// 等同于 x x y x y// 等同于 x x | y x | y// 等同于 x x ^ y x ^ y 这些复合的赋值运算符都是先进行指定运算然后将得到值返回给左边的变量。 第二节 比较运算符
  3. 概述 比较运算符用于比较两个值的大小然后返回一个布尔值表示是否满足指定的条件。 2 1 // true 上面代码比较 2是否大于 1返回 true。 注意比较运算符可以比较各种类型的值不仅仅是数值。 JavaScript 一共提供了8个比较运算符。 ! !  这八个比较运算符分成两类相等比较和非相等比较。两者的规则是不一样的对于非相等的比较算法是先看两个运算子是否都是字符串如果是的就按照字典顺序比较实际上是比较 Unicode 码点否则将两个运算子都转成数值再比较数值的大小。 2. 非相等运算符字符串的比较 字符串按照字典顺序进行比较。 cat dog // false cat catalog // false JavaScript 引擎内部首先比较首字符的 Unicode 码点。如果相等再比较第二个字符的 Unicode 码点以此类推。 cat Cat // true 上面代码中小写的 c的 Unicode 码点 99大于大写的 C的 Unicode 码点 67所以返回 true。 由于所有字符都有 Unicode 码点因此汉字也可以比较。 大 小 // false 上面代码中“大”的 Unicode 码点是22823“小”是23567因此返回 false。 3. 非相等运算符非字符串的比较 如果两个运算子之中至少有一个不是字符串需要分成以下两种情况。 1原始类型值 如果两个运算子都是原始类型的值则是先转成数值再比较。 5 4 // true // 等同于 5 Number(4) // 即 5 4true false // true // 等同于 Number(true) Number(false) // 即 1 02 true // true // 等同于 2 Number(true) // 即 2 1 上面代码中字符串和布尔值都会先转成数值再进行比较。 这里需要注意与 NaN的比较。任何值包括 NaN本身与 NaN使用非相等运算符进行比较返回的都是 false。 1 NaN // false 1 NaN // false 1 NaN // false 1 NaN // false NaN NaN // false NaN NaN // false 2对象 如果运算子是对象会转为原始类型的值再进行比较。 对象转换成原始类型的值算法是先调用 valueOf方法如果返回的还是对象再接着调用 toString方法 var x [2]; x 11 // true // 等同于 [2].valueOf().toString() 11 // 即 2 11x.valueOf function () { return 1 }; x 11 // false // 等同于 (function () { return 1 })() 11 // 即 1 11 两个对象之间的比较也是如此。 [2] [1] // true // 等同于 [2].valueOf().toString() [1].valueOf().toString() // 即 2 1[2] [11] // true // 等同于 [2].valueOf().toString() [11].valueOf().toString() // 即 2 11({ x: 2 }) ({ x: 1 }) // true // 等同于 ({ x: 2 }).valueOf().toString() ({ x: 1 }).valueOf().toString() // 即 [object Object] [object Object] 4. 严格相等运算符 JavaScript 提供两种相等运算符 和 。 简单说它们的区别是相等运算符 比较两个值是否相等严格相等运算符 比较它们是否为“同一个值”。如果两个值不是同一类型严格相等运算符 直接返回 false而相等运算符 会将它们转换成同一个类型再用严格相等运算符进行比较。 本节介绍严格相等运算符的算法。 1不同类型的值 如果两个值的类型不同直接返回 false。 1 1 // false true true // false 上面代码比较数值的 1与字符串的“1”、布尔值的 true与字符串 true因为类型不同结果都是 false。 2同一类的原始类型值 同一类型的原始类型的值数值、字符串、布尔值比较时值相同就返回 true值不同就返回 false。 1 0x1 // true 上面代码比较十进制的 1与十六进制的 1因为类型和值都相同返回 true。 需要注意的是 NaN与任何值都不相等包括自身。另外正 0等于负 0。 NaN NaN // false 0 -0 // true 3复合类型值 两个复合类型对象、数组、函数的数据比较时不是比较它们的值是否相等而是比较它们是否指向同一个地址。 {} {} // false [] [] // false (function () {} function () {}) // false 上面代码分别比较两个空对象、两个空数组、两个空函数结果都是不相等。原因是对于复合类型的值严格相等运算比较的是它们是否引用同一个内存地址而运算符两边的空对象、空数组、空函数的值都存放在不同的内存地址结果当然是 false。 如果两个变量引用同一个对象则它们相等。 var v1 {}; var v2 v1; v1 v2 // true 注意对于两个对象的比较严格相等运算符比较的是地址而大于或小于运算符比较的是值。 var obj1 {}; var obj2 {};obj1 obj2 // false obj1 obj2 // false obj1 obj2 // false 上面的三个比较前两个比较的是值最后一个比较的是地址所以都返回 false。 4undefined 和 null undefined和 null与自身严格相等。 undefined undefined // true null null // true 由于变量声明后默认值是 undefined因此两个只声明未赋值的变量是相等的。 var v1; var v2; v1 v2 // true 5. 严格不相等运算符 严格相等运算符有一个对应的“严格不相等运算符” !它的算法就是先求严格相等运算符的结果然后返回相反值。 1 ! 1 // true // 等同于 !(1 1) 上面代码中感叹号 !是求出后面表达式的相反值。 6. 相等运算符 相等运算符用来比较相同类型的数据时与严格相等运算符完全一样。 1 1.0 // 等同于 1 1.0 比较不同类型的数据时相等运算符会先将数据进行类型转换然后再用严格相等运算符比较。下面分成几种情况讨论不同类型的值互相比较的规则。 1原始类型值 原始类型的值会转换成数值再进行比较。 1 true // true // 等同于 1 Number(true)0 false // true // 等同于 0 Number(false)2 true // false // 等同于 2 Number(true)2 false // false // 等同于 2 Number(false)true true // false // 等同于 Number(true) Number(true) // 等同于 NaN 1 0 // true // 等同于 Number() 0 // 等同于 0 0 false // true // 等同于 Number() Number(false) // 等同于 0 01 true // true // 等同于 Number(1) Number(true) // 等同于 1 1\n 123 \t 123 // true // 因为字符串转为数字时省略前置和后置的空格 上面代码将字符串和布尔值都转为数值然后再进行比较。 2对象与原始类型值比较 对象这里指广义的对象包括数组和函数与原始类型的值比较时对象转换成原始类型的值再进行比较。 具体来说先调用对象的 valueOf()方法如果得到原始类型的值就按照上一小节的规则互相比较如果得到的还是对象则再调用 toString()方法得到字符串形式再进行比较。 下面是数组与原始类型值比较的例子。 // 数组与数值的比较 [1] 1 // true// 数组与字符串的比较 [1] 1 // true [1, 2] 1,2 // true// 对象与布尔值的比较 [1] true // true [2] true // false 上面例子中JavaScript 引擎会先对数组 [1]调用数组的 valueOf()方法由于返回的还是一个数组所以会接着调用数组的 toString()方法得到字符串形式再按照上一小节的规则进行比较。 下面是一个更直接的例子。 const obj {valueOf: function () {console.log(执行 valueOf());return obj;},toString: function () {console.log(执行 toString());return foo;} };obj foo // 执行 valueOf() // 执行 toString() // true 上面例子中 obj是一个自定义了 valueOf()和 toString()方法的对象。这个对象与字符串 foo进行比较时会依次调用 valueOf()和 toString()方法最后返回 foo所以比较结果是 true。 3undefined 和 null undefined和 null只有与自身比较或者互相比较时才会返回 true与其他类型的值比较时结果都为 false。 undefined undefined // true null null // true undefined null // truefalse null // false false undefined // false0 null // false 0 undefined // false 4相等运算符的缺点 相等运算符隐藏的类型转换会带来一些违反直觉的结果。 0 // true 0 0 // true2 true // false 2 false // falsefalse false // false false 0 // truefalse undefined // false false null // false null undefined // true \t\r\n 0 // true 上面这些表达式都不同于直觉很容易出错。因此建议不要使用相等运算符 最好只使用严格相等运算符 。 7. 不相等运算符 相等运算符有一个对应的“不相等运算符” !它的算法就是先求相等运算符的结果然后返回相反值。 1 ! 1 // false// 等同于 !(1 1)