八种数据类型
- string
- number
- boolean
- null
- undefined
- symbol
- object
- 增加bigInt 用来解决number类型无法表示大于
2^53-1
和 小于-(2^53-1)
的数
类型判断
typeof
大部分情况当做运算符使用 typeof 1
,还可以当做函数使用,用的很少,如 typeof(1)
。
由于JS本身的错误, typeof
判断并不能完全得到上述的7种类型值。
typeof null; // object 得到的并不是null
typeof undefined // undefined
但是本身在书写代码还是提供了很多便利性,比如判断函数就可以 typeof alert
。
Object.prototype.toString
利用这个原型方法可以得到准确的类型。
Object.prototype.toString.call([]); // [object Array]
类型转换
字符串转换
比如 alert
会将传入的值转为 string
类型。
alert(false) // 弹框打印的是字符串 false
数字转换
在运算和表达式中,会自动进行 number
类型转换。
值 | 变成…… |
---|---|
undefined |
NaN |
null |
0 |
true 和 false |
1 and 0 |
string |
数字字符串如 '123' 转为 123 ,如果前后有空格,忽略。如果有其他非数字字符串或数字字符串中间有空格,转换失败变为 NaN 。 |
当一方有字符串,除了+运算符,会将所有值变为字符串,其他运算符都是转为number
布尔类型转换
除了 0
''
null
undefined
NaN
转换为 false
,其他都是 true
。
对象转换(难点)
对象转换只能转换为基本类型,要么是数字,要么是字符串,具体根据调用场景决定是数字还是字符串。
- alert调用,转换为字符串
+obj
obj1 + obj2
调用,转换为数字。
规则:
- 现代javascript,优先调用对象的
[Symbol.toPrimitive]
方法。 - 根据调用场景(ecma说法叫hint,翻译为暗示),如果 hint 是string,调用对象的
toString
,valueOf
。 - 根据场景调用,如果 hint 是number** ,**调用对象的
valueOf
,toString
。
验证规则调用顺序的例子
var a = {}
a + 1; // hint暗示number。
// 优先调用valueOf,默认返回对象本身{},无法运算。
// 因此去调toString,默认返回[object Object],字符串。
// 转变为 '[object Object]' + 1
// 优先调用valueOf的验证
var a = {
valueOf: () => 1
}
a + 1; // 2
// 如果有[Symbol.toPrimitive],则优先调用,验证:
var a = {
[Symbol.toPrimitive]: () => 2,
valueOf: () => 1
}
a + 1; // 3
题目
出错的题
" -9 " + 5 // 不是'-95',而是' -9 5'
" \t \n" - 2 // 不是NaN,而是-2。 因为\t\n是实体空字符。
一道有趣的面试题
利用对象的调用,使得每次调用对象的属性值增加1,并返回该值。
// a声明为什么,使得 a == 1 && a == 2 && a == 3 为true
var a = {
value: 1,
// 如果这里用箭头函数了,注意箭头函数绑定的this是window,this.value = undefined 自增变成NaN
[Symbol.toPrimitive]() {return this.value++}
}
a == 1 && a == 2 && a == 3 // true