JavaScript对类型错误出奇的宽容

  1. 3 + true; // 4
  2. null + 3; // 3

运算符+(加号)的重载

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

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

对象转换为基本数据类型

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

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

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

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

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

  1. var objTo = {
  2. toString: function() {
  3. return "[object objTo]";
  4. },
  5. valueOf: function() {
  6. return 17;
  7. }
  8. };
  9. "3" + objTo, 3 + objTo, 'object: ' + objTo // 317, 20, object: 17

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

特殊浮点值NaN

NaN不等于其自身。

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

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

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

  1. isNaN(NaN) // true
  2. isNaN(5) // false
  3. isNaN(true) // false
  4. isNaN('') // false
  5. isNaN(null) // false
  6. isNaN({ valueOf: function() { return 9 } }) // false
  7. isNaN('foo') // true
  8. isNaN(undefined) // true

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

真值运算

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

  1. var point = function(x, y) {
  2. if(!x) {
  3. x = 320;
  4. }
  5. if(!y) {
  6. y = 240;
  7. }
  8. return { x: x, y: y };
  9. }

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

  1. var point = function(x, y) {
  2. if(typeof x === 'undefined') {
  3. x = 320;
  4. }
  5. if(typeof y === 'undefined') {
  6. y = 240;
  7. }
  8. return { x: x, y: y };
  9. }

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. 转移博客到xinqiyang.freeflare.com了,这里会继续更新.

    hi.... 欢迎大家来到这里,这里将转移到github page搭建的博客 http://xinqiyang.freeflare.com 了,现在习惯于实用markdown来写东西了,这样可以脱离浏 ...

  2. js中兼容性问题的封装(能力检测)

    所谓兼容性,就是看浏览器是否支持当前对象的属性或是方法,先通过获得页面文本内容的方式来了解兼容性,并封装函数或对象以解决此类问题. 获得页面文本内容的方式:innnerText 或textConten ...

  3. AMD and CMD are dead之KMD.js之懒

    缘由 "懒"在软件设计中,有着重大的意义.最常见的两种"懒",便是: 懒得计算 懒得加载 "懒得计算"常见于服务器端: 比如Multipla ...

  4. SVG简介

    最近遇到SVG这个名词,于是查阅资料,做个笔记. 前言 图片的数字化.将图片存储为数据有两种方案. 位图.也被称为光栅图.即是以自然的光学的眼光将图片看成在平面上密集排布的点的集合.每个点发出的光有独 ...

  5. CRM基于.NET的增删改查

    一.准备工作: 1.添加 microsoft.crm.sdk.proxy.dll和microsoft.xrm.sdk.dll 引用到项目中!并引用以下using! using Microsoft.Xr ...

  6. SharePoint 2016 图文安装教程

    前言 SharePoint 2016如约而至,之前也装过预览版,但是这次是正式版,还是分享一个完整的安装过程给大家,希望能给有需要的人有所帮助. 1.首先安装操作系统,我这里是Windows Serv ...

  7. iOS之两个ImageView实现图片滚动

    原创作者:codingZero 导语 在不少项目中,都会有图片轮播这个功能,现在网上关于图片轮播的框架层出不穷,千奇百怪,笔者根据自己的思路,用两个imageView也实现了图片轮播,这里说说笔者的主 ...

  8. Android log 管理工具

    1.logger 项目地址: https://github.com/orhanobut/logger 2.KLog 项目地址:https://github.com/ZhaoKaiQiang/KLog ...

  9. Objective-C内存管理之-引用计数

    本文会继续深入学习OC内存管理,内容主要参考iOS高级编程,Objective-C基础教程,疯狂iOS讲义,是我学习内存管理的笔记 内存管理 1 内存管理的基本概念 1.1 Objective-C中的 ...

  10. js获取浏览器内核、类型、版本以及系统类型

    正则表达式: var rsys = /\b(windows|win32|macintosh|mac os x|adobeair|linux|unix)\b/; var rkn = /\b(opera| ...