===
何时使用 ==
// 值类型 let a = 100 let b = a a = 200 console.log(b) // 100 // 引用类型 let a = { age : 20 } let b = a b.age = 21 console.log(a.age) // 21
值类型在栈中存储:
引用类型在堆中存储:(为了节省内存,复用数据)
let a // undefined const s = 'abc' const n = 1000 const b = true const s = Symbol('s')
cosnt obj = { x : 100 } const arr = [1, 2, 3] const n = null //特殊引用类型,指针指向空地址 function fn(){} //特殊引用类型,不用于存储数据,没有拷贝,复制的问题
let a typeof a// undefined const s = 'abc' typeof s // string const n = 1000 typeof n // number const b = true typeof b // boolean const s = Symbol('s') typeof s // symbol
typeof console.log // function typeof function(){} // function
typeof null // object typeof [1,2] // object typeof {x:100} // object
// 前提:对象内的属性,只能是值类型,function,Array // 普通Object(非Map,Set等其他特殊对象) // for-in 无法遍历Map,Set等 // JSON.stringfy会丢失Map,Set内部信息,只返回一个空{} function deepClone(obj = {}){ if(typeof obj !== 'object' || obj == null){ return obj // 如果是值类型,function,null直接返回 } let result if(obj instanceof Array) result = [] } else { result = {} } for(let key in obj){ // for-of 循环只能遍历iterable if(obj.hasOwnProperty(key)){ // 保证key不是当前对象原型链上的属性 result[key] = deepClone(obj[key]) // 递归调用 } } return result }
可能发生类型转换的场景:
const a = 100 + 10 // 110 const b = 100 + '10' // '10010' const c = true + '10' // 'true10'
使用parseInt or ParseFloat可以把变量转为相应的数字
100 == '100' // true 0 == '' // true 0 == false // true null == undefined // true
==
会尽量转换两侧的操作数,让他们转换为最可能相等的类型,从而趋向于相等
除了判断一个变量 == null
之外,其余一律用 ===
;
obj == null
等同于 obj === null || obj === undefined
falsely
变量:!!a === false
!!0 === false !!NaN === false !!'' === false !!null === false !!undefined === false !!false === false
truely
变量:!!a === true
falsly
变量外,都是truely
变量if(变量){ // 当变量是truely变量时,执行 }else{ // 当变量是falsly变量时,执行 }
// 与 运算,如果有一个为false,则返回它; // 如果没有一个false,则返回第一个为true的 0 && 10 => 0 10 && 0 => 10 // 或 运算,只返回(或执行)可以转化为true的表达式,变量,函数,对象等 0 || 10 => 10 10 || 0 => 10