【js】【讀書筆記】廖雪峯的js教程讀書筆記

最近在看廖雪峯的js教程,重溫了下js基礎,記下一些筆記,好記性不如爛筆頭嘛javascript

  • 編寫代碼儘可能使用嚴格模式 use strict
  • JavaScript引擎是一個事件驅動的執行引擎,代碼老是以單線程執行
  • 執行中會自動在每行的結尾添加分號
  • 區分大小寫
  • 浮點數一般比較難比較大小,參考es6 number epsilon
  • NaN, Infinity 都是number類型 NaN表示不是一個數字,Infinity表示無窮大,NaN和其餘任何數字都不相等
  • Null 表示空值 ,undefined表示未定義
  • 對象的鍵都是字符串類型
  • 變量能夠屢次賦值,可是隻能申明一次 var
  • 變量自己類型不固定的語言稱之爲動態語言,相反的未靜態語言如java
  • es6中表示多行字符串能夠用```,在此以前都是用\n`
  • 字符串自己不可變,不能修改字符串中的單個字符,能夠基於字符串修改生成新的字符串
  • 數字30和字符串"30"是兩個不一樣的元素
  • 訪問對象不存在的屬性不會報錯,只會返回undefined
  • in判斷對象是否具備某屬性,屬性可能爲對象自有屬性也可能爲繼承屬性,若是查看是否爲對象的自有屬性,用hasOwnProperty
  • null,undefined,0,NaN,"" 視爲false,其餘的都爲true
  • 循環的集中方式for,for in,while,do whilees6引入新的循環for offorEach循環
  • es6Map,Set,iterable 元素
  • Array,Map,Set都是屬於iterable類型,均可以用for of進行循環
  • iterable內置forEach循環
  • 函數也是一個對象,沒有return的函數返回undefined
  • arguments,只在函數內部起做用,而且永遠指向當前函數的調用者傳入的全部參數,arguments相似Array但它不是一個Array,調用時即便不傳遞參數也能夠經過arguments獲取到全部參數
  • 函數中,能夠用es6的新參數rest來代替多個參數
  • 內部函數能夠訪問外部函數定義的變量,反之則不行;若是內部函數定義了與外部函數重名的變量,則內部函數的變量將「屏蔽」外部函數的變量
  • 函數定義有個特色,它會先掃描整個函數體的語句,把全部申明的變量「提高」到函數頂部,JavaScript引擎自動提高了變量的聲明,但不會提高變量的賦值
  • 默認的全局對象window,全部的全局變量(包含函數)都會綁定爲全局對象window的一個屬性
  • 任何變量(函數也視爲變量),若是沒有在當前函數做用域中找到,就會繼續往上查找,最後若是在全局做用域中也沒有找到,則報ReferenceError錯誤
  • 名字空間 全局變量會綁定到window上,不一樣的JavaScript文件若是使用了相同的全局變量,或者定義了相同名字的頂層函數,都會形成命名衝突,而且很難被發現,減小衝突的一個方法是把本身的全部變量和函數所有綁定到一個全局變量中,許多著名的JavaScript庫都是這麼幹的:jQueryYUIunderscore等等
  • es6的快級做用域元素let,const,let用於定義塊級變量,const用於定義常量,常量建議所有大寫字母表示
  • 解構賦值,能夠快速的把數組、對象的屬性賦值給變量
  • 在一個方法內部,this是一個特殊變量,它始終指向當前對象
  • this調用,若是以對象的方法形式調用,好比xiaoming.age(),該函數的this指向被調用的對象,也就是xiaoming,若是單獨調用函數,好比getAge(),此時,該函數的this指向全局對象,也就是window
  • ECMA決定,在strict模式下讓函數的this指向undefined
  • 函數自己的apply,call方法,apply裝飾器
  • 高階函數的概念,參數的爲函數的函數爲高階函數
  • arraymap,reduce用法,調用map的回調函數和實際的函數參數可能不同致使異常的結果 array.prototype.map map的回調有4個參數,而若是如array.map(parseInt),parseInt只有2個參數,並且第二個參數和calltable第二個參數性質不同,形成結果異常,示例請看廖雪峯的js小示例
  • arrayfilter用法,用於對數組值的過濾
  • arraysort排序函數,默認的是經過字符串的ascii碼進行排序,固然,sort也是個高階函數,你能夠自定義排序算法
  • 錯誤包含邏輯錯誤(代碼錯誤)和運行錯誤(權限,網絡鏈接,文件不存在)
  • 錯誤傳播 若是在一個函數內部發生了錯誤,它自身沒有捕獲,錯誤就會被拋到外層調用函數,若是外層函數也沒有捕獲,該錯誤會一直沿着函數調用鏈向上拋出,直到被JavaScript引擎捕獲,代碼終止執行
  • es6的箭頭函數(也屬於匿名函數)
  • 箭頭函數和匿名函數的區別爲,箭頭函數裏的this老是指向詞法做用域,也就是外層調用者(這裏我也不大懂廖雪峯啥意思)
  • 可變參數以3個點·開始,表面參數的個數不限制 function (x,y,...rest) rest表示可選參數
  • typeof檢測類型,[],null,{}返回的都是object,undefined返回的是undefined
