• javascript基础复习/重新学习


    与其说复习,不如说重新学习。这里记录一下学习过程中想要记录的东西,以便于以后温习。

    ECMAScript原始数据类型:String、Number、Boolean、Undefined、Null

    对变量或者值调用typeof运算符将返回下列值之一:
    undefined - 如果变量是Undefined类型的
    string - 如果变量是String类型的
    number - 如果变量是Number类型的
    boolean - 如果变量是Boolean类型的
    object - 如果变量是一种引用类型或Null类型
    function-如果变量是一个函数
     
    ECMAScript运算符
    一元运算符 
    delete 只能删除开发者定义的属性和方法,不能删除ECMAScript的原始方法,例如toString()
    var o={name:"minnie",age:8};
    alert(o.name);//输出minnie;
    delete o.name
    alert(o.name);//输出undefined;
    void 运算符对任何值返回undefined。该运算符通常用于避免输出不应该输出的值。例如
    <a href="javascript:window.open('about:blank')">click me</a>
    当在页面点击"click me"时,即可看到屏幕上显示【object】,使用
    <a href="javascript:void(window.open('about:blank'))">click me</a>
    void使window.open()返回undefined,undefined不是有效值,不会显示在浏览器窗口。
    注:高版本浏览器并未出现【object】情况
     
    前增量/前减量运算符  ++/--运算符
    加减执行在计算表达式之前,所以在执行表达式的时候已经加减过,所以表达式的值和参数的值一致。
     
     
    javascript语言的特殊之处:
    1.函数内部可以直接读取全局变量
    2.函数内部声明变量必须用var,否则声明的是一个全局变量(全局变量声明可以不用 var)
    闭包的最大优点:
    1.在函数外部访问函数内部的变量
    2.让这些变量的值始终保持在内存中
    闭包的缺点:
    1.闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄漏。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
    2.闭包会在父函数外部改变函数内部变量的值。所以,如果把父函数当做对象使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。
     
    闭包陷阱一:
    function createFunctions(){
      var result = new Array();
      for (var i=0; i < 10; i++){
        result[i] = function(){
          return i;
        };
      }
      return result;
    }
    var funcs = createFunctions();
    for (var i=0; i < funcs.length; i++){
      console.log(funcs[i]());
    }
    乍一看,以为输出0-9,其实输出10个10;这里的陷阱就是函数带()才是执行函数
    总结:闭包就是一个函数引用另一个函数的变量,因为变量被引用着所以不会被回收;不必要的引用(闭包)就是徒增内存消耗。
     
     
    javascript的原型(原型链和作用域链)
    一切(引用类型)都是对象,对象是属性的集合。
    ------------------------------------------------------------------------------------------------------------------
    ==和===的区别
    == 等于(值)  会将引用类型转换为基本类型做比较
        使用==进行比较的时候,如果是引用类型会先转为基本类型,对象转换为基本类型时默认先使用valueOf转,再使用toString()转,Date先使用toString()转。如下代码测试:
    var x = "";
    var obj = {toString : function(){x="toString";return 0},valueOf : function(){x="valueOf";return 0}};
    console.log(obj==0,x);//true,"valueOf"
    var x = "";
    var obj = {toString : function(){x="toString";return 0}};
    console.log(obj==0,x);//true,"toString"
    使用==比较也可能有副作用,甚至会产生异常
    var x = "";
    var obj = {toString : function(){x="toString";return {}}};
    console.log(obj==0,x);//Uncaught TypeError:Cannot convert object to primitive value
     
    === 全等(值和类型)
     
    ----------------------------------------------------------------------------------------------------
    __proto__
    每个对象都有一个__proto__属性,指向创建该对象的函数的prototype.
    ------------------------------------------------------------------------------------------------------
    instanceof 运算符
    判断规则:
    A instanceof B  (个人理解为:判断A是否指向B的原型。A(对象有一个隐藏属性__proto__)B(函数有一个默认属性prototype))
    A--对象  B--函数
    instanceof判断规则是:沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即是同一个对象,那么就返回true;如果找到重点还未重合,则返回false。
    例如:
    console.log(Object instanceof Function);//true
    //Object.__proto__ === Function.prototype
    console.log(Function instanceof Object);//true
    //Function.__proto === Function.prototype === Function.prototype.__proto__ === Object.prototype;
    console.log(Function instanceof Function);//true
    //Function.__proto__ === Function.protorype
    总结:instanceof表示的就是一种继承关系,或者原型链的结构
     
    函数是一种对象,对象由函数生成。
    --------------------------------------------------------------------------------------------------------
    Object.prototype.hasOwnProperty
    所有对象都有Object.prototype的方法,所有函数都有call,apply方法,都有length,arguments,caller等属性。
    -------------------------------------------------------------------------------------------------------
    in运算符
    prop in Object  指定属性(只能是属性名,数组只能是索引值)存在于指定对象中
        使用delete运算符删除一个属性,则in运算符对所删除属性返回false:
    var str = {"name":"minnie","age":8,"class":"xiaoxue"};
    delete str.class;
    "class" in str;//false;
        将属性赋值为undefined,则in运算符依然返回true.
    var str = {"name":"minnie","age":8,"class":"xiaoxue"};
    str.class = undefined;
    "class" in str;//true
        如果属性是从原型链上继承的,in运算符也会返回true
    "toString" in {};//true
    变量、函数声明、函数表达式
    javascript在执行一个代码段之前,会先有准备工作,然后才是代码的执行。这个“代码段”分为三种情况--全局、函数、eval
    准备工作:
    1.变量的声明  
    2.函数表达式上的变量声明  默认赋值为undefined 
    3.this赋值
    4.函数声明--赋值
    这些步骤组成了“执行上下文”或者“执行上下文环境”
     
     
  • 相关阅读:
    nginx 配置以及常用命令
    django TypeError: 'module' object is not callable
    Django Meta内部类选项
    安装MySQL后要做的事
    MySQL存储引擎
    kali linux 2018.2 mysql密码修改后无效,外部无法连接问题。
    Django中CSS加载background url('')问题
    升级OPENSSH 和 OPENSSL
    Git创建仓库的方法(github翻译)
    Git标签(版本)管理
  • 原文地址:https://www.cnblogs.com/ctlg/p/6489595.html
Copyright © 2020-2023  润新知