JS当心隐式的强制转换
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当心隐式的强制转换的更多相关文章
- [Effective JavaScript笔记]第3条:当心隐式的强制转换
js对类型错误出奇的宽容 3+true; //4 3*””; //0 3+[]; //3 3+[3]; //33 以上表达式在许多语言早就变红了.而js不但不报错还给你个结果. 极少情况会产生即时 ...
- js数据类型隐式转换问题
js数据类型隐式转换 ![] == false //true 空数组和基本类型转换,会先[].toString() 再继续比较 ![] == [] //true ![] //false [] == [ ...
- JS的隐式转换 从 [] ==false 说起
前言 最近和大创扯淡时说到了[] == false,从结果上来看我俩都答错了,从气势上来说我俩的歪理都能出书了(恩,程序猿的骄傲),但是这其实背后隐藏了一潭很深的水,对,很深... 隐式类型转换 JS ...
- js 的隐式转换与显式转换
隐式转换 1.undefined与null相等,但不恒等(===) 2.一个是number一个是string时,会尝试将string转换为number 3.隐式转换将boolean转换为numbe ...
- C++的隐式类型转换与转换操作符
C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...
- python+selenium基础篇,三种等待方式,显示、隐式、强制等待
1.显示等待: from selenium import webdriver from time import sleep from selenium.webdriver.support.ui imp ...
- C#高级编程9-第7章 运算符和类型强制转换
运算符和类型强制转换 1.运算符 运算符的简化操作 条件运算符: if-else的简化操作,也称三元运算符.如果条件为真,返回一个值,为假返回另外一个值. condition?true_value:f ...
- JavaScript学习笔记——数据类型强制转换和隐式转换
javascript数据类型强制转换 一.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 B.如果是数字,转换成为本身.将无意义的后导 ...
- javascript笔记整理(数据类型强制/隐式转换 )
A.数据类型强制转换 1.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 var a=false;alert(Number(a)); ...
随机推荐
- JavaScript利用装饰模拟实现私有状态
在经典的面向对象编程中,经常需要将对象的某个状态封装或隐藏在对象内,只有通过对象的一幅幅和能访问这些状态,对外只暴露一些重要的状态变量可以直接读写. 我们可以通过将变量(或参数)装饰在一个构造函数内来 ...
- MongoDB基础入门002--基本操作,增删改查
一.这里只是演示最基本的操作,更多的信息可以去官网.https://docs.mongodb.com/manual 打开一个cmd,输入mongo命令打开shell,其实这个shell就是mongod ...
- AMD and CMD are dead之KMD规范
What's KMD? 乱世出英雄,KMD名字的由来充满了杀气. Kill AMD and CMD KMD为替代混乱的AMD和CMD世界而生,一统天下.或者让这个混乱的世界更加混乱,导致: KMD A ...
- css水平垂直居中(绝对定位居中)
使用绝对定位有个限制就是父集必须设置一个固定的高度. 首先HTML <div id="box"> <div class="child"> ...
- Linux安全基础:shell及一些基础命令
1.什么是shell?Shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的是Bash. 2.shell的分类(1)bash bash shell 是 Bourn ...
- yum使用点滴
yum下载依赖rpm包 先安装一个yum-downloadonly 1 yum install yum-downloadonly完成安装后,yum –help在最后就提示两个命令参数,分别是: Plu ...
- Android开发学习——ListView+BaseAdapter的使用
ListView 就是用来显示一行一行的条目的MVC结构 * M:model模型层,要显示的数据 ----people集合 * V:view视图层,用户看到的界面 ...
- 使用AIDL调用远程服务设置系统时间
在实际工作中,经常遇到客户需要用代码设置系统时间的需求,但是Android非系统应用是无法设置系统时间的.于是,我设计了一个使用系统签名的时间设置服务,客户通过bind调用服务里的方法就能达到设置时间 ...
- MVC学习系列3--怎么从控制器向视图传递数据
在MVC中,从控制器到视图,传递数据,可以使用 ViewData 和 ViewBag:同样从视图到控制器,传递数据,可以使用Post,QueryString,或者隐藏域:最后从控制器到控制器,传递数据 ...
- linux 学习随笔-shell基础知识
1:用户的shell历史命令保存在home/username/.bash_history中 #!! 执行用户的上一条命令 #!pw 执行命令历史中最近一次以pw开头的命令 2:'*'来匹配零或多个 ...