类型及其转换

JavaScript 内置了7种类型:null, undefined , boolean, number, string, object以及 symbol(ES6).

除了 object 以外,这几种类型都可以归类为原始类型。

typeof 0              // number
typeof true          // boolean
typeof 'Hello'        // string
typeof Math          // object
typeof null          // object  !!
typeof Symbol('Hi')  // symbol (New ES6)
  • NullUndefined

Undefined 表示尚未定义。它被用作表示未初始化变量,未提供的函数参数,对象缺少的属性的默认值。当函数没有返回值时也会默认返回 undefined .

Null 则表示空值。它可以被赋值给一个变量来表示的“没有值”。

  • 隐式类型转换

让我们来看下面这个栗子:

var name = 'Joey';
if (name) {
console.log(name + " doesn't share food!")  // Joey doesn’t share food!
}

在这种情况下,字符串变量 name 会被转换为 true ,所以我们能够在命令行里输出这段话。那我们到底要如何确定这些真假值的转换呢?

Falsy类型的值是指在强制类型转换时会被转换为布尔 false 的值。

Falsy 类型值包括:"", 0, null, undefined, NaN, false.

除了 Falsy 类型值以外的都被称为 truthy 类型值,它们会被转换为 true.

Boolean(null)        // false
Boolean('hello')      // true 
Boolean('0')          // true  (string类型,并不是number类型)
Boolean(' ')          // true (包含空格符的string类型,并不是空字符串)
Boolean([])          // true  
Boolean(function(){}) // true 

没错。你可能注意到了。空的数组,对象和函数布尔值也会被转换为 true

  • String & Number 运算

你需要注意的第一件事是 + 操作符。这是一个棘手的操作符,因为它同时适用于数值运算和字符串连接。

但是,*/-操作符都是数字运算专用的。当这些运算符与字符串一起使用时,会强制转换字符串为数字类型的值。

1 + "2" = "12"
"" + 1 + 0 = "10"
"" - 1 + 0 = -1
"-9\n" + 5 = "-9\n5"
"-9\n" - 5 = -14
"2" * "3" = 6
4 + 5 + "px" = "9px"
"$" + 4 + 5 = "$45"
"4" - 2 = 2
"4px" - 2 = NaN
null + 1 = 1
undefined + 1 = NaN
  • =====

对此大多数人的理解肯定是 == 只比较值相等,而 === 在比较的同时还会检查类型。不过这种解释其实是错误的。

事实上,== 是比较强制类型转换之后的结果,而 === 则是直接比较。

2 == '2'            // True
2 === '2'          // False
undefined == null  // True
undefined === null  // False

强制类型转换有时候会造成一些混乱,我们来看下面这个栗子:

let a = '0';
console.log(Boolean(a)); // True
let b = false;
console.log(Boolean(b)); // False

好,根据以上结果,请告诉我下面这此比较的输出:

console.log(a == b); //(1)

上述代码事实上返回了 True,那么这是为什么呢?

JavaScript 的机制中,当你拿一个其它类型的值和 boolean 类型进行比较时,JavaScript 会将这个布尔值转换为 number 类型再进行比较。(2)

此时这个问题就变成了 numberstring 类型值之间的比较。根据我们之前所说的,JavaScript 会把 string 类型转换为 number 类型再比较两个数字。(3)

所以最后的表达式被转换为了 0 == 0,结果理所当然是 True.

'0' == false  //(1)
'0' == 0      //(2)
0  == 0      //(3)

如果你想全面理解这种比较是如何进行的,可以查阅ES5文档。

这里也有一个 JavaScript 当中各种类型值对比结果的参照表。

下面是一些特殊比较的示例:

false == ""  // true
false == []  // true
false == {}  // false
"" == 0      // true
"" == []    // true
"" == {}    // false
0 == []      // true
0 == {}      // false
0 == null    // false

原文链接:The Definitive JavaScript Handbook for a developer interview
作者:Gustavo Azevedo
译者:余博伦
原文转自 freeCodeCamp on medium 转载请注明出处。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值