美文网首页
javascript

javascript

作者: jiahzhon | 来源:发表于2020-12-25 17:57 被阅读0次

    语言分类

    image.png

    变量种类

    • 原始值
      • stack
      • number,string,boolean,undefined,null
    • 引用值
      • heap
      • array,object,function,date,RegExp ....

    语句基本规则

    • 语句后面要用分号结束“;”
    • js语法错误会引发后续代码终止,但不会影像其他js代码块
    • NaN

    运算符

    • NaN == NaN 为 false
    • undefined,null,NaN,"",0,false
    • !123 为 false !"" 为true
      ** javascript的&&和||与java的不一样,不只是会返回true 和 false,依照情况是会返回直接返回表达式的值。
    • &&
      • 先看第一表达式转换成布尔值的结果,如果结果为真,那么它会看第二个表达式转换为布尔值的结果。如果只有两个表达式,直接返回第二个表达式的值。如果第一个表达式转换后的结果假,那么就直接返回第一个表达式的值
      • 常用情况。用一个变量作为函数入参,如果参数为空不传给函数。此时&&起阻断作用。
    var data = ...
    data && 执行一个语句,会用到data
    
    • ||
      • 寻找一个真返回
      • 写兼容的时候会用到,两个表达式哪个有值就返回哪个

    Object

    Snipaste_2020-12-26_18-08-43.png

    typeof

    • 六种数据类型:
      • number,string,boolean,undefined,object,function
      • null,[],{}返回的都是object
    • typeof(typeof(b))
      • typeof(b) -> b未定义,返回字符串“undefined”
      • 最后结果为string
      • typeof返回的number,string,boolean,undefined,object,function是string

    类型转换

    • 显示类型转换
      • Number(mix) Number(null) --> 0
      • parseInt(string,radix)
      • parseFloat(string)
      • toString(radix)(用得比价少)
      • String(mix)
      • Boolean()
    • 隐式类型转换
      • isNaN() (会放在Number()后再判断)
      • ++/-- +/-(一元正负)
      • 加号
      • -*/%
      • &&||!
      • <><=>=
      • == != (undefined == null,true)
      • 不发生类型转换的绝对等于和不等于 ===,!==。长得不一样就是不一样

    函数

    声明方法

    • 函数声明
    function theFirstName(){
    }
    
    • 命名函数表达式
    var test = function abc() {
    }
    
    • 匿名函数表达式(这不是匿名函数)
    var demo = function() {
    }
    
    • 命名函数表达式只有test能代表,abc没有实际意义
    • 命名函数表达式 和 匿名函数表达式 唯一的区别是test.name为abc,demo.name为demo.

    匿名函数的this

    • 匿名函数的执行环境是全局性的,指向windows
        var name = 'window'
        var person = {
            name :'Alan',
            sayName:function () {
                return function () {
                    console.log(this.name)
                }
            }
        }
        person.sayName()()  // window 
    

    解决方法还是有的,我们可以把外部作用域的this传递给匿名函数

        var name = 'window'
        var person = {
            name :'Alan',
            sayName:function () {
                var that = this
                return function () {
                    console.log(that.name)
                }
            }
        }
        person.sayName()()  // Alan
    

    形参和实参

    • javascript就算不写全形参也能运行,通过arguments也能获取.但是arguments只映射一开始就对应上的。没映射在函数里后面才赋值的不会出现在arguments里。


      Snipaste_2020-12-28_14-51-05.png

    语法分析

    预编译

    一些现象:

    • test依旧能运行
    test();
    
    function test() {
      console.log('a');
    }
    
    • 输出undeifined
    console.log(a);
    var a = 123;
    

    imply global 暗示全局变量

    • imply global 暗示全局变量 :即任何变量(包括写在函数里),如果未经声明就赋值,此变量就为全局对象所有
      • a = 123
      • var a = b = 123(中的b)
    • 一切声明的全局变量,全是window的属性
      • var a = 123; ===>window.a = 123
    • window即为全局

    预编译

    • 预编译过程this指向window
    • 预编译发生在函数执行的前一刻
    • 四部曲:
        1. 创建AO对象(Activation Object)(执行期上下文)
        1. 找形参和变量声明,将变量和形参作为AO属性名,值为undefined
        1. 将实参值和形参值统一
        1. 在函数体里面找函数声明,赋予函数体
    • 例子:


      image.png
    1. 创建AO
    2. 找到形参a (var a = 123,重复了,OA只放一个a),形参b,此时AO:
    AO {
      a : undefined,
      b : undefined,
    }
    
    1. 将实参值和形参值统一,a 变成1
    AO {
      a : 1,
      b : undefined,
    }
    
    1. 在函数体里面找函数声明,赋予函数体(a变成function a(){} ,b 还是undefined(注意b并不是函数声明),d为 function d (){})
    AO {
      a : function,
      b : undefined,
      d : function,
    }
    

    5 . 开始运行函数。第一个打印function。第二个打印123,function a (){}已经被提前了,所以不再运行,第三个还是打印123。b开始运行function.第四个打印function

    全局的预编译

    • 第一步生成的叫GO(global object === window)
    • 没有第三步
    • 先生成GO,再生成AO
    • AO找不到找GO

    作用域链

    • [[scope]]:无法被修改操作
    • 以下情况a是会被修改成0的


      Snipaste_2020-12-29_11-41-55.png

    分定义和执行时两步

    Snipaste_2020-12-29_11-18-06.png
    Snipaste_2020-12-29_11-17-45.png

    闭包

    • return b后A的AO已经被销毁了,但b继承了它


      image.png
      Snipaste_2020-12-29_14-46-25.png
    • 第二次输出是102,而不是101,拿着外面函数的劳动成果继续访问


      Snipaste_2020-12-29_14-41-44.png
    • 闭包:当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。
      • 作用:
        • 实现公有变量(函数累加器)
        • 可以做缓存(存储结构)
        • 可以实现封装,属性私有化
        • 模块化开发,防止污染全局变量
    Snipaste_2020-12-29_16-39-46.png Snipaste_2020-12-29_16-39-24.png
    • 闭包练习

    • 以下输出的是10个10,而不是123456789。test全部执行完才循环输出的。var i 是共同变量。里边的function并不是立即执行函数


      Snipaste_2020-12-29_17-19-38.png
    • 这样是输出全部

            function test(){
                var arr = [];
                for(var i = 0; i<10; i++){
                    arr[i] = function () {
                        document.write(i+",");
                    }()
                }
                return arr;
            }
            
            var myArr = test();
            for(var j = 0; j < 10; j++){
                myArr[j];
            }
    

    立即执行函数

    • 格式:(function (){}())
    • 特点:立即执行,马上释放,函数的引用也不被保存
    • 上边的问题可以用立即执行函数实现

    对象

    • 对象里函数反问对象属性值要用this访问,否则访问不了。等同于deng.属性值=
    Snipaste_2020-12-30_11-16-09.png
    • 对象创建方法
    1. var obj = {} plainObject 对象字面量/对象直接量
    2. 构造函数
      2.1 系统自带的构造函数 new Object()
      2.2 自定义
    Snipaste_2020-12-30_14-56-12.png
    • 构造函数的隐式操作
      • 构造函数看着和普通函数没什么两样,只不过里面都要加this.是new()让它起构造函数的作用。隐含着一开始var this = {} ,最后return this的操作。
    Snipaste_2020-12-30_15-05-54.png

    包装类

    var str = "abcd"; str.length = 2; 看似str直接调通的length,实际上是隐式地new String('abcd').length。str 本身没有.length

    原型

    • 定义:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。

    • 利用原型特点和概念,可以提取共有属性。

    • 对象如何查看原型 ==》隐式属性proto

      Snipaste_2020-12-30_16-13-15.png
    • 对象如何查看对象的构造函数 ==》constructor

    • 这里打印的是sunny,因为proto指向的还是sunny那个地址。new之后,底下的写法换了一整个prototype。如果把底下的cherry放在new之前也能打印cherry

      Snipaste_2020-12-30_16-24-22.png
    • 这里打印的是b


      Snipaste_2020-12-30_16-55-59.png

    call/apply

    • 作用:改变this指向
    • 区别,后面传的参数形式不同,apply后面传一个arguments


      Snipaste_2020-12-30_17-14-44.png
      Snipaste_2020-12-30_17-29-10.png

    继承

    • 圣杯模式


      Snipaste_2021-01-04_14-26-11.png

    使用技巧

    • []等于访问属性
    Snipaste_2021-01-04_15-24-50.png
    • 使用方法的连续调用可以return this
    Snipaste_2021-01-04_15-25-48.png
    • for in循环遍历对象属性
    Snipaste_2021-01-04_15-56-43.png
    • 循环去除prop里的属性
    Snipaste_2021-01-04_16-06-49.png

    this

    1. 函数预编译过程this ===> window
    2. 全局作用域里this ====> window
    3. call/apply 可以改变函数运行时this指向
    4. obj.func(); func()里面的this指向obj

    数组

    • 改变原数组

      • push,pop,shift(操作第一位),unshift,sort,reverse,splice(从第几位开始,截取多少的长度,在切口处添加新的数据)
    • 不改变原数组

      • concat(连接两个或多个数组),join(把数组中的所有元素放入一个字符串) ->split,toString,slice(从该位开始截取,截取到该位,正负数)
    • 类数组

    Snipaste_2021-01-05_10-59-17.png

    错误

    • Error.name的六种值对应的信息
    1. EvalError: eval()的使用与定义不一致
    2. RangeError: 数值越界
    3. ReferenceError: 非法或不能识别的引用数值
    4. SyntaxError: 发生语法解析错误
    5. TypeError: 操作数类型错误
    6. URIError: URI处理函数使用不当

    es5严格模式

    • "use strict"
    • 不再兼容es3的一些不规则语法,使用全新的es5规范
    • 就是一行字符串,不会对不兼容严格模式的浏览器产生影像
    • 局部this必须被赋值(预编译不再指向windows,就是undefined),赋值什么就是什么
    • 拒绝重复属性和参数。

    DOM

    • 节点
      • 四个属性:
        • nodeName:元素的标签名,以大写形式表示,只读
        • nodeValue:text节点或Comment节点的文本内容,可读写
        • nodeType:该节点的类型,只读
        • attributes: Element节点的属性集合
        • 节点的一个方法:Node.hasChildNodes();
    • DOM结构树


      Snipaste_2021-01-05_16-47-24.png

    事件

    Snipaste_2021-01-06_15-31-47.png Snipaste_2021-01-06_15-38-48.png
    • 事件冒泡和捕获


      Snipaste_2021-01-06_16-01-19.png
    • 取消冒泡和阻止默认事件


      Snipaste_2021-01-06_16-39-51.png
    • 事件委托


      Snipaste_2021-01-06_16-55-30.png
    • 例子:

    Snipaste_2021-01-06_16-58-29.png

    Json

    • 以对象为样板,本质上就是对象,但用途有区别,对象就是本地用的,json是用来传输的
    • JSON.parse(); string -> json
    • JSON.stringify; json -> string

    相关文章

      网友评论

          本文标题:javascript

          本文链接:https://www.haomeiwen.com/subject/dpebnktx.html