javascript中的隐式类型转化

#隐式转换

## “+” 字符串和数字

如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作。
如果其中一个操作数是对象(包括数组),则首先对其调用`ToPrimitive`抽象操作,该抽象操作再调用`[[DefaultValue]]`,以数字作为上下文。
`[1,2]+[3,4]=='1,23,4'`
原因,因为数组的valueOf操作无法得到简单的基本类型,于是它转而调用toString。因此上栗得到的是'1,23,4'。

## 布尔值到数字的隐式强制类型转换

```js
function onlyOne(){
var sum = 0;
for(var i=0;i<arguments.length;i++){
if(arguments[i]){ //跳过假值 undefined也是假值,避免NaN
sum+=arguments[i];
}
}
return sum === 1;
}
```

## 隐式强制类型转换为布尔值

`undefined null false +0 -0 NaN ""`会被转化为false

# ==和===

> ① `字符串、数字和布尔型的比较都会转换为数字类型进行比较`
> ② `特殊的有null和undefined,他们去其它类型比较都为false`
> ③ 对象和其它类型比较,都会将对象先转化为`primitive`值然后进行比较

## 字符串和数字

`X==Y`
规范:
(1)如果Type(x)是数字,Type(y)是字符串,则返回`x==ToNumber(y)`的结果
(2)如果Type(x)是字符串,Type(y)是数字,则返回`ToNumber(x)==y`的结果
> `总而言之,==比较的是两个数字。`

## 其它类型和布尔类型之间的相等比较

```js
var a = '22';
var b = true;
a == b // false
var a = '22';
var b = false;
a == b // false
```
'22'是一个真值,为什么==的结果不是true呢?很容易掉坑里面。需要重视。
规范:
(1)如果Type(x)是布尔值,则返回`ToNumber(x)==y`的结果
(2)如果Type(y)是布尔值,则返回`x==ToNumber(y)`的结果

## null和undefined的比较

规范:
(1)如果x为`null`,y为`undefined`,结果为`true`
(2)如果x为`undefined`,y为`null`,结果为`true`
> `只要==一边出现null或者undefined,另一边是其它类型,结果都为false`
```js
var a = null;
var b;
a==b //true
a==null//true
b==null // true
a == false // false
b == false // false
a == '' //false
b == '' //false
a == 0 //false
b == 0 //false
```

## 对象和非对象之间比较

对象(对象|函数|数组)和标量基本类型(字符串|数字|布尔)之间的相等比较。
规范:
(1)如果`Type(x)`是字符串或者数字,`Type(y)`是对象,则返回`x == ToPrimitive()`的结果
(2)如果`Type(x)`是对象,`Type(y)`是字符串或者数字,则返回`Toprimitive() == y`的结果

javascript中的隐式类型转化的更多相关文章

  1. C++中的显式类型转化

    类型转化也许大家并不陌生,int i; float j; j = (float)i; i = (int)j; 像这样的显式转化其实很常见,强制类型转换可能会丢失部分数据,所以如果不加(int)做强制转 ...

  2. JavaScript中关于隐式转换的一些总结

    JavaScript运算符中的隐式转换规律:一.递增递减运算符(前置.后置)1.如果包含的是有效数字字符串或者是有效浮点数字符串,则会将字符串转换(Number())为数值,再进行加减操作,返回值的类 ...

  3. C#中的隐式类型var——详细示例解析

    从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,它的具体类型由编译器根据上下文推断而出. 下面就让我来总结下隐式类型的一些特点: 1.va ...

  4. MySQL系列:隐式类型转化可能带来的坑

    在开发规范中,我们往往会要求研发避免在where条件中出现隐式类型转换,这么要求大概有以下两方面的原因: 隐式类型转换可能导致索引失效: 隐式类型转换可能产生非预期的结果. 注:这里说的是隐式类型转换 ...

  5. 带你玩转JavaScript中的隐式强制类型转换

    正题开始前我想先抛出一个问题,==和===有什么区别?可能一般人会想,不就是后者除了比较值相等之外还会比较类型是否相等嘛,有什么好问的,谁不知道?!但是这样说还不够准确,两者的真正区别其实是==在比较 ...

  6. C#3.0新增功能03 隐式类型本地变量

    连载目录    [已更新最新开发文章,点击查看详细] 从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式“类型”var. 隐式类型本地变量为强类型,就像用户已经自行声明该类型,但 ...

  7. .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

    开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...

  8. C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法

    1.自动属性(Auto-Implemented Properties) //以前的写法 .net2.0 private string _userName; public string UserName ...

  9. Scala 中的隐式转换和隐式参数

    隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...

随机推荐

  1. Linux程序分析工具介绍—ldd,nm

    原文链接:http://blog.csdn.net/statdm/article/details/7759100 本文要介绍的ldd和nm是linux下,两个用来分析程序很实用的工具.ldd是用来分析 ...

  2. Linux多线程编程初探

    Linux线程介绍 进程与线程 典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情.有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程 ...

  3. 基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号

    每个CPU,都有它固定的ID号,ID号就是这个CPU唯一的标识,它可能隐含着CPU的生产日期,版本号,型号等等,那么,在我们的这款友善之臂Tiny4412的板子上,我的这个CPU的ID又是多少呢?从我 ...

  4. nfc近场通信

    NFC简介: Near Field Communication 近场通信,是一种数据传输技术. 与wifi.蓝牙.红外线等数据传输技术的一个主要差异就是有效距离一般不能超过4cm. NFC支持3种工作 ...

  5. mybatis源码之SimpleStatementHandler

    /** * @author Clinton Begin */ public class SimpleStatementHandler extends BaseStatementHandler { pu ...

  6. Treemap 有序的hashmap。用于排序

    TreeMap:有固定顺序的hashmap.在需要排序的Map时候才用TreeMap. Map.在数组中我们是通过数组下标来对其内容索引的,键值对. HashMap HashMap 用哈希码快速定位一 ...

  7. IOS中用到的缓存

    App已经与我们形影不离了,不管在地铁上.公交上还是在会场你总能看到很多人拿出来手机,刷一刷微博,看看新闻. 据不完全统计有近一半的用户在非Wifi环境打开App,以下为一个典型iPhone和Andr ...

  8. 和菜鸟一起学linux之常见错误的解决和常用命令

    1.错误提示:make:警告:检测到时钟错误.您的创建可能是不完整的. 解决方法:当前编译目录下,命令行输入:find . -type f -exec touch {} \; 2.SSH生成密钥:ss ...

  9. oo第二次博客作业

    多线程协同与同步控制总结 第五次作业-多线程电梯 本次作业是我第一次接触多线程,建立了请求模拟器.调度器和电梯运行三种线程.请求模拟器负责在输入后识别有效请求:调度器在扫描有效请求后将新的请求加入请求 ...

  10. HTML DOM - 导航

    HTML DOM 节点列表长度 length 属性定义节点列表中节点的数量. 您可以使用 length 属性来循环节点列表: x=document.getElementsByTagName(" ...