一般的底层语言在声明变量时会要求说明变量类型,JavaScript这里不用。弱类型语言;高级语言;创造之初留下的问题
栈:原始数据类型(Undefined、Null、Boolean、Number、String)
堆:引用数据类型(对象、数组和函数)
两种类型的区别是:存储位置不同。原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储。
引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;引用数据类型在
栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。栈区内存由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆区内存一般由程序员分配释放,若程序员不释放,程序结束时可能由垃圾回收机制回收。
// [] == [] // false
// [] < [] // false
// [] > [] // false
// [] <= [] // true
// [] >= [] // true
// Math.min() // Infinity
// Math.max() // -Infinity
// Math.min() > Math.max() // true
// NaN 是一个特殊值,它和自身不相等,是唯一一个非自反(自反,reflexive,即 x === x 不成立)的值。而 NaN != NaN为 true。
// typeof NaN // 'number'
// typeof null // 'object'
// Number({}) // NaN //转换规则
// Number([]) // 0 //转换规则
// Number('') // 0
// Number(true) // 1
// Number(false) // 0
// Number(null) // 0
// Number(undefined) // NaN //特殊情况
// Boolean([]) // true //地址转换
// Boolean({}) // true //地址转换
// true - [] // 1
// true + [] // 'true'
// [] + [] // ''
// {} + {} // NaN
// {} + [] // 0
// [] + {} // '[object Object]'
// {} toString 的结果为 “[object Object]”
在JavaScript中,这两行代码的结果确实会有所不同:
{} + [] 会返回 0,这是因为它被解释为一个空块({})后紧跟着一个数组([]),JavaScript 将其视为一个代码块,然后忽略了这个代码块并计算了 + [],这相当于将一个空数组转换成数字,结果为 0。[] + {} 会返回 '[object Object]',这是因为它被解释为一个空数组([])后紧跟着一个对象字面量({}),JavaScript 将其视为字符串拼接的操作,因此将空数组转换成空字符串,然后将对象字面量转换成字符串 '[object Object]',最终结果为 '[object Object]'。这些奇怪的结果是由于 JavaScript 的类型转换规则和运算符的行为导致的。
在 JavaScript 中,加法运算符 + 既可以用于数字相加,也可以用于字符串拼接,具体的行为取决于运算符的操作数.
// null == undefined // true
// null == 0 // false
// null == '' // false
// null == [] // false
// null == false // false
因此,根据操作数的不同,+ 运算符会有不同的行为。