那些出乎意料的类型转换

本文作者:IMWeb helinjiang 原文出处:IMWeb社区 未经同意,禁止转载

JavaScript是一门弱类型的语言,因此类型之间的转换会更频繁也更灵活。本文讨论了一些你倍感意外的类型转换,以及其他类型相关的话题。

1. "0" 转换成布尔值

var a = "0";

if (!a) {
    console.log("1");
} else {
    console.log("2");
}

上述结果是打印 1 还是 2 呢?答案是 2。因为 "0" 是一个非空字符串,所有的非空字符串转换成 boolean 值之后,都为 true,同理 "false" == true

0 == false, "0" == true,当我们这么单独拿出来时,你可能能够清楚这一点,但在实际中,我们可能会忽略了。比如下面的例子:

localStorage.setItem('testNum', 0);
var testNum = localStorage.getItem('testNum');
console.log(testNum, typeof testNum); // 0 string
if(!testNum){
    console.log('testNum == false'); // 永远不会进入
}

localStorage.setItem('testStr', '0');
var testStr = localStorage.getItem('testStr');
console.log(testStr, typeof testStr); // 0 string
if(!testStr){
    console.log('testStr == false'); // 永远不会进入
}

虽然你存储了一个 Number 数值在 testNum 中,但取出来之后却是 String 类型的值了,当你还未意识到这里的区别时,可能会很疑惑为什么你的 console.log 一直不输出。

2. 空字符串转换为数字和布尔值

字符串转换成数字和布尔值场景比较多,我们罗列一下:

字符串

转换成数字

转换成布尔值

""(空字符串)

0

false

"1.2"(非空,数字)

1.2

true

"one1"(非空,手字符非数字)

NaN

true

字符串转换成数字时,字符串中前后空格会被忽略,即 " " == 0" 1.2 " == 1.2" 1.2 0" != 1.2

空字符串转换成数字和布尔值,会相对特殊一些,需要关注。

3. 数组转换为字符串和数字

一般我们将数组转换成字符串的方式是使用 Array.prototype.join() 方法。我们说一下几个有趣的场景:

数组

转换成字符串

转换成数字

[](任意数组)

""

0

[9](1个数字元素)

"9"

9

['a','b'](其他数组)

"a,b"

NaN

然后这么一些判断就出现了: [] == 0[9] == 9,看起来好像没什么用,但可用来装x。

4. == 相等

== 操作符用于判断两边的值是否相等,JavaScript会将两边的值做一些类型转换。我们这里不讨论详细的转换规则,仅来看一个有趣的事:

已知"1" == 1,且" 1 " == 1,那么能够得出 "1" == " 1 "的结论吗?很遗憾,不能!如果真有这种需要,请使用 ===

5. null

if (typeof obj === 'object'){
    console.log(obj.xx);
}

你以为判断了 obj 为对象了就可以了么? 有没有考虑 obj=null 的场景?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小勇DW3

redis中各种数据类型的常用操作方法汇总

string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。 string类型是二进制安全的。意思是re...

1533
来自专栏数据结构与算法

BZOJ3585: mex(主席树)

Description   有一个长度为n的数组{a1,a2,...,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。 Input   第一行n,m...

4269
来自专栏尚国

PHP反序列化漏洞

这里你可以看到, 我代码里的类定义为: class F, 这个序列化就是 F, 我定义变量名字是filename, 它这里也是 filename, 我们可以修改...

1142
来自专栏Janti

干货——详解Java中的关键字

在平时编码中,我们可能只注意了这些static,final,volatile等关键字的使用,忽略了他们的细节,更深层次的意义。

1133
来自专栏GreenLeaves

C# this关键字(给底层类库扩展成员方法)

本文参考自唔愛吃蘋果的C#原始类型扩展方法—this参数修饰符,并在其基础上做了一些细节上的解释 1、this作为参数关键字的作用 使用this关键字,可以向t...

2397
来自专栏编程

Python面向对象3:静态/动态字段、静态/动态方法、单例模式

Python中的类成员,包括方法、字段、属性。 “字段”和“方法”都有“动态”和“静态”之分,即: 字段 - 静态字段:仅保存在类中 - 普通(动态)字段:保存...

2148
来自专栏游戏开发那些事

【小白学C#】浅谈.NET中的IL代码

  前几天群里有位水友提问:”C#中,当一个方法所传入的参数是一个静态字段的时候,程序是直接到静态字段拿数据还是从复制的函数栈中拿数据“。其实很明显,这和方法参...

2042
来自专栏iOS开发攻城狮的集散地

assign,retain,copy,strong

1765
来自专栏一枝花算不算浪漫

[Java面试二]Java基础知识精华部分.

4129
来自专栏java初学

java中 i = i++和 j = i++ 的区别

39510

扫码关注云+社区

领取腾讯云代金券