javascript

js的数组不支持字符串索引,对象不支持数字key,为了解决这些问题,引入了Map和Set

类型
Map
有点类似于php的数组
var m = new Map([‘a’=>1,’b’=>2,’c’=>3,4=>4]);
m.get(‘a’)

    var m = new Map();
    m.set('a',1);
    m.set(4,4);
    m.set('t',function(){return 'test';})
    m.has('a');
    m.get('a');
    m.delete('a');

Set
    一组不重复数据的集合
    var s = new Set();
    var s = new Set([1,2,3]);

    var s = new Set([1,2,3,3,"3"]);     //1,2,3,"3"
    s.add(4);
    s.delete(4);

浏览器
浏览器对象
window
window对象不但充当全局作用于,还表示浏览器窗口
window对象有innerWidth和innerHeight属性,可以获取浏览器窗口的内部宽度和高度。内部狂傲指去除菜单栏、工具栏、边框等占位元素后,用于显示页面的净宽高。
对应的还有一个outerWidth和outerHeight
navigator
navigator对象表示浏览器的信息
navigator.appName 浏览器名称
navigator.appVersion 浏览器版本
navigator.language 浏览器设置的语言
navigator.platform 操作系统类型
navigator.userAgent 浏览器设定的User-Agent字符串
screen
screen对象表示屏幕的信息
screen.width 屏幕宽度
screen.height 屏幕高度
location
location对象表示当前页面的url信息
http://www.example.com:8080/path/index.html?a=1&b=2#TOP
location.protocol //http
location.host //www.example.com
location.port //8080
location.pathname //path/index.html
location.search //?a=1&b=2
location.hash //TOP

        location.reload             重载页面
        location.assign             加载新页面

        location.assign('/discuss');
    document
        document对象表示当前页面,由于html在浏览器中以dom形式表示树形结构,document对象就是整个dom树的根节点
        document的title属性是从html文档中的<title>读取的,但是可以动态改变
        document.getElementById()   按id获取一个dom节点
        document.getElementByTagName()  按tag获取一组dom节点
        document.cookie             当前页面cookie信息
    history
        不建议使用了

操作DOM
    获取DOM节点
        方法一
            #获取一个DOM节点
            document.getElementById();
            #获取指定tag名的一组DOM节点
            document.getElementByTagName();
            #获取指定class名的一组DOM节点
            document.getElementByClassName();

            var test = document.getElementById('test');
            var trs = document.getElementById('test-table').getElementsByTagName('tr');

        方法二(感觉更好一点)
            querySelector()
            queryselectorAll()

            var q1 = document.querySelector('#q1');
            var ps = q1.querySelectorAll('div.highlighted > p');
    更新DOM
        #修改节点的内容
        innerHTML           包含html  
        textContent         不包含html 
        innerText           不包含html且不返回隐藏元素的内容

        #修改节点的css
        style               对应DOM节点的所有css

        var p = document.getElementByID();
        p.innerHTML = '<span>red</span>';               
        p.innerText = '<script>alert("hi")</script>'
        p.textContent = '';
        p.style.color = '#cccccc';
        p.style.fontSize = '20px';
        p.style.paddingTop = '2em';
    插入DOM
        appendChild
        insertBefore

        #插入节点A至节点B最后
        var js = document.getElementById('js');
        var list = document.getElementById('list');
        list.appendChild(js);

        #创建节点A并插入至节点B最后
        var list = document.getElementById('list');
        var haskell = document.createElement('p');
        haskell.id = 'haskell';
        haskell.innerText = 'Haskell';
        list.appendChild(haskell);

        #将节点A插入到节点B指定位置
        var list = document.getElementById('list');
        var ref = document.getElementById('python');
        var haskell = document.createElement('p');
        haskell.id = 'haskell';
        haskell.innerText = 'Haskell';
        list.insertBefore(haskell,ref);     //将haskell插入至ref之前


    删除DOM
        获取节点及父节点,调用removeChild删除节点
        var self = document.getElementById('to-be-removed');
        var parent = self.parentElement;
        var removed = parent.removeChild(self);

操作表单
    表单值
    text/password/hidden/select值是value
    radio/checkbox值是true/false

    var input = document.getElmentById('email');
    input.value

    提交表单
    <form id = "myform" onsubmit="return checkform();">
        <input type="text" name="username" id="username" />
        <input type="password" name="passwrod" id="password" />
        <button value="submit" >submit</button>
    </form>

    var checkform = function(){
        debugger;
        var username = getElementById('username');
        var password = getElementById('password');
        if(!/^[a-zA-Z0-9]{3,10}$.test(username.value)){
            alert('用户名必须3-10位数字字母组成');
            return false;
        }

        return true;
    }

操作文件
跨域
    flash
    同源域名下搭建代理服务器
    jsonp
    CORS
