[JS] undefined、null、ReferenceError的区别、变量作用域问题
undefined、null、ReferenceError的區(qū)別
null表示"沒有對象",即該處不應(yīng)該有值。
典型用法是:
(1) 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對象。
(2) 作為對象原型鏈的終點。
undefined表示"缺少值",就是此處應(yīng)該有一個值,但是還沒有定義。
典型用法是:
(1)變量被聲明了,但沒有賦值時,就等于undefined。
(2) 調(diào)用函數(shù)時,應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于undefined。
(3)對象沒有賦值的屬性,該屬性的值為undefined。
(4)函數(shù)沒有返回值時,默認(rèn)返回undefined。
ReferenceError:
不定義就直接用,報錯!
接下來是示例演示:
var a = 10;
console.log(a);
console.log(b);
b沒有被定義時,輸出什么?
答案是,不定義時,會報錯。
那么定義之后不賦值會輸出什么呢?
let a = 10
let b
console.log(a)
console.log(b)
定義之后不賦值,輸出的是undefined
綜合完整代碼:
let a = 10
let b
let c = []
let d = ''
console.log('a=', a)
console.log('!a=', !a)
console.log('!!a=', !!a)
console.log('!!!a=', !!!a)
console.log('---')
console.log('b=', b)
console.log('!b=', !b)
console.log('---')
console.log('c=', c)
console.log('!c=', !c)
console.log('---')
console.log('d=', d)
console.log('!d=', !d)
console.log('---')
function fun(e) {console.log('e=', e)console.log('!e=', !e)
}
fun()
console.log('---')
var g = new Object()
console.log('g.data=', g.data)
console.log('!g.data=', !g.data)
console.log('---')
console.log('Object.getPrototypeOf(Object.prototype)=', Object.getPrototypeOf(Object.prototype))
console.log('!Object.getPrototypeOf(Object.prototype)=', !Object.getPrototypeOf(Object.prototype))
輸出:
由此可見
- 第一個
!取布爾值取反,往后每個!都是取上一個布爾值再取反。 - 定義了有值就輸出該值,沒有值就輸出undefined
- 空字符串會輸出空字符串,空數(shù)組就輸出空數(shù)組
- 在函數(shù)中,也算是定義了但沒賦值,所以是undefined
- 在Object里,沒有被定義的,不知道有沒有的子屬性,是undefined
- 唯獨一個null:
Object.getPrototypeOf(Object.prototype)
關(guān)于每個變量的布爾值如下:
let a = 10
let b
let c = []
let d = ''
console.log('a=', a)
console.log('Boolean(a):', Boolean(a)) //trueconsole.log('---')console.log('b=', b)
console.log('Boolean(b):', Boolean(b)) //falseconsole.log('---')console.log('c=', c)
console.log('Boolean(c):', Boolean(c)) //true
console.log('Boolean(b == c):', Boolean(b == c)) //falseconsole.log('---')console.log('d=', d)
console.log('Boolean(d):', Boolean(d)) //false
console.log('Boolean(b == d):', Boolean(b == d)) //falseconsole.log('---')function fun(e) {console.log('e=', e)console.log('Boolean(e):', Boolean(e)) //falseconsole.log('Boolean(b == e):', Boolean(b == e)) //true,都是定義了,沒賦值
}
fun()console.log('---')var g = new Object()
console.log('g.data=', g.data)
console.log('Boolean(g):', Boolean(g)) //true
console.log('Boolean(g.data):', Boolean(g.data)) //false
console.log('Boolean(b == g):', Boolean(b == g)) //falseconsole.log('---')console.log('Object.getPrototypeOf(Object.prototype)=', Object.getPrototypeOf(Object.prototype))
console.log('Boolean(Object.getPrototypeOf(Object.prototype)):', Boolean(Object.getPrototypeOf(Object.prototype)))
由此可見,有值為true毋庸置疑,空數(shù)組(Array)為true,空對象(Object)為true,其余皆為false。
特別:空對象里面的不知道有沒有的屬性:false。
空值之間的相互等價判斷呢
答案是不同類型的,判為false。都是undefined,判為true。
就像圖中,b和g都是Undefined,相等。
其實某種意義上來講g.data也是定義了沒賦值。既然定義了g這個對象,那么里面的屬性也一起被定義,但是沒有拿出來被賦值。
變量作用域的問題
let a = 10
function fun(e) {console.log('e=', e)console.log('a(before):', a)a = 1console.log('a:', a)a = 1console.log('++a:', ++a)a = 1console.log('a++:', a++)
}fun()
console.log('a(after):', a)
// console.log(e)
運(yùn)行結(jié)果:
如果去掉代碼中最后一行的注釋,會報錯,因為在函數(shù)外面不認(rèn)識e是誰~
++a:先自增,再輸出。
a++:先輸出,再自增。
如果不給a重新賦值呢?
let a = 10
function fun(e) {console.log('e=', e)console.log('a(before):', a)a = 1console.log('a:', a)console.log('++a:', ++a)console.log('a++:', a++)
}fun()
console.log('a(after):', a)
// console.log(e)
運(yùn)行結(jié)果:
還是符合剛才得出的結(jié)論,第一個,先自增,再輸出。第二個,先輸出,再自增。執(zhí)行完之后,此時的a已經(jīng)變成了3
總結(jié)
以上是生活随笔為你收集整理的[JS] undefined、null、ReferenceError的区别、变量作用域问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剖腹产大概需要多少钱
- 下一篇: [JAVA EE] JPA 查询用法:自