上一篇原始類型中說到JS目前有七種數據類型,其中六種基本數據類型,一種複雜數據類型。這篇能夠再具體一點。javascript
基本數據類型
:
typeof
檢測數據的類型。複雜數據類型
:
使用instanceof
檢測數據類型。html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>點擊btn彈出序號</title> </head> <body> <button onclick="clickme()" class="btn">Click Me</button> <button onclick="clickme()" class="btn">Click Me</button> <button onclick="clickme()" class="btn">Click Me</button> <button onclick="clickme()" class="btn">Click Me</button> <button onclick="clickme()" class="btn">Click Me</button> </body> </html>
var nodes = document.getElementsByClassName("btn"); var click_handlers = function(nodes){ var i; for (i = 0, l = nodes.length; i < l; i ++) { nodes[i].onclick = function (e) { alert(i); } } }; click_handlers(nodes);
其實這道題目在關於閉包的知識點中,應該是特別熟悉的一道題。而我也認可,以前真的是似懂非懂,只知道上面寫的,只能彈出最後一個節點的數字:5。如今從新回過頭來看這道題的話,才知道這用值類型和引用類型來解釋的話,會是如此簡單明瞭。java
內部函數在使用外部變量i的時候,用的是引用,而非複製。意思就是給每一個節點設置onclick事件的時候,將i的引用傳遞給了alert,當再點擊節點觸發onclick的時候,i的值已經變成了nodes.lenght++,即5。
優化後:node
var click_handlers = function(nodes){ var i; var helper = function(i){ return function(){ alert(i); } } for (i = 0, l = nodes.length; i < l; i ++) { nodes[i].onclick = helper(i); } };
這裏是由於傳遞進去的是i的值的複製。
function function(person) { person.age = 25; person = { name: "John", age: 50 }; return person; } var p1 = { name: "Alex", age: 30 }; var p2 = function(p1); console.log(p1); // -> ?{name: "Alex", age: 25} console.log(p2); // -> ?{name: "John", age:50}
var a = {"x": 1}; var b = a; a.x = 2; console.log(b.x);//2 a = {"x": 3}; console.log(b.x);//2 a.x = 4; console.log(b.x);//2
a
和b
指向同一個地址,其中一個改變,另一個也會跟着改變。故第一個b.x=2
;而當a = {"x":3}
後,a
被賦值了一個新的對象,地址也就變成了一個新的地址,因而與原來的就沒什麼關係了,a
、b
便變成了指向兩個不一樣地址的對象:a
指向x=3
,b
指向x=2
。面試
var a = {n:1}; var b = a; a.x = a = {n:2}; console.log(a.x);//? console.log(b.x);//?
關於js的賦值運算符
多多看一些文章、書籍,理解理解,原來一切並無想象中的那麼難。今年開始,文章先發表在了掘金主頁了喲,所以博客園就滯後點了~數組