2016年2月16日 星期二

Javascript的資料型態

以下說明建議安裝node.js環境,實際操作會較有印象。
  • 資料型態
    • 參考:http://www.w3schools.com/js/js_datatypes.asp
      • String, Number, Boolean, Array, Object.
      • null
      • undefined
    • 測試運算
      • typeof:用來測試物件型態,回傳值是字串
      > typeof 1 //Number
      'number'
      > typeof 'abc' //String
      'string'
      > typeof true //Boolean
      'boolean'
      > typeof {} //Object
      'object'
      > typeof undefined //undefined
      'undefined'
      > typeof null //null
      'object'
      > typeof function() {}; //Function
      'function'
      
      • instanceof:用來檢視某個物件是哪個型態的實例
      > var x = {};
      undefined
      > x instanceof Object;
      true
      > [] instanceof Object;
      true
      > [] instanceof Boolean;
      false

    1. Number
      • 沒有整數與浮點數的差別
      • 都是IEEE754 64位元浮點數
        • 最小值Number.MIN_VALUE
        • 最大值Numner.MAX_VALUE
      > Number.MIN_VALUE
      5e-324
      > Number.MIN_SAFE_INTEGER
      -9007199254740991
      > Number.MAX_VALUE
      1.7976931348623157e+308
      > Number.MAX_SAFE_INTEGER
      9007199254740991
      • 若使用位元運算(如:>>,<<等),結果會是32位元有號整數。
      • 不建議使用位元運算
      • 宣告數值時預設為10進位整數
        • 也可0開頭表示8進位整數
        • 或是0x開頭表示16進位整數
        • 嚴格模式下不允許使用8進位
      > 100
      100
      > 0100
      64
      > 0xFF
      255
      • 可用科學記號表示浮點數
      > 1.234
      1.234
      > 1.234E10
      12340000000
      • 數值的特殊值
        • 無限大
          • 正無限大:Infinity
          • 負無限大:-Infinity
      > Infinity
      Infinity
      > -Infinity
      -Infinity
      > Number.POSITIVE_INFINITY
      Infinity
      > Number.NEGATIVE_INFINITY
      -Infinity
      • 非數值(Not a Number)
        • 表示為NaN,也可用Number.NaN取得
        • NaN不等於任何值,NaN也不等於NaN
          • 故無法直接測試NaN === NaN
          • 有isNaN函式,但無法自動轉型成數字得值,都會讓isNaN的結果為true,故非絕對準確。
          • 但可利用NaN是JavaScript中唯一不等於自身的值之特性改採用 value !== value來判別。
          • 更特殊的是,typeof NaN的結果是number
      > var a = 1/'a'
      undefined
      > a
      NaN
      > isNaN(a)
      true
      > isNaN('abcdefg')
      true
      > isNaN(undefined)
      true
      > function isRealNaN(value) {
      ... return value !== value;
      ... }
      undefined
      > isRealNaN(a)
      true
      > isRealNaN('abcdefg')
      false
      > isRealNaN(undefined)
      false
      > typeof NaN
      'number'
    2. String
      • 可使用單引號或雙引號來包著一串文字,都是字串
      • JavaScript中沒有字元
      • 習慣在JavaScript程式中使用單引號,將雙引號保留在HTML中使用。
      > typeof 'A'
      'string'
      > typeof "A"
      'string'
      > var html = '<input type="text" value="123">';
      undefined
      > html
      '<input type="text" value="123">'
    3. Boolean
      • 只有true與false
      > typeof true
      'boolean'
      > typeof false
      'boolean'
    4. Array
      • 是物件(Object)
      • 以[ ]包覆並以逗點分隔的一組物件
      > typeof new Array();
      'object'
      > var arr = ['a',1,true]
      undefined
      > arr
      [ 'a', 1, true ]
      > typeof arr
      'object'
    5. Object
      • 即是指物件(Object),除了基本資料型態外都是Object的實例。
      • 以{}產生物件,其屬性是以逗點分隔之一組name:value pair
      • 屬性可以用.來存取,也可以['name']
      > var man = {name:'Peter',age:23};
      undefined
      > man
      { name: 'Peter', age: 23 }
      > man.age
      23
      > man['age']
      23
      > typeof man;
      'object'
      > typeof new Object()
      'object'
      > typeof {}
      'object'
      > typeof []
      'object'
    6. null
      • 表示沒有任何東西
      • 不參考至任何物件,可將變數設為null
      • 可用===測試變數是否為null
      • 特殊行為:
        • 對null做typeof會是object
        • 對null做instanceof會是false
      > var x = null;
      undefined
      > x === null
      true
      > typeof null
      'object'
      > null instanceof Object
      false
    7. undefined
      • 欲取得沒有指定任何值的變數或屬性,會出現undefined
      • 對undefined做typeof會是undefined
      • undefined會等於undefined
      > var x = null
      undefined
      > var y
      undefined
      > x
      null
      > y
      undefined
      > undefined === undefined
      true

    2016年2月4日 星期四

    node.js + jQuery 實作Ajax範例


    需求:讓純行動端開發的同仁認識Ajax的原理與流程
    目標:Server端接收到Post上行資料,並回應給前端網頁


    node.js快速建置HTTP回應電文範例所產生的server.js檔為基礎,來建構簡易的Ajax。
    請在處理createServer的匿名函數function(req,res)的一開頭加入:
    
    if (req.method === 'POST') {
        req.on('data', function (data) {
            console.log("Post data : " + data);
        }); 
    }
    說明:在request請求中判斷method為POST方法時,直接在後端印出POST的內容。

    此例中後端完整程式碼(server.js)如下:
    
    http = require('http');
    url = require('url');
    
    var host = '127.0.0.1';
    var port = 12345;
    
    var xml = 'KerKer';
    
    var server = http.createServer(
        function(req,res) {
            if (req.method === 'POST') {
                req.on('data', function (data) {
                    console.log("Post data : " + data);
                });
            }
    
            var pathname = url.parse(req.url).pathname;
    
            if(pathname === '/') {
                res.writeHead(200,{'Content-Type':'text/plain'});
                res.end('^_^ ~');
            } else if(pathname === '/aboutme/') {
                res.writeHead(200,{'Content-Type':'text/xml'});
                res.end(xml);
            }
        }
    );
    server.listen(port);
    console.log('Server running at http://' + host + ':' + port);
    

    前端部分,先準備一份基礎HTML:
    
    <html>
    <head>
        <title>Ajax</title>
        <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
        <script>
            var Submit = function(){
                //待填入
            }
        </script>
    </head>
    <body>
        <form id="sentToServer">
            <input type="text" name="data"/>
            <input type="button"  value="Send" onClick="Submit()"/>
        </form>
    </body>
    </html>
    
    說明:
    • 使用到jQuery故須引用遠端資料,或是將jquery.js下載到電腦上再指定正確的目錄引用之。
    • 表單中只呈現一個輸入框與按鈕,Send按鈕在被點擊時呼叫JavaScript的函數Submit()
    • 以瀏覽器打開:
    接下來在Submit填入:
    
    var path="http://127.0.0.1:12345";
    $.ajax({
        url: path,
        data: $('#sentToServer').serialize(),
        type:"POST",
        dataType:'text',
        success: function(msg){
            alert(msg);
        }
    });
    
    • 以node.js執行server.js程式,監聽本機的12345 Port
    • 以開發工具瀏覽或瀏覽器打開ajax.html
    • 瀏覽器畫面:
    • 終端機畫面:
    • 前端接收到訊息並彈出對話框,後端成功收到並印出上行資料。
    此範例目的是感受Ajax的動作原理,大多數的狀況中html檔應該是由後端程式提供存取(放在後端),而非獨立在前端。 以Chrom瀏覽器為例,為了安全性問題避免跨站攻擊,後端會收到資料,但前端沒有正確跳出回應訊息。 此情境下要成功接收回覆需要在server.js的回應改為:
    
    res.writeHead(200,{'Content-Type':'text/plain','Access-Control-Allow-Origin': '*'});
    
    即允許所有來源的跨域存取(因此例只是執行在本機的html檔)

    2016年2月2日 星期二

    以node.js快速建置HTTP回應電文範例


    需求:Android與iOS作為Client端之開發單位進行電文查詢之教育訓練。
    目標:以最簡易的方式使手機開發工程師可以模擬與Server做資料交換。
    分析:考量到團隊成員大多只有純行動開發的經驗,故選用JavaScript作為共通的語言。
    環境:Mac OS


    下面分享在本機啟動http server並回覆電文的方式,使用node.js以Javascript語言開發步驟:
    1. 下載與安裝node.js:https://nodejs.org/en/
      • 此例使用的是v5.5.0
      • 安裝完成訊息如下,顯示安裝套件與其位置
      • Node.js was installed at
           /usr/local/bin/node
        npm was installed at
           /usr/local/bin/npm
        Make sure that /usr/local/bin is in your $PATH.
        
    2. 編輯javascript檔案如下範例server.js
    3. 在終端機前往server.js相同目錄內執行:node server.js
      • 在終端機內要停止目前執行的程式可按control + c
    4. 瀏覽器中連接http://127.0.01:12345/aboutme/
    5. 瀏覽器顯示aboutme電文:(查詢使用postman)
    6. 之後即可以Client端程式連接此服務進行後續資料解析。
    
    http = require('http');
    url = require('url');
    
    var host = '127.0.0.1';
    var port = 12345;
    
    var xml = '<root><name>KerKer</name></root>';
    
    var server = http.createServer(
        function(req,res) {
            var pathname = url.parse(req.url).pathname;
             
            if(pathname === '/') {
                res.writeHead(200,{'Content-Type':'text/plain'});
                res.end('^_^ ~');
            } else if(pathname === '/aboutme/') {
                res.writeHead(200,{'Content-Type':'text/xml'});
                res.end(xml);
            }
        }
    ); 
    
    server.listen(port);
    console.log('Server running at http://' + host + ':' + port);