一些团队规定禁用 == 运算符换用=== 严格相等。以工程标准衡量,== 带来的便利性抵不上其带来的成本,团队协作时候你看到别人代码中的 ==,有些时候需要判断清楚作者的代码意图是确实需要转型,还是无所谓要不要转型只是随手写了,增加了一些额外的成本。但是我比较喜欢的一本书  You don't know JS,中作者也写道过一个我比较赞同的观点

Many developers feel that === is more predictable, so they advocate always using that form and staying away from ==. I think this view is very shortsighted. I believe == is a powerful tool that helps your program, if you take the time to learn how it works.

简译为

很多开发者认为 === 的行为更加容易预测,从而主张使用 === 而远离 ==。我认为这种观点是非常短视的,如果你花点时间去搞清楚它的工作原理,== 将是你开发的强大工具。

究竟谁对谁错也没有定论,但是去了解一些隐式转换的规则,对我们开发和调试bug都非常有帮助。这些规则规定很烦多,一个个看过来很无趣也不能全记住。我们下面从这个问题的一些答案中去探究其中的一小部分规则。

下面代码中 a 在什么情况下会打印 1?

var a = ?;

if(a == 1 && a == 2 && a == 3)

{ 
console.log(1);
}

利用重写toString/valueOf

let a = {
i: 1,
toString () { //或者valueOf
return a.i++ //先返回后加
}
}
if(a == 1 && a == 2 && a == 3) {
console.log('1');
}

数组对象:

toString 方法返回一个字符串,该字符串由数组中的每个元素的 toString() 返回值经调用 join() 方法连接(由逗号隔开)组成,改写join方法为shift,每次返回第一个元素,并删除。

var a = [1,2,3];
a.join = a.shift; if(a == 1 && a == 2 && a == 3) {
console.log('1');
}

ES6的symbol:

Symbol.toPrimitive就是其中一个,它指向一个方法,表示该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。这里就是改变这个属性,把它的值改为一个 闭包 返回的函数。

let a = {[Symbol.toPrimitive]: ((i) => () => ++i) (0)}; 

if(a == 1 && a == 2 && a == 3) {
console.log('1');
}

javascript的隐式类型转换(使(a==1&&a==2&&a==3) 成立)的更多相关文章

  1. JavaScript之隐式类型转换

    布尔操作符(!.&&.||) 当使用 条件判断语句(if...else) 以及 布尔操作符(!.&&.||) 时,会调用Boolean()进行隐式类型转换 转换为fal ...

  2. javascript的隐式类型转换

    首先简单了解js的typeof,会返回六种类型 即 number string boolen function object undefined 也就是六种基本数据类型 显示类型转换大概有以下几种: ...

  3. 从 (a==1&&a==2&&a==3) 成立中看javascript的隐式类型转换

    下面代码中 a 在什么情况下会打印 1? var a = ?; if(a == 1 && a == 2 && a == 3){ console.log(1); } 这个 ...

  4. 「译」JavaScript 的怪癖 1:隐式类型转换

    原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 ...

  5. 有趣的JavaScript隐式类型转换

    JavaScript的数据类型是非常弱的(不然不会叫它做弱类型语言了)!在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加.之所以不同的数据类型之间可以做运算,是因为 ...

  6. JavaScript 隐式类型转换

    JavaScript 隐式类型转换 原文:https://blog.csdn.net/itcast_cn/article/details/82887895 · 1.1 隐式转换介绍 · 1.2 隐式转 ...

  7. JavaScript学习总结(二、隐式类型转换、eval())

    一.(避免)隐式类型转换 console.log(false == 0);   //logs true; console.log(false === 0);   //logs false; conso ...

  8. Javascript显示和隐式类型转换

    1.转换成字符串 多数的JavaScript宿主环境(比如Node.js和Chrome)都提供了全局函数toString: 与此同时Object.prototype也定义了toString方法,使得所 ...

  9. JavaScript显式类型转换与隐式类型转换

    隐式类型转换 四则运算 判断语句 toString 在 JavaScript 中声明变量不需指定类型,对变量赋值也没有类型检查,同时还允许隐式类型转换. 这些特征说明 JavaScript 属于弱类型 ...

随机推荐

  1. Python的并行求和例子

    先上一个例子,这段代码是为了评估一个预测模型写的,详细评价说明在 https://www.kaggle.com/c/how-much-did-it-rain/details/evaluation, 它 ...

  2. 小D课堂 - 新版本微服务springcloud+Docker教程_4-06 Feign核心源码解读和服务调用方式ribbon和Feign选择

    笔记 6.Feign核心源码解读和服务调用方式ribbon和Feign选择         简介: 讲解Feign核心源码解读和 服务间的调用方式ribbon.feign选择             ...

  3. WebSocket 搭建简单聊天网站

    HTML5 WebSocket WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. 在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏 ...

  4. 你应该知道的 MySQL 的锁

    背景 数据库的锁是在多线程高并发的情况下用来保证数据稳定性和一致性的一种机制.MySQL 根据底层存储引擎的不同,锁的支持粒度和实现机制也不同.MyISAM 只支持表锁,InnoDB 支持行锁和表锁. ...

  5. hive数据类型1

  6. openstack compute service list Unable to establish connection to http://controller:8774/v2.1/os-services: ('Connection aborted.', BadStatusLine("''",))

    8774是nova的端口号,所以我就逐一查看nova的日志文件. tail -f /var/log/nova/nova-conductor.log 2019-06-13 08:24:53.559 44 ...

  7. 归纳整理Python中的控制流语句的知识点

    归纳整理Python中的控制流语句的知识点 Python 解释器在其最简单的级别,以类似的方式操作,即从程序的顶端开始,然后一行一行地顺序执行程序语句.例如,清单 1 展示了几个简单的语句.当把它们键 ...

  8. python-Web-django-商城-session存入数据库

    utils: '''用户session''' import datetime from app01.models import Sessions ''' iii = request.session.s ...

  9. 感知器做二分类的原理及python实现

    本文目录: 1. 感知器 2. 感知器的训练法则 3. 梯度下降和delta法则 4. python实现 1. 感知器[1] 人工神经网络以感知器(perceptron)为基础.感知器以一个实数值向量 ...

  10. fdisk中参数配置说明表

    命令 描述 a 设置活动分区标志 b 编辑BSD Unix系统用的磁盘标签 c 设置DOS兼容标志 d 删除分区 l 显示可用的分区类型 m 显示命令选项(帮助) n 添加一个新的分区 o 创建DOS ...