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)
Null
与Undefined
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)
此时这个问题就变成了 number
和 string
类型值之间的比较。根据我们之前所说的,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 转载请注明出处。