js理論相關知識(一)

1、! 與 !!

  1. ‘!’ 可將變量轉換成boolean類型,null、undefined和空字符串取反都爲false,其餘都爲true。
    在javascript中:
    以下內容會被當成false處理:"" , false , 0 , null , undefined , NaN
console.log(!undefined); // true
console.log(!null); // true
console.log(!''); // true
console.log(!' ') // false
console.log(!0) // true
console.log(!0) // true
console.log(!NaN) // true
  1. ‘!!’ 常常用來做類型判斷,在第一步!(變量)之後再做邏輯取反運算,在js中新手常常會寫這樣臃腫的代碼:
    判斷變量a爲非空,未定義或者非空串才能執行方法體的內容
// 新手判斷 a 有內容或非空
var a;
if(a!=null&&typeof(a)!=undefined&&a!=''){
    //a有內容才執行的代碼  
}
// 老手
if(!!a){
    //a有內容才執行的代碼...  
}

引用:http://www.cnblogs.com/tison/p/8111712.html

2、new Function()將字符串轉爲對象

  1. 在JS中將字符串 “type: ‘progressbar’,data:demo3” 神奇的變爲對象
var s=(new Function("return ({" + "type:'progressbar',data:'demo3'" + "})"))();
console.log(s);  // Object { type: "progressbar", data: "demo3" }
  1. 查閱了資料發現 文章一文章二
// 文章1
var message = new Function('msg','alert(msg)');
// 等價於:
function message(msg) {
    alert(msg);
}
// 文章2
var a = 'global scope'
function b(){
	var a = 'local scope'
	eval('console.log(a)'); //local scope
	(new Function('','console.log(a)'))() //global scope
}
b();
// eval中的代碼執行時的作用域爲當前作用域。它可以訪問到函數中的局部變量。
// new Function中的代碼執行時的作用域爲全局作用域,不論它的在哪個地方調用的。所以它訪問的
// 是全局變量a。它根本無法訪問b函數內的局部變量。

那麼(1、)中的代碼改寫爲如下,結果沒有發生改變。

var s=(new Function("","return ({" + "type:'progressbar',data:'demo3'" + "})"))();
console.log(s);  // Object { type: "progressbar", data: "demo3" }

那麼將文章2中代碼改寫爲下

var a = 'local scope';
function b() {
	(new Function('console.log(a)'))() //global scope
}
b();	// local scope

結果依舊沒有改變。那麼測試以下代碼

1var cc= new Function('aa','console.log(aa)');
cc('孫悟空'); // 孫悟空
2var cc1= new Function('','console.log("牛魔王")');
cc1('孫悟空'); // 牛魔王
3var cc2= new Function('console.log("豬八戒")');
cc2('孫悟空'); // 豬八戒

由此可見,當new Function 創建的函數並不需要參數時,Function 的第一個參數可寫可不寫;
以上代碼均在火狐瀏覽器中測試。

文章一引用:https://www.cnblogs.com/pizitai/p/6427433.html
文章二引用:https://www.cnblogs.com/zhangfengyang/p/5526024.html

3、徹底理解 js 中 && 和 ||

  1. 現象:
    javascript中,&&和||的用法比較神奇,經常用在對象上,例如a || b,如果a不存在,則返回b。a && b,如果a存在,則返回b,否則返回a。
    光這樣看,感覺他的概念還挺複雜的,這樣去想的話,不但會在腦子裏多出一個無用的概念,而且越記越混亂。看問題還是要看本質。
  2. 本質:
    本質是什麼呢?&& 和 || 的作用只有一個(定義):
    進行布爾值的且和或的運算。當運算到某一個變量就得出最終結果之後,就返回哪個變量。
  3. 說明
    在javascript中:
    以下內容會被當成false處理:"" , false , 0 , null , undefined , NaN
    其他都是true。注意:字符串"false"也會被當做true處理,在未轉型的情況下他是字符串,屬於一個對象,所以是true。
    所以:
    a || b:如果a是true,那麼b不管是true還是false,都返回true。因此不用判斷b了,這個時候剛好判斷到a,因此返回a。
    如果a是false,那麼就要判斷b,如果b是true,那麼返回true,如果b是false,返回false,其實不就是返回b了嗎。
    a && b:如果a是false,那麼b不管是true還是false,都返回false,因此不用判斷b了,這個時候剛好判斷到a,因此返回a。
    如果a是true,那麼就要在判斷b,和剛剛一樣,不管b是true是false,都返回b。
  4. 來個複雜的例子(注意一點:在js中&&運算符優先級大於||)
    假設:
var a=new Object(),b=0,c=Number.NaN,d=1,e="Hello"; 
console.log(a || b && c || d && e);    // Object {}
  1. 表達式從左往右執行,先&&後||
    5.1、(b && c):b是false,此時不需要判斷c,因爲不管c是true是false,最終結果一定是false,因此返回當前判斷對象b,也就是0;
    5.2 、(d && e):d是true,這個時候判斷e,此時不管e是true,是false,返回結果一定是e,e爲true,因此返回"Hello";
    5.3、(a || b):a是true,此時不管b是true是false,結果都是true,所以不判斷b,所以返回當前判斷對象a,因此返回new Object();
    5.4、(a || e):同上,因此返回a。
    這個表達式最終結果爲a,也就是new Object()

文章引用:https://www.cnblogs.com/sgzs/p/7977208.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章