typeof 123; // 'number'
typeof NaN; // 'number'
typeof 'str'; // 'string'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof Math.abs; // 'function'
typeof null; // 'object'
typeof []; // 'object'
typeof {}; // 'object'
  • 用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'
  • 任何對象都有toString()方法嗎?null和undefined就沒有!確實如此,這兩個特殊值要除外,雖然null還假裝成了object類型。
  • 數字轉換成字符串
123..toString(); // '123', 注意是兩個點!
(123).toString(); // '123'
  • node查找模塊的順序依次爲內置模塊全局模塊當前模塊
  • node.js加載模塊時使用了匿名函數加載模塊的方式來規避各個模塊內變量衝突的問題
  • 判斷是處於瀏覽器環境仍是node環境
if (typeof(window) === 'undefined') {
    console.log('node.js');
} else {
    console.log('browser');
}
  • Date相關
  • JavaScript的月份範圍用整數表示是0~11,0表示一月,1表示二月
  • 使用Date.parse()時傳入的字符串使用實際月份01~12,轉換爲Date對象後getMonth()獲取的月份值爲0~11
var now = new Date();
now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
now.getFullYear(); // 2015, 年份
now.getMonth(); // 5, 月份,注意月份範圍是0~11,5表示六月
now.getDate(); // 24, 表示24號
now.getDay(); // 3, 表示星期三
now.getHours(); // 19, 24小時制
now.getMinutes(); // 49, 分鐘
now.getSeconds(); // 22, 秒
now.getMilliseconds(); // 875, 毫秒數
now.getTime(); // 1435146562875, 以number形式表示的時間戳
  • json其實是js的一個子集
  • json的數據類型和js的數據類型一致
  • node的同步異步的關係
  • 流的概念
  • web協議簡介
  • nodejs 底層採用C/C++編寫,而後對外暴露爲javascript接口
  • CSBS的由來
  • MVVM的原理,雙向綁定,model-dom對應
  • https的原理
  • es6的生成器generator
  • js原型繼承object.create,__proto__
  • 當咱們用obj.xxx訪問一個對象的屬性時,JavaScript引擎先在當前對象上查找該屬性,若是沒有找到,就到其原型對象上找,若是尚未找到,就一直上溯到Object.prototype對象,最後,若是尚未找到,就只能返回undefined
  • new functionname,經過new方法來建立對象
  • window對象有innerWidthinnerHeight屬性,能夠獲取瀏覽器窗口的內部寬度和高度。內部寬高是指除去菜單欄、工具欄、邊框等佔位元素後,用於顯示網頁的淨寬高。
  • window對應的,還有一個outerWidthouterHeight屬性,能夠獲取瀏覽器窗口的整個寬高
  • navigator對象表示瀏覽器的信息
  • screen對象表示屏幕的信息
  • location對象表示當前頁面的URL信息
  • document對象表示當前頁面。因爲HTML在瀏覽器中以DOM形式表示爲樹形結構,document對象就是整個DOM樹的根節點
  • history對象保存了瀏覽器的歷史記錄
  • css的屬性在js中換成駝峯寫法,如font-size寫成fontSize,p.style.fontSize = '20px'
  • 刪除後的dom節點雖然不在文檔樹中了,但其實它還在內存中,能夠隨時再次被添加到別的位置
  • JavaScript代碼都不可能同時有多於1個線程在執行
  • 跨域方法,1在同源下使用 2在同源下搭建代理服務器,代理服務器轉發請求到真正的服務器 3jsonp方式,經過get請求js的方式那樣請求數據 4 cros 跨域
  • js,css默承認以跨域,其餘請求跨域須要通過處理
  • es6promise,canvas用法
相關文章
相關標籤/搜索