JavaScript对类型错误出奇的宽容

3 + true;        // 4
null + 3; // 3

运算符+(加号)的重载

运算符+既重载了数字相加,又重载了字符串连接操作。具体是数字相加还是字符串连接,取决于其参数的类型

2 + 3;                   // 5
'hello' + 'world' // 'hello world' "2" + 3; // "23"
1 + 2 + "3" // "33"
1 + "2" + 3 // "123"
"abc" + true // "abctrue"

对象转换为基本数据类型

对象可以被强制转换为基本数据类型,最常见的用法是转换为字符串。

"the Math object: " + Math;                 // "the Math object: [object Math]"
'the JSON object' + JSON; // "the JSON object[object JSON]"

对象通过隐式地调用其自身的toString方法转换为字符串。对象也可以通过其valueOf方法转换为数字。

"J" + { toString: function() { return "S" } };          // "JS"
2 + { valueOf: function() { return 3 } }; // 5

当一个对象同时包含toString和valueOf方法时,JS通过盲目地选择valueOf方法而不是toString方法来解决这种含糊的情况

var objTo = {
toString: function() {
return "[object objTo]";
},
valueOf: function() {
return 17;
}
};
"3" + objTo, 3 + objTo, 'object: ' + objTo // 317, 20, object: 17

一般对象的字符串转换比数字的强制转换更常见、更有用。因此最好避免使用valueOf方法

特殊浮点值NaN

NaN不等于其自身。

一些操作会导致NaN值的产生。这里有些例子:

Math.sqrt(-2)
Math.log(-1)
0/0
parseFloat('foo')

标准的库函数isNaN也不是很可靠,因为它带有自己的隐式强制转换,在测试其参数之前,会将参数转换为数字(isNaN函数的一个更精确的名称可能是coercesToNaN)。如果你已经知道一个值是数字,你可以使用isNaN函数测试它是否是NaN。

isNaN(NaN)             // true
isNaN(5) // false
isNaN(true) // false
isNaN('') // false
isNaN(null) // false
isNaN({ valueOf: function() { return 9 } }) // false isNaN('foo') // true
isNaN(undefined) // true

因为true、''、null及返回数字的对象,能强制转换成数字,所以测试为false

真值运算

if, ||及&&等运算符逻辑上需要布尔值作为操作参数,但实际上可以接受任何值。JS按照简单的隐式强制转换规则将值解释为布尔值。对于字符串和数字以外的其他对象,真值运算不会隐式调用任何强制转换方法。JS中有7个假值:false、0、-0、""、NaN、null、undefined。由于数字和字符串可能为假值,因此使用真值运算检查函数参数或者对象属性是否定义不是绝对安全的。例如,一个带有默认值的接受可选参数的函数:

var point = function(x, y) {
if(!x) {
x = 320;
}
if(!y) {
y = 240;
}
return { x: x, y: y };
}

检查参数是否为undefined更为严格的方式是使用typeof

var point = function(x, y) {
if(typeof x === 'undefined') {
x = 320;
}
if(typeof y === 'undefined') {
y = 240;
}
return { x: x, y: y };
}

JS当心隐式的强制转换的更多相关文章

  1. [Effective JavaScript笔记]第3条:当心隐式的强制转换

    js对类型错误出奇的宽容 3+true;  //4 3*””;  //0 3+[]; //3 3+[3]; //33 以上表达式在许多语言早就变红了.而js不但不报错还给你个结果. 极少情况会产生即时 ...

  2. js数据类型隐式转换问题

    js数据类型隐式转换 ![] == false //true 空数组和基本类型转换,会先[].toString() 再继续比较 ![] == [] //true ![] //false [] == [ ...

  3. JS的隐式转换 从 [] ==false 说起

    前言 最近和大创扯淡时说到了[] == false,从结果上来看我俩都答错了,从气势上来说我俩的歪理都能出书了(恩,程序猿的骄傲),但是这其实背后隐藏了一潭很深的水,对,很深... 隐式类型转换 JS ...

  4. js 的隐式转换与显式转换

    隐式转换   1.undefined与null相等,但不恒等(===) 2.一个是number一个是string时,会尝试将string转换为number 3.隐式转换将boolean转换为numbe ...

  5. C++的隐式类型转换与转换操作符

    C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...

  6. python+selenium基础篇,三种等待方式,显示、隐式、强制等待

    1.显示等待: from selenium import webdriver from time import sleep from selenium.webdriver.support.ui imp ...

  7. C#高级编程9-第7章 运算符和类型强制转换

    运算符和类型强制转换 1.运算符 运算符的简化操作 条件运算符: if-else的简化操作,也称三元运算符.如果条件为真,返回一个值,为假返回另外一个值. condition?true_value:f ...

  8. JavaScript学习笔记——数据类型强制转换和隐式转换

    javascript数据类型强制转换 一.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 B.如果是数字,转换成为本身.将无意义的后导 ...

  9. javascript笔记整理(数据类型强制/隐式转换 )

    A.数据类型强制转换 1.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 var a=false;alert(Number(a)); ...

随机推荐

  1. 25、ASP.NET MVC入门到精通——Spring.net-业务层仓储

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一节,我们已经把项目框架的雏形搭建好了,那么现在我来开始业务实现,在业务实现的过程当中,不断的来完善我们现有的框架. 1.假设我们来做一个 ...

  2. ASP.NET MVC搭建项目后台UI框架—6、客户管理(添加、修改、查询、分页)

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  3. VB6.0 和VB.NET 函数对比

    VB6.0和VB.Net的对照表 VB6.0 VB.NET AddItem Object名.AddItem Object名.Items.Add ListBox1.Items.Add ComboBox1 ...

  4. Python学习基础知识概要

    1.输入输出 输出实例   1 2 print 'hello','world' hello world 输入实例   1 2 3 4 5 name = raw_input(); print " ...

  5. 基于WCF MSMQ 的企业应用解决方案

    最近研究了一下基于MSMQ的WCF应用,从书上.网上查了很多资料,但始终没能彻底理解WCF-MSMQ的工作原理,也没能得到一个合理的应用解决方案.索性还是自己做个实验,探索一下吧.经过反复试验,颇有收 ...

  6. angular源码分析:angular中脏活累活承担者之$parse

    我们在上一期中讲 $rootscope时,看到$rootscope是依赖$prase,其实不止是$rootscope,翻看angular的源码随便翻翻就可以发现很多地方是依赖于$parse的.而$pa ...

  7. JavaScript学习笔记7 之DOM文档对象模型

    一.什么是DOMDocument Object Model 文档 -------对象 ----模型-------缩写DOM DOM是针对HTML和XML文档的一个API(应用程序编程接口).DOM描绘 ...

  8. 未能加载包“Microsoft SQL Server Data Tools”

    直接在vs2013里的App_Data目录创建数据库,在服务器资源管理器中查看时报错: 未能加载包“Microsoft SQL Server Data Tools” 英文: The 'Microsof ...

  9. Html5的一些基础知识

    <!DOCTYPE html><html><head><meta charset="utf-8" /><title>页面 ...

  10. html之file标签 --- 图片上传前预览 -- FileReader

    记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<input type="file"/>标签一直实现不了,最后舍弃了这个标签,使用了 ...