標籤:typeof 作用 epc [] 運算式 tor html extend 標識
1.預解析相關
(function() { console.log(typeof foo); console.log(typeof bar); var foo = ‘hello‘, bar = function() { return ‘world‘; }; function foo() { return ‘hello‘; }}());
結果:
functionundefined
文章地址:http://blogread.cn/it/article/6178
2.閉包相關
程式碼片段一:
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()());
結果:The Window
程式碼片段二:
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ var that = this; return function(){ return that.name; }; } }; alert(object.getNameFunc()());
結果:My Object
文章地址:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
3.淺拷貝與深拷貝
淺拷貝:
function extendCopy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } return c;}
深拷貝:
function deepCopy(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] === ‘object‘) { c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i], c[i]); } else { c[i] = p[i]; } } return c;}
淺拷貝的問題:如果父物件的屬性等於數組或另一個對象,那麼實際上,子物件獲得的只是一個記憶體位址,而不是真正拷貝,因此存在父物件被篡改的可能。
4.js中怎麼理解按位取反?
Javascript 按位取反運算子 (~) ,對一個運算式執行位非(求非)運算。如 ~1 = -2; ~2 = -3;來看看~1的計算步驟:
將1(這裡叫:原碼)轉二進位 = 00000001
按位取反 = 11111110
發現符號位(即最高位)為1(表示負數),將除符號位之外的其他數字取反 = 10000001
末位加1取其補碼 = 10000010
轉換回十進位 = -2
按位取反的運算規則這麼奇怪並不是JavaScript專屬的,而是所有的電腦語言都是這樣的。這樣做的主要原因是為了為了統一減法和加法,在電腦中,減法會變成加一個負數,而負數會以補碼的形式儲存。而這樣主要是因為補碼和數位十進位數有這麼轉換關係,負數:補碼(x) = -x - 1,正數:補碼(x) = x。
可參考:二進位如何轉十進位,十進位如何轉二進位
問題地址:https://segmentfault.com/q/1010000005697515
5.javascript文法之標籤(label)
JavaScript語言允許,語句的前面有標籤(label),相當於定位器,用於跳轉到程式的任意位置,標籤的格式如下。
label: statement
標籤可以是任意的標識符,但是不能是保留字,語句部分可以是任意語句。
標籤通常與break語句和continue語句配合使用,跳出特定的迴圈。
top: for (var i = 0; i < 3; i++){ for (var j = 0; j < 3; j++){ if (i === 1 && j === 1) break top; console.log(‘i=‘ + i + ‘, j=‘ + j); } }// i=0, j=0// i=0, j=1// i=0, j=2// i=1, j=0
上面代碼為一個雙重迴圈區塊,break命令後面加上了top標籤(注意,top不用加引號),滿足條件時,直接跳出雙層迴圈。如果break語句後面不使用標籤,則只能跳出內層迴圈,進入下一次的外層迴圈。
continue語句也可以與標籤配合使用。
top: for (var i = 0; i < 3; i++){ for (var j = 0; j < 3; j++){ if (i === 1 && j === 1) continue top; console.log(‘i=‘ + i + ‘, j=‘ + j); } }// i=0, j=0// i=0, j=1// i=0, j=2// i=1, j=0// i=2, j=0// i=2, j=1// i=2, j=2
上面代碼中,continue命令後面有一個標籤名,滿足條件時,會跳過當前迴圈,直接進入下一輪外層迴圈。如果continue語句後面不使用標籤,則只能進入下一輪的內層迴圈。
說明:
break語句和continue語句都具有跳轉作用,可以讓代碼不按既有的順序執行。
break語句用於跳出代碼塊或迴圈。
continue語句用於立即終止本輪迴圈,返回迴圈結構的頭部,開始下一輪迴圈。
【總結】有意思的web前端文章或題目(五)