为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript深入浅出

Bosn 资深架构师
难度中级
时长 5小时28分
学习人数
综合评分9.60
492人评价 查看评价
9.8 内容实用
9.5 简洁易懂
9.5 逻辑清晰
  • get 在外面调用 set往里面书写,可在函数的参数中取得赋值

    val=+val 将val转换为数字

    在原型链上查找是有get 和set方法时访问会走get set 方法不会给当前对象添加新属性

    查看全部
  • 1:函数4调用方式

    直接调用

    对象方法

    构造器

    call/apply/bind

    查看全部
  • 正则基础

    .          任意字符(换行符除外)    /.../.test('1a@')

    \d        数字0-9

    \D        非\d,即不是数字0-9是的字符

    \w        数字0-9,或字母a-z及A-Z,或下划线

    \W        非\w

    \s          空格符,TAB,换页符,换行符

    \S          非\s

    \t\r\n\v\f   tab  回车  换行   垂直制表符   换页符


    三个标识位:

    global   匹配所有情况

    ignoreCase  不区分大小写

    multiline 分行跨行检索

    查看全部
  • 实现继承的方式:
    function Person() {}
    function Student() {}
    
    Student.prototype = Person.prototype;//!!!不可以这么赋值,会相互影响
    Student.prototype = new Person();//会有Person原型,但是还是会有问题,只是类还没有实例化
    Student.prototype = Object.create(Person.prototype);// 新创建一个对象,对象的原型指向Person
    ES5之才支持
    
    ES5之前
    if(!Object.create){
        Object.create = function(proto){
            function F() {}
            F.prototype = proto;
            return new F;    
        };
    }


    查看全部
  • new Object() instanceof Array === false

    [1,2] instanceof Array === true

    右边构造器的prototype属性是否出现在左边的对象的原型链上

    右边必须是函数(不是函数会报错),左边是对象(不是的话,直接返回false)

    !!!不同window或iframe间的对象类型检测不能使用instanceof

    查看全部
    0 采集 收起 来源:instanceof

    2018-11-13

  • //改变prototype
    Student.prototype.x = 101;
    bosn.x;//101
    
    Student.prototype = {y:2};
    bosn.y;// undefined
    bosn.x;//101
    
    var nunnly - new Student('Nunnly', 3, 'Class LOL KengB');
    nunnly.x;//undefined
    nunnly.y;//2
    
    动态修改prototype的属性的时候会影响已创建和新创建的实例
    修改整个prototype赋值新对象的时候,对已经创建的实例
    是不会修改的,但是会影响后续创建的实例。


    查看全部
    0 采集 收起 来源:prototype属性

    2018-11-13

  • 执行上下文(Execution Context, EC)

    VO按照下列顺序填充:

    1. 函数参数(若未传入,初始化该参数值为undefined)

    2. 函数声明(若发生命名冲突,会覆盖)

    3. 变量声明(初始化变量值为undefined,若发生命名冲突,会忽略)

    alert(x);//function
    
    var x = 10;
    alert(x);// 10
    x = 20;
    
    function x(){
        alert(x);// 20
    }
    if(){
        var a = 1;
    } else {
        var b = true;
    }
    
    alert(a);//1
    alert(b);// undefined  var前置处理

    https://img1.sycdn.imooc.com//5bea83b50001a2bf05560696.jpg

    查看全部
  • 全局,函数,eval

    javascript中没有块级作用域

    作用域链:从内到外都可以访问到

    (function(){
        var a,b;
    })();//把函数内部的变量变成函数的局部变量,而不是全局变量
    
    !function() {
    var a,b;
    }
    +function() {
    var a,b;
    }
    以上两种方法加!+把函数变成函数表达式而不是函数声明
    函数声明会被前置处理掉


    查看全部
  • 闭包
    function outer(){
        var localVal = 30;
        return localVal;
    }
    outer();//30
    函数调用返回时,局部变量localVal就被释放掉了
    
    
    
    function outer(){
        var localVal = 30;
        return function() {
            return localVal;
        }
    }
    
    var func = outer();
    func();//30
    
    localVal是不能被释放的;因为调用outer后返回的是一个
    匿名函数,这个匿名函数仍然可以访问外部的outer的局部变量
    localVal,函数outer调用结束后,再次调用func,仍可以访问
    到外部outer函数的局部变量==》这就是闭包

    闭包的作用:在计算机科学中,闭包(词法闭包,函数闭包)是指一个

    函数或函数的引用,与一个引用环境绑定在一起。这个引用环境是一个

    存储该函数每个非局部变量(自由变量)的表

    闭包,不同于一般的函数,它允许一个函数在立即词法作用域外调用时,

    仍可访问非本地变量。

    回调函数仍有能力调用外部函数的局部变量


    缺点: 复杂作用域内,函数调用后,没有被释放掉,造成空间浪费

    内存泄漏,性能消耗

    查看全部
  • 创建自定义属性并设置枚举属性

    defineProperty()

    查看全部
  • 检测一个属性是否可以枚举

    propertyIsEnumerable("porperty")参数为属性

    查看全部
  • 函数属性&arguments

    arguments是一个类数组对象,原型不是Array.prototype,所以它没有join等数组对象才有的方法

    可以通过索引访问arguments对象

    function foo(x,y,z){//形参
        arguments.length;// 2
        arguments[0];//1
        arguments[0] = 10;
        x;//10  绑定关系
        
        arguments[2] = 100;
        z;//undefined  未传参数,失去绑定关系
        arguments.callee === foo;//true
    }
    
    foo(1,2)
    foo.length;// 3 形参个数
    foo.name;// "foo" 函数名
    arguments.length 实参个数
    function foo(x,y){
        console.log(x,y,this);
    }
    
    foo.call(100,2,,3);// 2,3,Number(100)不是对象的会转变成对象
    foo.apply(true,[3,4]);// 3,4,Boolean
    foo.apply(null);//undefined,undefined,window
    foo.apply(undefined);//undefined,undefined,window
    this.x = 9;
    var module = {
        x: 81,
        getX:function() {
            return this.x;
        }
    }
     module.getX();//81对象.属性
     
     var getX = module.getX;
     getX();// 9 直接赋值给变量调用
     
     var boundGetX = getX.bind(module);
     改变函数运行是的this,绑定了module
     
     bondGetX();// 81
    bind与new
    function foo(){
        this.b = 100;
        return this.a;
    }
    
    var func = foo.bind({a: 1});
    
    func();//1
    new func();// {b:100}


    查看全部
  • toString方法是Object.prototype原型上方法

    查看全部
  • 全局作用域下,this指向window;

    严格模式下,this是undefined

    作为对象方法的函数的this

    对象原型链上的this,不管是原型链上的还是本身,都可以拿到

    get/set方法与this

    构造器中的this,若没有return,this的指向会作为返回值

    call/apply方法与this

    function add(c,d){
        return this.a + this.b + c + d;
    }
    var o = {a: 1,b: 3};
    
    add.call(o, 5,7);//1+3+5+7 = 16
    
    add.apply(o, [10,20]);// 1+3+10+20 = 34
    
    function bar(){
        console.log(Object.prototype.toString.call(this));
    }
    bar.call(7);// "[object Number]"
    bind方法与this
    function f(){
        return this.a;
    }
    var g = f.bind({a:"test"});
    console.log(g());//test
    
    var o = {a:37,f:f,g:g};
    console.log(o.f(),o.g());//37,test,使用bind绑定this


    查看全部
    1 采集 收起 来源:[JavaScript]this

    2018-11-13

  • for-in会遍历原型链上可枚举的属性

    查看全部

举报

0/150
提交
取消
课程须知
1.您至少学习了本站“JS入门”、“JS进阶”两门基础课程。 2.如您具备一定实践经验对学习有很大帮助。 3.如您没有脚本编程开发经验,学习过程有可能会受挫部分内容或示例代码,请“暂时略过不懂的部分,后面章节会阐述”,当然想透彻学习,还需大量实践来体会知识的内涵。
老师告诉你能学到什么?
结合实例,深入解析以下知识内容: 1. 数据类型、表达式和运算符、语句; 2. 对象、数组、变量、函数; 3. this、闭包和作用域; 4. OOP; 5. 正则与模式匹配。

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!