JavaScript中令你抓狂的魔術(shù)變量
更新時(shí)間:2006年11月30日 00:00:00 作者:
在存在這么一個(gè)變量 tt, 它滿足下面的代碼.
代碼執(zhí)行完畢后 ,errCount=0 而且 斷言函數(shù)也從未 alert 信息
代碼如下:
同發(fā) CSDN: JavaScript中的魔術(shù)變量
這個(gè)問題是我一個(gè)同事在下班后考我的一個(gè)題目.我當(dāng)時(shí)想了很久,也嘗試了很久.
得到如下答案,能滿足題目的要求.
答案如下:
var tt=new Object(false);
var tt=new Boolean();
var tt=new Boolean(false);
通過這個(gè)題目我們足可以感受到j(luò)s的靈活,更可以加深對(duì)js的理解.
我以前經(jīng)常在代碼中使用如下判斷
if (a){
alert('ok')
}
現(xiàn)在看來,這樣寫的邏輯隱患是非常大的.
借csdn中一個(gè)網(wǎng)友的精彩回復(fù)來解釋一下上面的問題
||是這樣運(yùn)算的:從第一個(gè)開始,遇到有意義的返回,否則返回最后一個(gè)表達(dá)式(注意不一定是Boolean值);
&&是這樣運(yùn)算的:從第一個(gè)開始,遇到無意義的返回,否則返回最后一個(gè)表達(dá)式(注意同上);
!是這樣運(yùn)算的:對(duì)表達(dá)式的值取非(注意不是對(duì)表達(dá)式)。
什么是無意義呢:如下六個(gè) 0,null,undefined,"",false,NaN
除此,視為有意義。
new Boolean(),new Boolean(false)是同一個(gè)東西,由于它是一個(gè)對(duì)象,故是有意義的,但其值為false,所以,可以看為“有意義的false”,這樣,就可以解釋所有的問題了。
new Object(false),也是有意義的,其值也為false,只不過其類型為Object,而new Boolean()其類型為Boolean而已。
再提醒一點(diǎn):||與&&這兩個(gè)運(yùn)算符不是對(duì)值的運(yùn)算,即在運(yùn)算過程中不管表達(dá)式的值,而是對(duì)表達(dá)式本身進(jìn)行運(yùn)算;
這兩個(gè)運(yùn)算符對(duì)表達(dá)式究竟如何運(yùn)算?
答:只管表達(dá)式是否有意義,而不管其值幾何。
對(duì)于表達(dá)式,無意義的只有6個(gè);這里要注意:所有以new方式生成的對(duì)象為動(dòng)態(tài)對(duì)象,動(dòng)態(tài)對(duì)象均視為有意義
再舉例兩個(gè)說明:
一、0||false||new Boolean(false)
運(yùn)算如下:
首先:0是一個(gè)常數(shù),剛好是無意義之一,故繼續(xù);而false也是無意義之一,故再繼續(xù);new Boolean(false)為動(dòng)態(tài)對(duì)象,有意義,故上面運(yùn)算結(jié)果為new Boolean(false)
二、0||new Boolean(false)||true
這會(huì)是什么結(jié)果?很多人不注意就會(huì)以為結(jié)果為true,但這是不對(duì)的。
先說答案:結(jié)果同上
首先:0是一個(gè)常數(shù),剛好是無意義之一,故繼續(xù);new Boolean(false)為動(dòng)態(tài)對(duì)象,有意義;這里已經(jīng)找到有意義的表達(dá)式,故不再往下運(yùn)算了。所以結(jié)果同上。
=====
對(duì)&&運(yùn)算符,同理,不再多說。
題外話:
有意思的是,在答案出來后,我們還采用了一些非常規(guī)手段的答這個(gè)題(僅供娛樂)
var tt=window["assert"]=new Function();
這句話的意思相當(dāng)于下面兩行代碼
function assert(){}
function tt(){}
javascript允許重復(fù)定義函數(shù),執(zhí)行的時(shí)候以以后一個(gè)為準(zhǔn)。
代碼執(zhí)行完畢后 ,errCount=0 而且 斷言函數(shù)也從未 alert 信息
代碼如下:
復(fù)制代碼 代碼如下:
<script>
var tt=/* 請(qǐng)?jiān)谶@里定義tt */;
var errCount=0 //全局變量,用來記錄 assert 函數(shù)出現(xiàn)斷言宣告的次數(shù)
/*
斷言函數(shù)
如果v為假,該函數(shù)就 alert("assert error"),并累加計(jì)數(shù)器 errCount
如果v為真,就什么也不做
*/
function assert(v) {
if (!v) {
alert("assert error");
errCount++;
}
}
assert((tt || true) == false)
assert((tt || false) == false)
assert((tt && true) == true)
assert((tt && false) == false)
assert((true || tt ) == true)
assert((tt || true ) == false)
assert((false || tt ) == false)
assert((tt || false ) == false)
assert((true && tt) == false)
assert((tt && true ) == true)
assert((false && tt ) == false)
assert((tt && false ) == false)
assert((tt ? true : false) == true)
assert((tt == false) == true)
assert((!tt == tt ) == true)
assert((tt + '') == "false")
assert(tt == false)
alert(errCount) //結(jié)果是打印 0
</script>
var tt=/* 請(qǐng)?jiān)谶@里定義tt */;
var errCount=0 //全局變量,用來記錄 assert 函數(shù)出現(xiàn)斷言宣告的次數(shù)
/*
斷言函數(shù)
如果v為假,該函數(shù)就 alert("assert error"),并累加計(jì)數(shù)器 errCount
如果v為真,就什么也不做
*/
function assert(v) {
if (!v) {
alert("assert error");
errCount++;
}
}
assert((tt || true) == false)
assert((tt || false) == false)
assert((tt && true) == true)
assert((tt && false) == false)
assert((true || tt ) == true)
assert((tt || true ) == false)
assert((false || tt ) == false)
assert((tt || false ) == false)
assert((true && tt) == false)
assert((tt && true ) == true)
assert((false && tt ) == false)
assert((tt && false ) == false)
assert((tt ? true : false) == true)
assert((tt == false) == true)
assert((!tt == tt ) == true)
assert((tt + '') == "false")
assert(tt == false)
alert(errCount) //結(jié)果是打印 0
</script>
同發(fā) CSDN: JavaScript中的魔術(shù)變量
這個(gè)問題是我一個(gè)同事在下班后考我的一個(gè)題目.我當(dāng)時(shí)想了很久,也嘗試了很久.
得到如下答案,能滿足題目的要求.
答案如下:
var tt=new Object(false);
var tt=new Boolean();
var tt=new Boolean(false);
通過這個(gè)題目我們足可以感受到j(luò)s的靈活,更可以加深對(duì)js的理解.
我以前經(jīng)常在代碼中使用如下判斷
if (a){
alert('ok')
}
現(xiàn)在看來,這樣寫的邏輯隱患是非常大的.
借csdn中一個(gè)網(wǎng)友的精彩回復(fù)來解釋一下上面的問題
||是這樣運(yùn)算的:從第一個(gè)開始,遇到有意義的返回,否則返回最后一個(gè)表達(dá)式(注意不一定是Boolean值);
&&是這樣運(yùn)算的:從第一個(gè)開始,遇到無意義的返回,否則返回最后一個(gè)表達(dá)式(注意同上);
!是這樣運(yùn)算的:對(duì)表達(dá)式的值取非(注意不是對(duì)表達(dá)式)。
什么是無意義呢:如下六個(gè) 0,null,undefined,"",false,NaN
除此,視為有意義。
new Boolean(),new Boolean(false)是同一個(gè)東西,由于它是一個(gè)對(duì)象,故是有意義的,但其值為false,所以,可以看為“有意義的false”,這樣,就可以解釋所有的問題了。
new Object(false),也是有意義的,其值也為false,只不過其類型為Object,而new Boolean()其類型為Boolean而已。
再提醒一點(diǎn):||與&&這兩個(gè)運(yùn)算符不是對(duì)值的運(yùn)算,即在運(yùn)算過程中不管表達(dá)式的值,而是對(duì)表達(dá)式本身進(jìn)行運(yùn)算;
這兩個(gè)運(yùn)算符對(duì)表達(dá)式究竟如何運(yùn)算?
答:只管表達(dá)式是否有意義,而不管其值幾何。
對(duì)于表達(dá)式,無意義的只有6個(gè);這里要注意:所有以new方式生成的對(duì)象為動(dòng)態(tài)對(duì)象,動(dòng)態(tài)對(duì)象均視為有意義
再舉例兩個(gè)說明:
一、0||false||new Boolean(false)
運(yùn)算如下:
首先:0是一個(gè)常數(shù),剛好是無意義之一,故繼續(xù);而false也是無意義之一,故再繼續(xù);new Boolean(false)為動(dòng)態(tài)對(duì)象,有意義,故上面運(yùn)算結(jié)果為new Boolean(false)
二、0||new Boolean(false)||true
這會(huì)是什么結(jié)果?很多人不注意就會(huì)以為結(jié)果為true,但這是不對(duì)的。
先說答案:結(jié)果同上
首先:0是一個(gè)常數(shù),剛好是無意義之一,故繼續(xù);new Boolean(false)為動(dòng)態(tài)對(duì)象,有意義;這里已經(jīng)找到有意義的表達(dá)式,故不再往下運(yùn)算了。所以結(jié)果同上。
=====
對(duì)&&運(yùn)算符,同理,不再多說。
題外話:
有意思的是,在答案出來后,我們還采用了一些非常規(guī)手段的答這個(gè)題(僅供娛樂)
var tt=window["assert"]=new Function();
這句話的意思相當(dāng)于下面兩行代碼
function assert(){}
function tt(){}
javascript允許重復(fù)定義函數(shù),執(zhí)行的時(shí)候以以后一個(gè)為準(zhǔn)。
相關(guān)文章
js for循環(huán)倒序輸出數(shù)組元素的實(shí)例
下面小編就為大家?guī)硪黄猨s for循環(huán)倒序輸出數(shù)組元素的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03理解 javascript 中的函數(shù)表達(dá)式與函數(shù)聲明
這篇文章主要介紹了理解 javascript 中的函數(shù)表達(dá)式與函數(shù)聲明,需要的朋友可以參考下2017-07-07JavaScript運(yùn)行機(jī)制之事件循環(huán)(Event Loop)詳解
這篇文章主要介紹了JavaScript運(yùn)行機(jī)制之事件循環(huán)(Event Loop)詳解,本文從多個(gè)方面講解了Event Loop,需要的朋友可以參考下2014-10-10千萬(wàn)別錯(cuò)過的JavaScript?sort方法使用指南
sort方法在我們的日常開發(fā)中是經(jīng)常使用的,sort方法一般是用來對(duì)數(shù)組進(jìn)行排序的,但是你是否知道sort方法默認(rèn)是按什么方式排序的呢?下面就和我一起來深入了解sort方法吧2023-05-05javascript設(shè)計(jì)模式 – 工廠模式原理與應(yīng)用實(shí)例分析
這篇文章主要介紹了javascript設(shè)計(jì)模式 – 工廠模式,結(jié)合實(shí)例形式分析了javascript工廠模式基本概念、原理、定義、應(yīng)用場(chǎng)景及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-04-04原生JavaScript實(shí)現(xiàn)幻燈片效果
這篇文章主要為大家詳細(xì)介紹了原生JavaScript實(shí)現(xiàn)幻燈片效果,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02