有些非常n的練習題

1、

	var length = 10;
	function fn () {
		console.log(this.length);
	}
	var obj = {
		length:5,
		method:function(fn) {
			fn();
			arguments[0]();
		}
	};
	obj.method(fn,1);
輸出結果如下:

輸出結果

2、

(function (){
	try{
		throw new Error();
	}catch (x) {
		var x = 1,y = 2;
		console.log(x);
	}
	console.log(x);
	console.log(y);
}())
輸出結果如下:

輸出結果
解析:
當立即執行函數執行之前,變量x和y會提升到作用域頂部,而catch裏的x在try拋出錯誤後才能訪問到,所以並不會提升。
所以第二個x打印出來是undefined。而catch塊裏的x = 1,實際修改的是catch的參數x。y修改的則是提升的變量y,因此打印結果爲2。

相當於:
	(function{
		var x,y;
		try{
			throw new Error();
		}catch{
			x = 1;
			y = 2;
			console.log(x);
		}
		console.log(x);
		console.log(y);
	}())

3、

	var a = {},
		  b = {key:'b'},
		  c = {key:'c'};
		  a[b] = 123;
		  a[c] = 456;
		  console.log(a[b]);
輸出結果如下:

輸出結果
解析:
當對象存取時,“[]”中的內容會先被字符串化處理。也就是說當a[b] = 123時,在控制檯打印a會得到如下結果:
在這裏插入圖片描述
此時{‘key’:‘b’}被轉化成了對象的字符串格式’[object Object]’,當a[c] = 456;的時候對象c會進行同樣的轉換,當執行console.log(a[b])時,b對象也會被轉換成‘[object Object]'的形式,因此打印出456.
函數執行上下文的一點筆記:
找執行上下文分爲以下幾個步驟:

1、形參與實參相統一
2、 查找作用域中的函數聲明(字面量函數) 如果vo裏有同名後面的會覆蓋前面的,函數表達式不會存進vo裏。
3、 查找變量 如果有同名則忽略變量,不會覆蓋
js 隱式類型轉換

false == ‘0’ //true
== 不會判斷數據類型只會判斷值是否相等,這裏的值指的是數字類型的值,所以==運算符會隱式的把等號兩邊的值轉換成數字類型。
因此,false 會轉換成0 => 0 == 0,所以 false == 0 返回true。
new RegExp() 與 RegExp()的區別?
···
他們兩者的行爲完全相同,唯一的不同在於前者返回正則實例,後者返回正則模式
···javascript
new Function(‘name’,‘alert(1)’);

通過new Function 創建的函數可以以字符串的形式傳入函數主體,第一個參數爲函數接收的參數,最後一個參數爲函數主體內容。

節流和防抖

節流:讓一個函數執行的不要太頻繁,減少一些過快的調用。
防抖:一段時間內連續函數的調用只讓他執行一次。

 //節流和防抖    
 _.debounce = function(func, wait, n) {        
	 var args,timeout,time;        
	 var later = function (){            
		 var last = _.now() - time;                        
		 if(last < wait){
		           timeout = setTimeout(later,wait - last);           
		  }else{                
		  timeout = null;                
		 if(!n){                    
		  	func.apply(this, arguments);                
		  }                          
	   	}       
	  }       
     return function (){            
	     args = arguments;            
	     time = _.now();            
	     var callNow = n && !timeout;            
	     if(!timeout){                             
	      	timeout = setTimeout(later,wait);            
	      }            
	      if(callNow){               
	       	func.apply(this, arguments);            
	       }                    
       }   
}

節流與防抖以業務爲導向區分。個人的理解是:節流一般應用在事件處理函數中,而防抖一般用在邏輯交互中(比如:點擊按鈕發送ajax請求就是防抖)。

數組也有slice方法,並且不會改變原數組的值。
slice() 方法可從已有的數組中返回選定的元素。

js裏的數字運算

1.JS中的小數運算準確嗎?
不一定
2.JS中的整數運算準確嗎?
不一定。
3.JS中表示的整數是連續的嗎?
不是,當JS數字很大的時候,不再連續。
4.JS中表示的最大數字是多少?
最大的連續整數:可以通過Number.MAX_SAFE_INTEGER查看。
5.JS中能表示的數字的有效位數是多少?
16~17 位

js 中 儲存數字

整數法, 浮點法

JS中,存儲的所有數字,都按照浮點法存放。
浮點法存放的數字,叫做浮點數,浮點數分爲單精度和雙精度。
JS中使用雙精度存放浮點數,IEEE 4.

存放方式
JS在計算機中,給每個數字開闢一塊內存空間, 尺寸固定爲64位

在計算機中,位(bit) 是最小的儲存單位, 簡稱爲bit。
1 byte = 8bit
1kb = 1024 byte
1 MB = 1024 KB
1GB 1024 MB

[第一段][第二段][第三段]
第一段:1位 表示符號位,如果爲1,是負數,如果爲0,是正數
第二段: 11位,表示指數位,這裏指的是以2爲底的指數,而不是10 
第三段: 52位, 表示有小數字

舉例

0      0000 0000 011      1111 0000 0000 0000.....

相當於 1.1111*2 ^ {3 - 1023} 用指數減去1023來表示小數
第一位0 相當於正數,第二段的11轉換爲10進制數爲3,第3段相當於小數點後面的部分又叫尾數部分。 這裏會在小數點前自動補以個1。
特殊情況
1.指數爲0, 尾數爲0,表示數字0
2.符號爲0,指數爲2047,尾數爲0,表示正無窮

3.符號爲1,指數爲2047,尾數爲0,表示負無窮

4.指數爲2047,尾數不爲0, 表示NaN

一個正常的數字,指數部分最多是2046

安全數字: 從1開始到該數字,均是連續的整數,並且該數字的下一個整數是存在的。

位運算

位與運算

符號:&
寫法:整數 1 & 整數2
將兩個整數每一位進行比較,如果都爲1, 結果爲1, 否則結果爲0.

位或運算

符號:1
寫法:整數1 | 整數2
將兩個整數每一位進行比較,如果都爲0, 結果爲0, 否則結果爲1.

否(非)運算

符號:~
寫法:~整數
將該整數按位取反

負數的存儲方式
、-1
真碼:1000 0000 0000 0000 0000 0000 0000 0001
反碼:1111 1111 1111 1111 1111 1111 1111 1110 真碼取反
補碼:1111 1111 1111 1111 1111 1111 1111 1111 反碼加1 最終的存儲方案

取反的快速運算: - 數字 - 1.

異或運算
符號:^
寫法:數字1 ^ 數字2
將數字1和數字2按位比較,不同取1,相同取0.

取餘和求模

取餘和取模都是計算兩個數相除的餘數,他們計算的公式都是x - n * y。x爲被除數,n爲商,y爲除數。
他們的不同點在於n的取值方式不同,以及最後的出的結果的符號與x或y的關聯性不同。

取餘
計算出n的值後,向0取整,如果當n爲小數就相當於直接去掉小數部分。
餘數和被除數符號相同。
求模
計算出n的值後,向下取整,當n的值爲負數時不同於取餘。
餘數和出除號位置相同。

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