背景
某天看了一边文章,才发现还是需要记录一下的,我写的都比较零散,但是确实需要注意的,某一句可能就是你不知道的哦!
NaN永远不会等于另外的数据,包括它自己!
// 这是伪代码,可以直接放浏览器打印尝试
NaN == NaN // false
2 < NaN // false
2 >= NaN // false
undefined == null,它俩相等
undefined == null // true
Number方法对于undefined和Null的区别
Number(undefined) // NaN
Number(null) // 0
undefined和null没有toString方法
undefined.toString() // 报错
null.toString() // 报错
undefined和null不能用于比较逻辑,但是可以进行强制类型转换
undefined == 0 // false
null == 0 // false
let定义在全局上下文,不能使用window.xx访问,但是var定义的可以
var a = 1;
console.log(windw.a) // 1
let b = 2;
console.log(window.b) // 报错
let没有变量提升,所以需要使用之前先声明
console.log(s); // undefined
var s = 1;
console.log(ss); // 报错
let ss = 1;
let没有定义的时候,唯一可以使用的就是typeof这个api
注意:这种方式只能是放到js里面运行可以,但是直接在浏览器控制台运行,则会报错
console.log(typeof a) // undefined
在同一个作用域,如果let和var定义了同一个变量,则会报错
let s = 1
var s = 1 // 报错
var a = 1
let a = 1 // 报错
typeof判断类型
typeof '' // string
typeof null // object
typeof 1 // number
typeof function // funtion
// object
typeof undefined // undefined
typeof true // boolean
typeof NaN // number
typeof unknownVariable(未定义的变量) // undefined
Boolean方法进行转换
Boolean('') // false
Boolean(1) // true
Boolean(0) // false
Boolean('0') // false
Boolean(null) // false
Boolean({}) // true
Boolean(undefined) // false
Boolean(NaN) // false
Number转换
Number([]) // 0
Number({}) // NaN
Number([1]) // 1
Number([1, 'a']) // NaN
上面的原因是:复杂数据类型转换,先使用valueOf,如果是原始数据类型则停止,如果不是原始数据类型,则继续使用toString方法进行转换,可以参考:参考文档
[].valueOf() // []
[].toString() // ''
Number('') == Number([]) // true
[1].valueOf() // [1]
[1].toString() // '1'
Number('1') == Number([1]) // true
[1, 'a'].valueOf() // [1, 'a']
[1, 'a'].toString() // '1,a'
Number('1,a') // NaN