八种数据类型
- 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 得到的并不是nulltypeof 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调用,转换为字符串
+objobj1 + 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 为truevar a = {value: 1,// 如果这里用箭头函数了,注意箭头函数绑定的this是window,this.value = undefined 自增变成NaN[Symbol.toPrimitive]() {return this.value++}}a == 1 && a == 2 && a == 3 // true
