博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS当心隐式的强制转换
阅读量:4456 次
发布时间:2019-06-08

本文共 2132 字,大约阅读时间需要 7 分钟。

JavaScript对类型错误出奇的宽容

3 + true;        // 4null + 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/0parseFloat('foo')

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

isNaN(NaN)             // trueisNaN(5)               // falseisNaN(true)            // falseisNaN('')              // falseisNaN(null)            // falseisNaN({ valueOf: function() { return 9 } })        // falseisNaN('foo')           // trueisNaN(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 };}

转载于:https://www.cnblogs.com/mackxu/p/typeof.html

你可能感兴趣的文章
UVA10791
查看>>
P2664 树上游戏
查看>>
jQuery 停止动画
查看>>
Sharepoint Solution Gallery Active Solution时激活按钮灰色不可用的解决方法
查看>>
MyBatis Generator去掉生成的注解
查看>>
教你50招提升ASP.NET性能(二十二):利用.NET 4.5异步结构
查看>>
lua连续随机数
查看>>
checkstyle使用介绍
查看>>
history.js 一个无刷新就可改变浏览器栏地址的插件(不依赖jquery)
查看>>
会了这十种Python优雅的写法,让你工作效率翻十倍,一人顶十人用!
查看>>
二维码图片生成
查看>>
在做操作系统实验的一些疑问
查看>>
Log4J日志配置详解
查看>>
NameNode 与 SecondaryNameNode 的工作机制
查看>>
Code obfuscation
查看>>
大厂资深面试官 带你破解Android高级面试
查看>>
node.js系列(实例):原生node.js实现接收前台post请求提交数据
查看>>
SignalR主动通知订阅者示例
查看>>
golang的表格驱动测试
查看>>
用python实现矩阵转置
查看>>