promise
    promise将执行代码和处理结果的代码分离开来
    调用resolve表示成功,触发then函数中接收的函数
    调用reject表示失败,触发catch函数中欧接收的函数
    then和catch返回promise对象,所以可以级联操作
    规定了异步操作结果处理的执行顺序
    promise.then 调用
    promise.catch 调用promise的rejected句柄病返回这个promise对象
    promise.all(iterable) iterable参数里所有的promise对象都成功才会触发成功,一旦有一个iterable里面的promise对象失败则立即触发失败
    promise.rare(iterable) iterable参数里任意一个子promise被成功或失败后,立即调用promise的成功返回值或失败系那个IQ那个作为参数调用父promise绑定的相应句柄,病返回该promise对象    

    promise有以下状态
        pending     初始状态,既不是fulfilled也不是rejected
        fulfilled   成功的操作
        rejected    失败的操作

    pending状态的promise既可以转化为fulfilled状态又可以转换为rejected状态。当状态发生转换时,promise.then/reject所绑定的方法就会被调用。(当绑定方法时,如果promise对象已经处于fulfilled或rejected状态,那么相应的方法将被立刻调用,所以在异步操作的完成情况和它的绑定方法之间不存在竞争关系)
    promise.prototype.then和promise.prototype.catch方法返回promise对象,所以可以被链式调用

    <html>
    <!--参考 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise-->
    <!--参考 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/then-->
    <head>
    </head>
    <body>
        <button id="btn">click me</button>
        <log id="log"></log>
    </body>  
    <script>
        var count = 0;
        var createP = function(text){
            var e = document.createElement('p');
            e.innerHTML = text;
            return e;
        }
        var testPromise = function(){
            count = ++count;
            log.appendChild(createP(count+')开始(同步代码)<br />'));

            var p1 = new Promise(function(resolve,reject){
                log.appendChild(createP(count+")开始异步代码<br />"));
                setTimeout(function(){
                    if(count<4){
                        resolve(count);
                    }else{
                        reject(count);
                    }
                },2000);
            });

            p1.then(function(val){
                log.appendChild(createP(val+")完成~结束异步代码<br />"));
                return val+1;
            }).then(function(val){      //以新的resolve的形式执行,接收上一个promise在resolve时返回的结果(val+1) 只有在上一个then接收的函数执行成功的情况下才会执行这个then接收的参数
                log.appendChild(createP(val+")完成~结束异步代码<br />"));
            }).catch(function(val){
                log.appendChild(createP(val+")发生错误!结束异步代码<br />"))
            });

            log.appendChild(createP(count+")建立了promise(同步结束)<br />"))
        }
        var btn = document.getElementById('btn');
        var log = document.getElementById('log');
        btn.addEventListener("click",testPromise);
    </script> 
</html>
    /* 1.1
    var promise = new Promise(function(resolve,reject){
        var random = Math.random()*10;
        if(random>5){
            resolve(random);
        }else{
            reject(random);
        }
    });

    promise.then(function(msg){
        document.write(msg);
    },function(msg){
        document.write(msg);
    });
    */

    /* 1.2
     window.onload = function(){
    function doSomething(){
        return new Promise(function(resolve,reject){
            setTimeout(function(){
                var random = Math.random()*10;
                resolve(random);
            },1000);
        });
    }

    doSomething().then(function(msg){
        document.write(msg);
    },function(msg){s
        document.write(msg);
    });
     */

    /*
    let promise = new Promise((resolve,reject)=>{
        console.log('Promise.');
        resolve();
    });

    promise.then(()=>{
        console.log('Resolved');
    });

    console.log('Hi!');
    结果:
    Hi!
    Resolved
    分析
        then指定的回调函数将在当前脚本所有同步任务执行完成后才会执行,所以"Resolve"最后输出
        then/catch调用函数这一过程是异步的,会等到同步过程执行完再执行
     */

    /*
    var p1 = new Promise(function (resolve, reject) {
        console.log("p1");
      // setTimeout(() => reject(new Error('fail')), 3000)
        setTimeout(function(){
            resolve("p1");
        },1000);
    })

    var p2 = new Promise(function (resolve, reject) {
        console.log("p2");
      setTimeout(() => resolve(p1), 1000)
    })

    p2
      .then(result => {
        console.log("success");
        console.log(result)
      })
      .catch(error => {
        console.log("error");
        console.log(error)
      })
     */
    var p = new Promise(function(resolve,reject){
        reject(new Error('pebkac'));
    });  

    p.then(
        function(str){
            alert('I am saved!');
        },
        function(error){
            console.error('出错了', error);
         alert('Bad computer!');
        }
    ).then(
        undefined,
        function(error){ }
    ).then(function(str){
        alert('I am saved!');
    });

underscore
Collections
map/mapObject/filter
every/some
max/min
groupBy
shuffle/sample
Array
first/last
flatten
zip/unzip
var names = [‘a’,’b’,’c’];
var scores = [1,2,3];
_.zip(names,scores); //[[‘a’,1],[‘b’,2],[‘c’,3]]

        var nameAndScores = [['a',1],['b',2],['c',3]];
        _.unzip(nameAndScores); //[['a','c','c'],[1,2,3]]
    object
        var names = ['a','b','c'];
        var scores = [1,2,3];
        _.object(names,scores);     //{a:1,b:2,c:3}
    range
        _.range(5);     //[0,1,2,3,4]   从0开始小于5
        _.range(1,5)    //[1,2,3,4]     从1开始小于4 
        _.range(1,10,3) //[1,4,7]       从1开始步长为3小于10
Functions

1.js中数组有序,对象无序

在控制台中

1
2
3
4
5
var a = ["你好",1,2,3]
var b = {"你好":1,1:1,2:2,3:3}
a //["你好", 1, 2, 3]
b //{1: 1, 2: 2, 3: 3, 你好: 1}