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. JavaScript进阶(六)用JavaScript读取和保存文件

    用JavaScript读取和保存文件 因为Google还不提供同步插件数据的功能,所以导入和导出插件配置就必须和文件打交道了.而出于安全原因,只有IE才提供访问文件的API:但随着HTML 5的到来, ...

  2. centos6.5 rsync+inotify实现服务器之间文件实时同步

    1. rsync的优点与不足 与传统的cp.tar备份方式相比,rsync具有安全性高.备份迅速.支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据 ...

  3. linux内核中的C语言常规算法(前提:你的编译器要支持typeof和type)

    学过C语言的伙伴都知道,曾经比较两个数,输出最大或最小的一个,或者是比较三个数,输出最大或者最小的那个,又或是两个数交换,又或是绝对值等等,其实这些算法在linux内核中通通都有实现,以下的代码是我从 ...

  4. 嵌入式C语言位运算之清位置位

    如题,在嵌入式开发中,掌握位运算是节省开发时间和提高开发效率的一种高效方式. 我们不得不去熟悉如何快速掌握位运算这种高效的技巧,接下来看看程序.. #include <stdio.h> # ...

  5. LESS学习笔记 —— 入门

    今天在网上完成了LESS的基础学习,下面是我的学习笔记.总共有三个文件:index.html.main.less.mian.css,其中 mian.css 是 main.less 经过Koala编译之 ...

  6. 总结一下 Spring的IOC、DI

    国庆节刚过,应一些朋友的提问,总结一下Spring中IOC也即DI的通俗理解. 网友wm5920解释: IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在xml文件 ...

  7. 如何用Dreamweaver编辑rails的html.erb文件

    默认情况下用dw是以普通的text文件打开html.erb文件,这多少让人有点不爽.其实dw打开erb文件也是相当的容易,下面就简单说下在mac os X下如何让dw支持erb文件: 首先找到dw的用 ...

  8. oo修仙之路

    写在前面: 之前听说过oo这门课的威力,计院全体修仙现场的图也被转了不知多少遍,然而自己不亲身经历就不知这门课的难度所在.每次debug时耳边总会想起三国杀里面周瑜的话"挣扎吧,在血和暗的深 ...

  9. C# /VB.NET 插入、修改、删除Word批注

    批注内容可以是对某段文字或内容的注释,也可以是对文段中心思想的概括提要,或者是对文章内容的评判.疑问,以及在阅读时给自己或他人起到提示作用.本篇文章中将介绍如何在C#中操作Word批注,主要包含以下要 ...

  10. angularjs学习笔记之一

    directive 通过AngularJS模块API中的.directive()方法,我们可以通过传入一个字符串和一个函数来 注册一个新指令.其中字符串是这个指令的名字,指令名应该是驼峰命名风格的,函 ...