日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

[JS] undefined、null、ReferenceError的区别、变量作用域问题

發(fā)布時間:2023/11/27 生活经验 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [JS] undefined、null、ReferenceError的区别、变量作用域问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。