JavaScript some point

weixin_34148340發表於2016-10-28
  1. 單引號雙引號沒有區別
  2. JavaScript允許對任意資料型別做比較:比如false==0; //true 它會自動轉換資料型別再比較,很多時候,會得到非常詭異的結果;
    false===0; //false 它不會自動轉換資料型別,如果資料型別不一致,返回false ,如果一致,再比較,所以儘量使用===
  3. NaN與null不一樣 ,判斷NaN只能通過 isNaN()
  4. 浮點數比較 1 / 3 === (1 - 2 / 3); //false 機器無法處理無線迴圈的小數,要比較兩個浮點數是否相等,只能計算它們之差的絕對值,看是否小於某個閾值:Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
  5. static 模式 , 在js程式碼中新增一個字串 'user static';,就表示使用static模式,(ps不是所有的瀏覽器都支援static模式),在這個模式下,宣告的變數必須是有 var 字首的,沒有var字首的變數表示全域性變數
  6. 轉義字元在js中,還可以unicode和ascii來表示字元用 , 比如 '\x41' 表示 'A',
  7. 字串連線,出了使用+,還可用ES6新標準,比如 var = {你好, ${name}, 你今年${age}歲了!}
  8. js的陣列,var array = [1,2,'hello',NaN]; 如果給陣列的長度賦值,會導致陣列長度改變,並且如果索引超過陣列長度的值,也會導致陣列變化,比如 var array =['hello',1] ; array[4] = 3;,這時陣列會變成['hello',1,undefined,undefined,3]
  9. 陣列的unshift 和 shift , shift會把陣列的第一個元素刪掉
  10. 關於陣列的一些方法,reverse,splice,slice,sort,conact(ps 這個方法並沒有修改原來的陣列,只是返回了一個新的陣列),join
  11. js所有物件的屬性名都是字串,js的物件設計很神奇,所以js可以動態的改變物件的屬性,比如刪除物件的一個欄位(delete xiaoming.age,這裡的物件和類有區別麼,如果沒有區別,一個物件的兩個例項,其中一個例項刪除了一個屬性,另一個會怎麼樣),in,hasownproperty)
  12. for in 迴圈陣列,得到的是string 不是int
