javascript数据类型:
使用typeof可以返回的数据类型有六种
"number" , "string" , "boolean" , "object" , "function", "symbol" 和 "undefined"
注:typeof在检测let定义的变量时如果当前状态还未定义变量会报错,不再可靠
number常见的类型包括:
Infinity 表示无穷大特殊值
NaN 特殊的非数字值
Number.MAX_VALUE 可表示的最大数字
Number.MIN_VALUE 可表示的最小数字(与零最接近)
Number.NaN 特殊的非数字值
Number.POSITIVE_INFINITY 表示正无穷大的特殊值
Number.NEGATIVE_INFINITY 表 示负无穷大的特殊值
object类型会包括对象、数组和Null。
常见的全局对象有:JSON、Error、RegExp、Date、Math、Number、Boolean、String、Array、Function、Object、global(windows)
es6中:Proxy,Promise, ArrayBuffer, DataView, Reflect等等
undefined类型包括未定义的变量和undefined
一、相加符号下的转换
1.与字符串相加
在字符串与其他类型数据相加时,会产生相应的转换。
与数字、布尔,调用自身的toString()方法,产生字符串。:
console.log("hello" + 1) // "hello1"
console.log("hello" + true) // "hellotrue"
console.log('hello' + {})// "hello[object Object]"
console.log('hello' + Math)// "hello[object Math]",全局对象中JSON,Math,window,Reflect
console.log('hello' + Number)// "hellofunction Number() { [native code] }",Promise返回的是具体代码
console.log('hello' + null)// "hellonull"
console.log('hello' + undefined)// "helloundefined"
console.log('hello'+ NaN)// "helloNaN"
console.log('hello'+ Infinity)// "helloInfinity"
字符型:
console.log(1+123)// 124
console.log(1+'123') // "1123"
console.log(1+ null) // 1
console.log(1+ undefined)// NaN
console.log(1+ NaN) // NaN
console.log(1+ Infinity) // Infinity
console.log(NaN + Infinity)// NaN
console.log(NaN + NaN)// NaN
console.log(Infinity + Infinity)// Infinity
console.log(1+ true) // 2
console.log(1+ false) // 1
console.log(1+ function(){}) // "1function (){}"
console.log(1+ []) // "1"
console.log(1+ [1]) // "11"
console.log(1+ {}) // "1[object Object]"
console.log(1+ Math) // 1[object Math]
console.log([]+[]) // ""
console.log([]+[1]) // "1"
console.log([]+null) // "null"
console.log([] + undefined) // "undefined"
console.log([] + {})// "[object Object]"
console.log([] + true)// "true"
console.log({} + true)// "[object Object]true"
console.log({} + null)// "[object Object]null"
console.log(null + null)// 0
console.log(null + undefined)// NaN
console.log(undefined + undefined)// NaN
console.log(Infinity + null)// Infinity
console.log(Infinity + undefined)// NaN
console.log(NaN + undefined)// NaN
console.log(NaN + null)// NaN
Number(null)// 0
Number(undefined)// NaN
Number('')// 0
var a={valueOf: function(){console.log('toValue');return 1}, toString: function(){console.log('toString');return '0'}}
console.log(a+1)// toValue 2
console.log(a+'1')// toValue "11"
String(a)// toString "0"
Number(a)// toValue 1
String(null)// "null"
+a// toValue 1
console.log(+{})// NaN
Number({})// NaN
console.log(+ new Date())// 1478397365907
Number(new Date())// 1478397717708
console.log(+[])// 0
Number([])// 0
Number([1])// 1
Number([1, 2])// NaN
(new Date()).toValue()// Uncaught TypeError:
-
console.log([] - [])// 0
console.log('1' - [])// 1
console.log(a-'1')// toValue 0
'' * 1// 0
后缀运算符
var a = '22'
a++ // 23
a++ // 24
var a={valueOf: function(){console.log('toValue');return 1}, toString: function(){console.log('toString');return '0'}}
console.log(a++);// toValue 1
console.log(a) // 2
typeof a // "number"
按位非
a = '3';
console.log(~~a)// 3
a={a:1}
console.log(~~a)// 0
~~null// 0
~~undefined// 0
~~NaN // 0
逻辑非
a = {}
console.log(!a)// false
var a={valueOf: function(){console.log('toValue');return null}, toString: function(){console.log('toString');return '0'}}
!a // false
~~a// toValue 0
!false // true
!''// true
!null // true
!undefined// true
!0 // true
乘法
var a = '2';
console.log(a*3)// 6
var a={}
console.log(a*3)// NaN
var a= ''
console.log(a*3)// 0
除法
若两个操作数之一为NaN,结果为NaN。
假如两个操作数的正负号相同,结果就是正的,如果不同就是负的。
无穷大被零乘结果是NaN。
无穷大被无穷大除结果是NaN。
无穷大被零除结果是无穷大。符号按照前面说过的规则决定。
无穷大被非零有穷的值除结果是有正负号的无穷大。符号按照前面说过的规则决定。
有穷的非零值被无穷大除结果是零。符号按照前面说过的规则决定。
零被零除结果是NaN;零被其它有穷数除结果是零,符号按照前面说过的规则决定。
有穷的非零值被零除结果是有正负号的无穷大。符号按照前面说过的规则决定。
其它情况下,既没有无穷大也没有NaN参与运算,结果计算出来后会按照IEEE 754 round-to-nearest模式取到最接近的能表示的数。如果值过大不能表示,则结果为相应的正负无穷大。如果值过小不能表示,则结果为相应的正负零。ECMAScript要求支持IEEE 754规定的渐进下溢。
console.log(Infinity * 0)// NaN
console.log(Infinity / Infinity)// NaN
console.log(Infinity / 0)// Infinity
console.log(0 / Infinity)// 0
console.log(Infinity / 11)// Infinity
console.log(77 / Infinity)// 0
console.log(0 / 0)// NaN
console.log(22 / 0)// Infinity
console.log(NaN / Infinity)// NaN
使用 % 运算符
左移<< - >> >>>
比较运算符
'1'<2// true
'2'<1 // false
'22'<100// true
'22' < '100'// false
2<NaN// false
{} < {}// false
{} > {}// false
NaN > 0// false
in instanceof?
==
console.log('' ==0)// true
console.log('' == false)// true
console.log(0 == false)// true
console.log(0 == null)// false
console.log(0 == undefined)// false
console.log(null == undefined)// true
var a={valueOf: function(){console.log('toValue');return 2}, toString: function(){console.log('toString');return '0'}}
a == 2//toValue true
new String("a") == new String("a")为false。
console.log({} == {})// false
console.log(NaN == NaN)// false