• js笔记


    引用

    对象通过引用来传递,它们永远不会被拷贝。

    var a = {
        name: 'a'
    }
    var b = a
    b.name = 'b'
    console.log(a.name)     // b

    这里牵扯出 JavaScript 深拷贝和浅拷贝的问题
    上例是浅拷贝

    深拷贝见下:

    var deepCopy= function(source) { 
        var result={};
        for (var key in source) {
          result[key] = typeof source[key]===’object’? deepCoyp(source[key]): source[key];
       } 
       return result; 
    }

    此时 var b = deepCopy(a) 得到的 b 就和 a 没有引用关系,即修改 b 不会影响 a 了

    创建一个对象时,可以选择某个对象作为它的原型:

    var o = {o1:1,o2:function(){alert(1)}}
    function F(){}
    F.prototype = o
    var f = new F()


    一个函数被保存为对象的一个属性时,即为一个方法当一个方法被调用时,this 被绑定到该对象
    var dog = {
        name : 'xxx' ,
        leg:{
            sum : 4 ,
            move:function(){
                console.log(this) ; //Object,是leg对象,而不是dog对象,下面证明了
                alert(this.name) ; //underfined
                alert(this.sum) ; //4
            }
        }
    }
    dog.leg.move();

    call:
    var dog = {
        leg : 4 ,
        color:'yellow'
    }
    var color = 'red' ;
    function t(){
        alert(this.color) ;
    }
    t(); // red , 因为指向this在函数中调用指向window
    t.call(dog); //yellow , 把t()的作用域指向了dog


    try catch 能捕捉throw抛出的异常

    function add(a,b){
        if(typeof a!=='number' || typeof b!=='number'){
            throw {
                name: 'TypeError',
                message: 'add needs numbers'
            }
    }
        return a + b;
    };
    function a(){
        try{
            add('1',3);
        }catch(e){
            console.log(e.name)
            console.log(e.message)
        }
    }
    a();

    给类型增加方法:

    Number.prototype.integer = function(){
        return Math[this < 0 ? 'ceiling' : 'floor'](this) //this指向实例
    }
    
    var num = 10/3
    console.log(num.integer())  ;   // 3


    var o = (function(){
        var val = 0;
        return {
            addVal: function(){
                val += 1
            },
            getVal: function(){
                console.log(val)
            }
        }
    })()//val外部不能访问,闭包

    判断是否是数组或对象:
    var is_array = function(value){
        return value && 
            typeof value === 'object' &&
            typeof value.length === 'number' &&
            typeof value.splice === 'function' &&
            !(value.propertyIsEnumerable('length'))
    }
    var toString = Object.prototype.toString
    function isObject(obj) {
      return toString.call(obj) === "[object Object]"
    }
    function isString(obj) {
      return toString.call(obj) === "[object String]"
    }
    function isArray(obj) {
      return toString.call(obj) === "[object Array]"
    }
    function isFunction(obj) {
      return toString.call(obj) === "[object Function]"
    }
     
    var foo = {
        bar: '你好',
        func: function () {
            alert(this.bar);
        }
    },
    bar = foo.func;
    bar();
    /* 
     * 答案:function () { alert(this.bar) }
     * 把foo.func函数赋值给全局变量bar然后执行,这等价于执行全局函数。全局函数的this是指向window的,
     * 所以alert(this.bar)等于alert(window.bar),也就是alert函数自身。
     */


    var a = 10; 
    a.pro = 10; 
    console.log(a.pro + a); 
    
    var s = 'hello'; 
    s.pro = 'world'; 
    console.log(s.pro + s); 
    
    /*
     * 答案: NaN undefinedhello
     * 给基本类型数据加属性不报错,但是引用的话返回undefined,10+undefined返回NaN,
     * 而undefined和string相加时转变成了字符串。
     */



    奇淫技巧
    货币快速换算
    var s = '1234567.89';
    parseFloat(s).toLocaleString(); // 1,234,567.89
    s.replace(/(d)(?=(?:d{3})+(?:.|$))/g, '$1,'); // 1,234,567.89
    向下取整Math.floor,可以用|0,可以用~~,也可以用右移符>>代替。
    var a= 1.2|0; // 1
    var a = ~~1.2; // 1 (比Math.floor快4倍左右)
    var a = 1.2>>0; // 1
    /* 但是两者最好都只用在正整数上,因为只是舍掉了小数部分。Math.floor(-1.2)应该为-2,这两种方法的结果为-1 */
    
    用( new Function(stringCode) )()比eval快50倍。
    
    转数字用+
    var a = +'1234'; // 1234
    
    合并数组
    var a = [1,2,3];
    var b = [4,5,6];
    Array.prototype.push.apply(a, b);
    console.log(a); // [1,2,3,4,5,6]
    
    交换值
    a = [b, b=a][0];
    
    快速取数组最大和最小值
    Math.max.apply(Math, [1,2,3]); // 3
    Math.min.apply(Math, [1,2,3]); // 1
    
    运算符-->叫做趋向于,可以声明一个变量 然后让他 趋向于 另一个数。
    var x = 10; while (x --> 0)console.log(x); 
    // 9,8,7,6,5,4,3,2,1,0
     



     
  • 相关阅读:
    tensorflow源码资源,github
    数据挖掘实战
    Ansible--快速入门
    gRPC C#学习
    Linq之Expression高级篇(常用表达式类型)
    十大经典排序算法(动图演示)
    ASP.NET Web API 管道模型
    docker面试题和解答(一)
    浅谈委托和事件(一)
    面试题三
  • 原文地址:https://www.cnblogs.com/kekang/p/5257504.html
Copyright © 2020-2023  润新知