var a = ['A', 'B', 'C'];
for (var i in a) 
{ alert(i); // '0', '1', '2' 
  alert(a[i]); // 'A', 'B', 'C'
}
  1. 為什麼會存在set這個東西,set的foreach接受的function的前兩個引數都是元素本身
  2. foreach(foreach不要求引數一致) for...of for..,in
    (ps)15. 計算機對於現實的程式碼表示是抽象,但是這些現實實物的現實語音的描述不也是抽象麼,無敵
  3. function裡面沒有return的話,也是又返回的,只不過返回是undefined,相對於java的方法,function有兩個特點,第一.引數處理 第二.function也是物件
  4. js引擎會自動在return後面補上;,所以需要有返回的時候return物理行後面不可以不跟東西。
  5. jsfunction的變數提升機制,所以對於js來說有一個規範,對於變數要在function開頭宣告全部。
  6. 全域性變數window,塊級引用變數let,宣告常量const
  7. js的this指標設計的有點迷啊,感覺這裡面是一個巨坑。
  8. 為了解決this的問題,有apply,call(ps。記住一切都是物件有助於理解js)
  9. 高階函式(ps,這樣可以提高js的上限),map和reduce是對運算的抽象,發現map和reduce不能改變當前的陣列,需要用新的陣列來接收。
  10. 存在問題 this、到底是個什麼東西
  11. split() 為什麼不是一個function,在什麼情況下會報這個錯誤
  12. filter 刪掉return false,留下return true 的arguments
  13. 關於js replace。 這個函式只能替換第一個字元,如果想要替換找到的所有字元,需要用到正規表示式 /\x/g,其中x就是期望替換的內容。
  14. sort 預設實現是比較ASCII碼錶數值的大小,對於數字,會先將數字轉化為字元,然後比較字元的ASCII碼錶。
  15. 閉包(覺得閉包就是帶有java中帶有static變數的方法)。
  16. 變數提升和jsfor迴圈裡面用var宣告的變數屬於for上層容器,而不是屬於for塊內部,es6為了修復這個bug,新增宣告let
  17. 箭頭函式一種簡化的寫法,如果返回的是類,要加中括號。
  18. generator函式, 看來java還是有很多沒有的特性的。其他語言還是有很多的很不錯的想法,
  19. typeof number boolean str nan function undefined 的typeof 的返回值不為object
    不要使用new Number()、new Boolean()、new String()建立包裝對 象;
    用parseInt()或parseFloat()來轉換任意型別到number;
    用String()來轉換任意型別到string,或者直接呼叫某個物件的 toString()方法;
    通常不必把任意型別轉換為boolean再判斷,因為可以直接寫if (myVar) {...};
    typeof操作符可以判斷出number、boolean、string、function和 undefined;
    判斷Array要使用Array.isArray(arr);
    判斷null請使用myVar === null;
    判斷某個全域性變數是否存在用typeof window.myVar === 'undefined';
    函式內部判斷某個變數是否存在用typeof myVar === 'undefined'。
  20. data
  21. regexp 正規表示式
  22. json , json的由來就是js,所以js自帶json解析,還可以利用function對json進行預處理
  23. js中沒有類,只有原型prototype,js中一切都是物件。這點跟java還是有區別的。建立物件Object.ceate(prototype) 或者 proto屬性(ps 這個屬性在有的瀏覽器中不支援,),js的建構函式既可以是物件的宣告,又可以是函式
  24. 原型鏈這個東西還真是神奇,感覺這種設計有點然並卵
  25. 關於箭頭函式請問如果用箭頭函式該怎麼寫?
function Cat(name) {
  this.name = name;
}
Cat.prototype.say = () => "Hello, " + this.name + "!"

並不對。。。
不對就對了.MDN this的詞法箭頭函式就是個簡寫形式的函式表示式,並且它擁有詞法作用域的this值(即不會新產生自己作用域下的this, arguments, super 和 new.target 等物件)。此外,箭頭函式總是匿名的。

function Cat(name) {
  this.name = name;
}
Cat.prototype.say = () => "Hello, " + this.name + "!"

在箭頭函式裡的this是它外層的this,
外層根本就沒有this,
所以這裡的this是undefined

  1. js的繼承方式簡直了 , js沒有繼承這個概念,js的繼承好像完全由指標實現的。這裡回來要好好看一哈,理解一下這種設計模式,想想這麼設計的缺點
  2. haha ,果不其然,es6的新規則把這種複雜的繼承方式對開發者影藏了,使開發者更加專注於業務。(ps 但是不是所有的瀏覽器都支援這種方式,但是也有自動工具將這種轉換自動完成的比如,Babel這個工具。)
  3. window , screen , navigator , location , decoment ,ps(js真是無所不能跟網頁有關的)
  4. getElementsByClassName getElementsByTagName ,這兩個方法都可能有多個返回,所以返回結果會被放入陣列當中。
  5. getElementsByClassName 返回的是子級別的陣列,如果是子tag的子tag的物件的話,一定要在查詢一層。
  6. getElementsByTagName 可以通過Tag來查詢 比如
<p>a</p>

就可以通過p來查詢

  1. 通過querySelector來根據id查詢時。id前面要加上#比如查詢id為handsome的element的時候,
    document.quertSelector('#handsome'); selector要通過selector的語法來,這個可以回來再看。
  2. innerHTML,innerContent,innerText,style(注意由於js和css的命名規則的問題,css的一些屬性名字要給為駝峰法命名規範比如font_size改為fontSize)。
  3. appendChild , insertBefore (ps , JavaScript 是一個 已經被定義了的關鍵字,把他當做變數名的時候,可能會出問題)

相關文章