null与undefined区别
从设计之初考虑
undefined:当一个变量声明未赋值,打印结果是undefined
null: 当你想声明一个对象却不确定时,可以var obj = null
//声明变量对象时{}与null区别
var obj1 = {}
var obj2 = null
if(obj1){
//这里代码会被执行
}
if(obj2){
//这里代码不会被执行
}
类型转换
string
隐式转换:+只要有一个是字符串类型,+就是拼接
显示转换:String()
number
隐式转换:*/
显示转换:Number()
boolean
隐式转换:直观上为空的都会转为false,0/""/null/undefined/nan,其他转为true
显示转换:Boolean()
==与===区别
==进行判断时,当两个运算元数据类型不同时,会把运算元转为number类型,再进行判断,null或者对象类型除外
情况一:null==undefined true
情况二:NaN == NaN false
情况三: Number类型 == String类型 String类型ToNumber()
情况四: Boolean类型也会ToNumber()
情况五:Number || String == Object || null 会把复杂类型转为原始类型进行 ToPrimitive(obj/null)
// 这里null虽然经过了ToPrimitive(),但是被函数直接返回,没有转化,所以false
console.log(123 == null) // false
//obj对象进行==判断时,会调用ToPrimitive()转原始对象,具体函数内部怎么实现,我们不深究,但我们可以重写
var obj = {
name : "zhao",
[Symbol.toprimitive](){
return 123
}
}
console.log(123 == obj) // true
===严格比较不会进行类型转换
代码块
在js中可以用花括号表示代码块,比如:if判断for循环...我们可以通过分支语句与循环控制代码块执行
{
var name = "zhao"
var age = 18
}
注意:对象不是代码块,
逻辑运算符
逻辑或 a || b 只要一个为true,就是true
本质:短路或 res = a || b || c abc均为运算元 从左开始,转为Boolean类型,找到true就把原数据返回,不会继续向下判断,如果所有运算元都是false就把最后一项运算元原数据返回
function getMessageLength(message) {
var mes = message || "默认值" // 开发中最常用
return mes.length
}
逻辑与 a && b 只要有一个false就是false
本质: 短路与 res = a && b && c 从左开始,转为Boolean类型,找到false就把改运算元原数据返回,不会继续向下执行,如果全是true,就把最后一个运算元元数据返回
var obj = {
name : "zhao",
friend : {
name: "li",
eating: function() {
console.log("eating")
}
}
}
obj && obj.friend && obj.friend.eating && obj.friend.eating() // 这样更安全
逻辑非 !
转为Boolean类型 var message = "hello world" !!message