博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[译]JavaScript:运算符
阅读量:6645 次
发布时间:2019-06-25

本文共 2112 字,大约阅读时间需要 7 分钟。

原文:


在,我们讲到了JavaScript中的数据类型和类型转换.今天,我们接着讲一下JavaScript中的每个运算符到底是如何进行类型转换的.下面会依次讲解六个最常用的运算符的工作机制:

typeof运算符会返回操作数类型的字符串表示.主要有两个需要注意的地方:

  • 未定义或未声明的变量将会返回"undefined", 比如.如果a没有被声明,那么typeof a将会返回"undefined".
  • typeof在操作数是null或函数的种情况下会"撒谎".

除了这些, 操作数和对应的类型字符串可以从下表查出:

表达式的类型 结果
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
Object,不可以被调用 "object"
Object,可以被调用 "function"

我标记“⚠”的两处地方就是上面提到的typeof误导我们的地方:type of null应该返回"Null",而任意函数的类型应该是"object".

将两边的操作数都转换为数字. "8" - true 会被转换为 8 - 1.的确非常的简单,不过下面的加法可就不是了;).

加法是JavaScript中最麻烦的运算符了.让我们看看在执行a + b的时到底发生了什么:

  1. 两边的操作数首先被转换成原始值.这里我们称之为AB.
  2. 如果有任意一个原始值是字符串,则把另一个也转换成字符串,执行A和B的连接操作并返回连接后的字符串.
  3. 否则把A和B都转换为数字,返回两个数字的和.

例如:

8 + "5" ➙ "8" + "5" ➙ "85";  //"5"是字符串,所以把8也转换成字符串,连接后值为"85"8 + true ➙ 8 + 1 ➙ 9;        //没有字符串,两边都转换成数字,true转换成数字为1,返回相加的和9"8" + true ➙ "8" + "true" ➙ "8true";  //"8"是字符串,把true也转换成字符串"true",连接后值为"8true"

和加法运算符不同,小于运算符只在两个操作数都为字符串的时候才将他们作为字符串来比较.下面是正式的操作步骤:

  1. 两边的操作数都转换成原始值.这里我们称之为A 和 B.
  2. 如果这个两个原始值都为字符串,则把A和B按照字符串来比较.
  3. 否则将他们都转换位数字,按照数字大小比较.

例如:

8 > "5" ➙ 8 > 5 ➙ true;   //两边不都是字符串,"5"转换为数字58 > true ➙ 8 > 1 ➙ true;  //两边不都是字符串,true转换成数字1"8" > "18" ➙ true;         //两边都是字符串,8的ascii码大于1的ascii码

许多运算符中最让人省心的一个,也被称为三等号(===),它的操作很简单:检查两个操作数的类型是否相等,如果相等的话,检查他们的值是否相等.他的兄弟运算符(==)就比较复杂了.

JavaScript中最让人讨厌的运算符.它的工作机制是这样的:

  1. 首先检查两个操作数的类型,如果他们是相同的类型,那么继续执行严格相等比较.
  2. 如果两个操作数都是null或者是undefined,返回true.
  3. 如果其中一个操作数是字符串另外一个是数字,则将他们都转换数字,再执行严格相等比较.
  4. 如果其中一个操作数是布尔值,把它转换成数字,然后回到步骤1继续执行.
  5. 如果其中一个操作数是字符串或者数字,另外一个是对象值,把这个对象值转换成原始值,然后回到步骤1继续执行.
  6. 返回false.

这基本上意味着,如果两个操作数的类型不同,则判断的工作机制类似于小于<比较,如果类型相同,则类似于严格相等比较.总结一下就是:当类型不同时,将两个操作数都转换为原始值,除非两个原始值都是字符串,否则再次将两个原始值转换成数字再比较,还有就是null == undefined是true.

8 == "5" ➙ 8 == 5 ➙ false;          //"5"转换成数字51 == true ➙ 1 == 1 ➙ true;          //true转换成数字1 0 == "" ➙ 0 == 0 ➙ true;            //""转换成数字00 == "0" ➙ 0 == 0 ➙ true;           //"0"转换成数字0"" == "0" ➙ false;                   //字符串直接判断是否相等 "1000" == "1e3" ➙ false;        //字符串直接判断是否相等  1000 == "1e3" ➙ true;                //"1e3"转换成1000,科学计数法5 == {valueOf: function () { return 5; }} ➙ 5 == 5 ➙ true;         //对象值转换成原始值5

这六个运算符并不是全部的运算符,但肯定是最麻烦的几个了.

转载地址:http://lievo.baihongyu.com/

你可能感兴趣的文章
c# 串口SerialPort
查看>>
mysql 启动和关闭外键约束
查看>>
Unity4 升级到 Unity5 更新小记
查看>>
JFinal项目部署到Weblogic注意事项
查看>>
rdlc 分页操作和分页统计
查看>>
黄聪:JS数学计算精度修正
查看>>
使用windeployqt工具来进行Qt的打包发布
查看>>
Redis哨兵
查看>>
所谓 A/B test
查看>>
TCP握手和传输的一次观察
查看>>
CentOS下使用LVM进行分区(转)
查看>>
第六章:任务执行——Java并发编程实战
查看>>
git如何打补丁?
查看>>
如何唯一确定一个 Java 类?
查看>>
kubernetes 集群安装etcd集群,带证书
查看>>
深入理解java中的底层阻塞原理及实现
查看>>
Ambari安装之部署单节点集群
查看>>
[转]ionic3项目实战教程三(创建provider、http请求、图文列表、滑动列表)
查看>>
.net core通过多路复用实现单服务百万级别RPS吞吐
查看>>
使用AShot进行网页全页截图
查看>>