# javascript ## 概念 1. window屬性:從根本來說就是一個Object,為全域變數。 2. hoisting概念:var food會提升到函式作用區域的最高處。 3. 暫時性死區(TDZ):變數food會提升到函式作用域的最高處,而在「變數food」後,「執行let food這行宣告語法」前,這段時間我們會稱為暫時性死區(TDZ),在TDZ中,我們不能訪問food這個變數 4. 原型繼承 (Prototypal Inheritance):每個物件都有個 prototype 屬性,物件能夠繼承 prototype 上的屬性或方法。這個機制可以讓我們產生繼承自同一個 prototype 的多個物件,達到代碼復用的效果。 5. 原型(Prototypal):該物件屬於 A.__proto__ = B,即A繼承B ## 語法 ### variable https://ithelp.ithome.com.tw/articles/10240708 var宣告變數會容易導致意外汙染全域變數的問題,例如是區域變數覆蓋全域變數。 hoisting概念:var food會提升到函式作用區域的最高處。 ```javascript= var food = 'apple'; function func(){ var food // 提升之後,因為此時未賦值 var result = 'I eat ' + food console.log(result) // 所以會變成"I eat undefined" // 此時才賦值 food = 'banana'; } func(); ``` let和const是區域變數,不會成為window屬性,如果未宣告就調用即報錯,const在宣告時會強迫賦值。 暫時性死區(TDZ) ```javascript= let food = 'apple'; // 200行code之後 function func(){ //food提升到這裹,TDZ開始 let result = 'I eat ' + food //Uncaught ReferenceError: Cannot access 'food' before initialization console.log(result) //宣告food,TDZ結束 let food = 'banana'; } func(); ``` 使用時機: 根據Google的JavaScript style guide,說明我們應該默認用const,如果該變數需要重新被賦值才用let,永遠不用var。 ### new https://www.shubo.io/javascript-new/ 有點類似物件導向,宣告Cat這個function,其中kitty為其變數,kitty.name則為Kitty。 ```javascript= // Constructor function Cat(name) { this.name = name;//name(name)這個參數指定給name(this.name)這個屬性 } var kitty = new Cat("Kitty"); console.log(kitty.name) // Kitty ``` ### prototype https://www.shubo.io/javascript-new/ https://www.shubo.io/javascript-prototype/ 原型繼承 (Prototypal Inheritance) 每個物件都有個 prototype 屬性,物件能夠繼承 prototype 上的屬性或方法。這個機制可以讓我們產生繼承自同一個 prototype 的多個物件,達到代碼復用的效果。 如果 Cat 建構函式產生的物件都要有 speak() 方法,我們可以定義 Cat.prototype.speak() ```javascript= // Define 'speak' method for Cat objects Cat.prototype.speak = function() { console.log(this.name + ": meow!"); var kitty = new Cat("Kitty"); kitty.speak(); // Kitty: meow! }; ``` ## 函式 ```javascript= setTimeout(動作, 毫秒數) //幾豪秒後執行動作 dog.prototype//原型繼承ex.dog.prototype.speak代表所有的狗都會旺 dog.__proto__//原型ex:dog.__proto__代表dog是animal的一種 console.log() //印出啥 ``` ## Google API ### 開放原始程式碼 https://developers.google.com/maps/documentation/javascript/libraries-open-source?hl=zh-tw ### 路線規劃 https://developers.google.com/maps/documentation/javascript/directions?hl=zh-tw https://developers.google.com/maps/documentation/javascript/reference/directions?hl=zh-tw#Place 1. 建立 DirectionsService 類型的物件 2. 呼叫 DirectionsService.route() 向路線規劃服務發出要求 3. 傳遞 DirectionsRequest 物件常值,其中包含輸入字詞與收到回應時執行的回呼方法 ```javascript= //DirectionsRequest包含以下 { //起點:經緯度\字串EX:新竹火車站\Place物件 //Place物件,可用LatLng, String, PlaceID //PlaceID可用Maps JavaScript API 中的 Geocoding, //Place Search, Place Autocomplete origin: LatLng | String | google.maps.Place, //必要 //終點:跟起點一樣 destination: LatLng | String | google.maps.Place, //必要 //交通方式:DRIVING(自駕車), BICYCLING(腳踏車), //TRANSIT(大眾運輸工具), WALKING(走路),TW全部支援 travelMode: TravelMode, //選用,預設自駕車 //會忽略 avoidHighways, avoidTolls, waypoints[], optimizeWaypoints //TransitOptions 物件常值 //{ //到達時間,如果用會忽略出發時間 //arrivalTime: Date, 選用 //出發時間,如過用會忽略到達時間,如果都沒用會依照當前時間 //departureTime: Date, 選用 //指定偏好的交通方式,可包含一個或多個BUS、RAIL、SUBWAY、TRAIN、TRAM //modes[]: TransitMode,選用 //轉成次數少(FEWER_TRANSFERS) or 較少走路(LESS_WALKING) //routingPreference: TransitRoutePreference //} transitOptions: TransitOptions, //選用,如果用大眾運輸工具就會用到 //DrivingOptions 物件常值 //{ //如果要自駕車,這就是必要,可指定未來時間 //departureTime: Date, //有bestguess(準確), pessimistic(較差的時間), optimistic(較好的時間) //trafficModel: TrafficModel 選用 //} drivingOptions: DrivingOptions, //選用,如果用自駕車就會用到 //單位,UnitSystem.METRIC(公里) or UnitSystem.IMPERIAL(英里) unitSystem: UnitSystem, //選用 //控點,走哪裡會調整路線 waypoints[]: DirectionsWaypoint, //選用 //有效率的控點 optimizeWaypoints: Boolean, //選用 //提供替代路線,如果用控點就不能用 provideRouteAlternatives: Boolean, //選用 //盡可能避開渡輪 avoidFerries: Boolean, //選用 //盡可能避開高速公路 avoidHighways: Boolean, //選用 //盡可能避開收費路段 avoidTolls: Boolean, //選用 //選擇地區 region: String //選用 } ``` DirectionService呼叫後傳回DirectionResult(結果處理)和DirectionStatus(狀態) DirectionStatus可能回傳值: * OK //正常 * NOT_FOUND //起點或終點或控點沒辦法處理 * ZERO_RESULT //沒有符合的結果 * MAX_WATPOINTS_EXCEEDED //欄位過多,跟控點有關 * MAX_ROUTE_LENGTH_EXCEEDED //要求路線過長,太過複雜 * INVAILD_REQUEST REQUEST //無效,通常沒起點或終點 * OVER_QUERY_LIMIT //傳送太多要求 * REQUEST_DENIED //拒絕服務 * UNKNOWN_ERROR //未知錯誤 DirectionResult物件常值: * geocoded_waypoints[]: DirectionsGeocodedWaypoint * routes[]:DirectionsRoute DirectionsGeocodedWaypoint物件常值: * geocoder_status: OK or ZERO_RESULT * partial_match:沒有傳回與原始要求完全相符的結果 * place_id * types[]:傳回結果的「類型」,「台北」回傳「縣市」、「政治」 DirectionsRoute物件常值: * legs[]:DirectionsLeg * waypoint_order:控點順序 * overview_path: LatLng順暢路徑 * bounds:LatLngBounds折線範圍 * copyrights:包含這條路線中要顯示的版權文字。 * warnings[]:包含警告的陣列,以供在顯示導航路線時同時顯示。如果您沒有使用提供的 DirectionsRenderer 物件,就必須自行處理並顯示這些警告。 * fare:這條路線的總車資,大眾運輸要求傳回,currency 表示貨幣代碼,台灣為901;value 表示總車資 DirectionsLeg物件常值: * steps[]:DirectionsStep不同步驟 * distance:涵蓋的總距離,value 表示距離;text 包含以字串形式表示的距離 * duration:總時間,value 表示所需時間;text 包含以字串形式表示的所需時間 * duration_in_traffic:考量目前路況總時間,value 表示所需時間;text 包含以字串形式表示的所需時間 * arrival_time:包含這個路段的預計到達時間,只有大眾運輸路線才會傳回這個屬性,以Time物件回傳,value 表示時間,以 JavaScript Date 物件的形式指定;text 表示時間,以字串的形式指定;time_zone 包含這個站點所在的時區 * departure_time:包含這個路段的預計出發時間,僅適用於大眾運輸路線 * start_location 起點 * end_location 終點 * start_address 起點地址 * end_address 終點地址 DirectionsStep物件常值:(只記會用到的) * travel_mode:包含目前步驟中使用的 TravelMode。大眾運輸路線可以結合步行和大眾運輸路線 * transit 包含大眾運輸專屬資訊,例如抵達和出發時間,以及大眾運輸路線名稱 TransitDetails物件常值: * arrival_stop:抵達車站/站點,name 轉運站/站點的名稱;location 轉運站/站點的地點 * departure_stop:到達車站/站點,name 轉運站/站點的名稱;location 轉運站/站點的地點 * arrival_time:以Time物件指定 * departure_time:以Time物件指定 * headsign:指定這條路線的行進方向 * headway:指定從目前同一站點出發的預計間隔秒數 * line:TransitLine * num_stops:包含目前步驟中的停靠站數量,其中包含抵達站,但不包含出發站。例如,假設您的路線是從 A 站出發,途經 B、C 兩站,最後抵達 D 站,則 num_stops 會傳回 3。 TransitLine物件常值: * name:大眾運輸路線的全名 * short_name:大眾運輸路線的簡稱。通常是一個路線編號,例如「板南線」或「237」 * agencies:TransitAgency TransitAgency物件常值: * name:運輸公司的名稱 * phone:運輸公司的電話號碼 * url:運輸公司的網址 * icon:這條路線相關圖示的網址 * color:這條路線常用的顏色 * text_color:這條路線常用的文字顏色 * vehicle:Vehicle Vehicle物件常值: * name:這條路線的交通工具名稱 * type:這條路線使用的VehicleType * icon:此交通工具類型常用圖示的網址 * local_icon:此交通工具類型相關圖示的網址 VehicleType: * VehicleType.RAIL 火車。 * VehicleType.METRO_RAIL 輕軌電車運輸。 * VehicleType.SUBWAY 地下輕軌電車。 * VehicleType.TRAM 地上輕軌電車。 * VehicleType.MONORAIL 單軌電車。 * VehicleType.HEAVY_RAIL 重軌電車。 * VehicleType.COMMUTER_TRAIN 通勤鐵路。 * VehicleType.HIGH_SPEED_TRAIN 高速火車。 * VehicleType.BUS 公車。 * VehicleType.INTERCITY_BUS 城際巴士。 * VehicleType.TROLLEYBUS 無軌電車。 * VehicleType.SHARE_TAXI 共乘計程車可視為一種公車,可供乘客沿路任意上下車。 * VehicleType.FERRY 渡輪。 * VehicleType.CABLE_CAR 靠電纜運作的交通工具,通常在地面上行駛。空中纜車可視為 VehicleType.GONDOLA_LIFT 類型。 * VehicleType.GONDOLA_LIFT 空中纜車。 * VehicleType.FUNICULAR 靠電纜從陡坡往上拉升的交通工具。纜索鐵路通常由兩個車廂組成,兩個車廂彼此保持平衡。 * VehicleType.OTHER 所有其他交通工具都會傳回這個類型。 ### 距離矩陣 https://developers.google.com/maps/documentation/javascript/distancematrix?hl=zh-tw https://developers.google.com/maps/documentation/javascript/reference/distance-matrix?hl=zh-tw 計價策略:傳送至距離矩陣服務的每筆查詢都有可用元素數量上限,其中「起點」數量乘以「目的地」數量就等於元素數量 ### 地點搜尋(五種) https://developers.google.com/maps/documentation/javascript/places?hl=zh-tw#place_searches ### 1.透過查詢尋找地點 ### 2.透過電話號碼尋找地點 ### 3.搜尋附近 呼叫服務方式 ```javascript= service = new google.maps.places.PlacesService(map); service.nearbySearch(request, callback); ``` Input: 1. location相關 * bounds:矩形搜尋區域 * location:當rankBy以DISTANCE為優先級時,必須指定,但無法指定radius或bounds * radius:圓心以50000m以內 2. keyword:字詞比對 3. minPriceLevel、maxPriceLevel:介於0(便宜)~4(昂貴) 4. openNow:現在是否營業中 5. rankBy:結果排列順序 * google.maps.places.RankBy.PROMINENCE(預設)(須提供radius) * google.maps.places.RankBy.DISTANCE(須提供location) 6. type:符合指定類型的地點,只能擇一 return: * google.maps.places.PlacesServiceStatus * INVALID_REQUEST 無效要求 * OK 有效要求 * OVER_QUERY_LIMIT 超出配額 * REQUEST_DENIED 拒絕使用 * UNKNOWN_ERROR 伺服器錯誤 * ZERO_RESULTS 查無結果 ```javascript= function callback(results, status) { if (status == google.maps.places.PlacesServiceStatus.OK) { for (var i = 0; i < results.length; i++) { createMarker(results[i]); } } } ``` * PlaceResult物件陣列(部分) * business_status 營業狀態 * OPERATIONAL 營業中 * CLOSED_TEMPORARILY 非營業時間 * CLOSED_PERMANENTLY 永久停業 * formatted_address 只有搜尋文字會回傳 * geometry 地理位置 * location 經緯度 * viewport 優先使用可視區域 * plus_code 用經緯度表示區域 * name 地點名稱 * opening_hours 營業時間 * place_id * types 可能有多個值 * vicinity 簡化地址 ### 4.搜尋文字 ### 5.Place Details 要求 基本上跟路線規劃很像