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. 配置hadoop-1.2.1 eclipse开发环境

    写这篇文章的目的是记录解决配置过程中的问题 首先我们先看下这篇博文 配置hadoop-1.2.1 eclipse开发环境 但是在[修改 Hadoop 源码]这里,作者发布的 hadoop-core-1 ...

  2. Oracle Applications DBA 基础(一)

    1.引子 2014年9月13日 20:33 <oracle Applications DBA 基础>介绍Oracle Applications R12的系统架构, 数据库后台及应用系统的基 ...

  3. Java进阶(十三)servlet监听器

    servlet监听器 Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当 增加一个HttpSession时 ...

  4. 一张图了解cocos2d坐标系

    一张图了解cocos2d坐标系 平面直角坐标系

  5. iOS 10正式发布:十大新功能,更注重人性化

    6月14日凌晨消息,苹果公司举行2016年WWDC全球开发者大会,介绍了watch OS.tv OS.OS X以及iOS 10系统的新特性. 据苹果介绍,iOS 10在锁屏.Siri.地图等十个各方面 ...

  6. Linux - gcc 的简易用法 (编译、参数与链结)

    # 仅将原始码编译成为目标档,并不制作连结等功能: [root@www ~]# gcc -c hello.c # 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档. # 在 ...

  7. DB Query Analyzer 6.02 is released, 71 articles concerned have been published

    DB Query Analyzer is presented by Master Genfeng, Ma from Chinese Mainland. It has English version n ...

  8. linux上部署rmi+memcache服务

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/50020437 最近在学习linux上搭建Rmi+Memca ...

  9. web报表工具FineReport的JS编辑框和URL地址栏语法简介

    JS编辑框: 1.FineReport的js. 作为一款BS产品,browser端的JavaScript是必不可少的. FineReport中的js是已经调用了finereport.js的. 大家知道 ...

  10. 关于Block的使用和5点注意事项

    一.概念 首先需要了解的是Block是一个代码块,是一个变量的形式存在的. 二.构成了解 我们需要在函数中声明block,因为是变量的形式,而且存在静态变量形式 类型1:  NSString* (^b ...