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学习笔记 --服务器优化

    Linux服务器优化 序言: 服务器操作建议 1.严格按照目录规范操作服务器 2.远程服务器不允许关机 3.不要在服务器访问高峰运行高负载命令 4.远程配置防火墙时,不要把自己踢出服务器 一.禁用不必 ...

  2. Unix/Linux中的grep命令(转)

    本文转载自:如何使用Unix/Linux grep命令——磨刀不误砍柴工系列.该博文条理很清晰. grep简介 grep在一个或多个文件中查找与模式字符串(pattern)匹配的行,并将搜索的结果打印 ...

  3. 打造你的开发神器——介绍Android Studio上的几个插件

    这个月因为各种事情在忙,包括赶项目,回老家,还有准备旅游的事,所以应该写不了四篇博客了.今天介绍一下关于Android Studio 的几个好用的插件,都是我在用的,它们或能帮你节省时间,或者让你心情 ...

  4. "《算法导论》之‘树’":二叉查找树

    树的介绍部分摘取自博文二叉查找树(一).二叉查找树(二).二叉查找树. 1. 树的介绍 1.1 树的定义 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 把它叫做“ ...

  5. android 开发从入门到精通

    Android-Tips This is an awesome list of tips for android. If you are a beginner, this list will be t ...

  6. Gridview的item含有checkbox,setOnItemClickListener方法失效的问题

    在开发中我们常常遇到一些莫名奇妙的问题,就比如Gridview的item含有checkbox,setOnItemClickListener方法失效的问题. 刚开始网上搜了一下,如http://my.o ...

  7. 用xml来编写动画

    我们可以使用代码来编写所有的动画功能,这也是最常用的一种做法.不过,过去的补间动画除了使用代码编写之外也是可以使用XML编写的,因此属性动画也提供了这一功能,即通过XML来完成和代码一样的属性动画功能 ...

  8. 【49】java内部类剖析

    什么是内部类: 定义在其他类(outer class)中的类被称作内部类.内部类可以有访问修饰服,甚至可以被标记为 abstract 或 final. 内部类与外部类实例有特殊的关系,这种关系允许内部 ...

  9. Linux进程快照相关知识

    查寻内核版本 uname  -a    //  uname  -r 进程快照 ps       report a snapshot of the current processes USER     ...

  10. 恶补web之六:javascript知识(2)

    若要向html添加新元素,必须首先创建该元素,然后向一个已存在的元素追加该元素 <div id="div1"> <p id="p1">这 ...