• javascript 常用知识点


    1:浏览器是有缓存的,开发中可以通过快捷键绕过缓存

      对于Windows驱动的系统:Ctrl + F5

      对于Mac驱动的系统:Command + Shift + R.

    2:精度问题 (符点和大数字可能会导致精度出现问题)

      0.1 + 0.2 == 0.3;    // false  判断符点的==时需注意

          99999999999999999 === 100000000000000000    // true   大整数丢失精度

         12.235.toFixed(2)   // 12.23 难道是我概念理解错了?

    3:Promise (Promise是个承诺.  new Promise(function(resolve, reject){})  一言即出,四马难追.)

    4:闭包函数. (函数创建的时候,scope就确定了)

        var a = 0;
    
        function addCount() {
    
        a++;
    
      }
    
       // 修改下使之成为一个闭包
    
       function addCount() {
    
        var a = 0;
    
            return function() {
    
        a++;
    
       }  
    
      }
    

    5: 箭头函数. (箭头函数对懒人来说很有用,看上去清晰多了 )

        const add = x => y => x + y;

        add(10)(1);

    6: 判断相等.  (判断是值的判断,对像和对像判断是判断地址,对象和原始数据判断是,是先把对象转化原始数据)

       console.log(null == 0);              // false

       console.log(Boolean("0"));        // true

       console.log([] == 0);                 // true.  对象与基本数据判断的时候,对象会先转化为基本数据

       console.log({valueOf:()=>5} == 5);   // ture

       console.log(Boolan([]));            // true;

    7:let 与 var的区别

    //------ 全局变量a由var命令声明,所以它是顶层对象的属性;全局变量b由let命令声明,所以它不是顶层对象的属性
    var a = 1;
    console.log(window.a);     // 1
    let b = 1;
    console.log(window.b);     // undefined
    
    // ------let 自带作用域--------------------------------------------------------------------------
    let name1 = "hong";
    (function(){
    	let name1 = "honghong"
    })();
    console.log(name1);         // honghong
    
    var name = "hong";
    (function() {
    	name = "honghong";
    })();
    console.log(name);         // honghong
    
    //---------------------------------------------------------与闭包相关----------------------------
    // 用let实现闭包
    var array = [];
    for (let i = 0; i < 5; i++) {
    	array.push(function(){
    		console.log("i:", i)
    	});
    }
    array[2]();              // 输出2
    
    // 用var
    array = [];
    for (var j = 0; j < 5; j++) {
    	array.push(function(){
    		console.log("i:", j);
    	});
    }
    array[2]();             // 输出5
    
    // 用闭包实现
    array = [];
    for (var j = 0; j < 5; j++) {
    	array.push((function(index){
    	     return function() {
    			console.log("i", index);
    		}
    	})(j));
    }
    console.log(array[2]());             // 输出2
    

    8:二进制 ArrayBuffer, TypedBuffer,  DataView

      ArrayBuffer代表储存二进制数据的一段内存.不能直接用来读写。只能被TypeArray或DataView"包装"后,方才能读写

      TypedBuffer用来读写简单的二进制数据(参数 arraybuffer, 起始位置,  长度 | 普通数组 | count )

      DataView用来读写复杂的二进制数据(参数 arraybuffer, 起始位置,count )

      const buffer = new ArrayBuffer(24);

      const uint32Array = new Uint32Array(buffer, 0, 1);

      const uint3Array = new Uint8Array(buffer, 4, 16);

      const float32Array = new Float32Array(buffer, 20, 1);

      上面代码将一个 24 字节长度的ArrayBuffer对象,分成三个部分:

    • 字节 0 到字节 3:1 个 32 位无符号整数
    • 字节 4 到字节 19:16 个 8 位整数
    • 字节 20 到字节 23:1 个 32 位浮点数

    9:async返回一个Promise. async函数内部return语句返回的值会成为then方法回调函数的参数

    async function f() {
         return 'hello world';
    }
    f().then(v => console.log(v))
    

    10:正则表达式

    (x)     匹配 'x' 并且记住匹配项        例   'bar foo'.replace( /(bar) (foo)/, '$2 $1');    // foo bar

      (?:x)   匹配 'x' 并且不记住匹配项

      x(?=y) 匹配 'x'并且后面跟着y

      x(!=y) 匹配 'x'并且后面不跟着y

            匹配一个词的边界

    11:webgl用的是右手坐标系

    12:symbol 是原始数据,可表示唯一的值. Symbol("bar) == Symbol("bar") // false    Symbol.from("bar") == Symbol.from("bar") // true

    13:Iterator 接口的目的,就是为所有数据结构,提供了一种统一的访问机制

    14:VO|AO (听起来很高大上,理解下,装装逼)

          EC的建立分两阶段

        进入上下文阶段:发生在函数调用时,但是在执行具体代码之前(比如,对函数参数进行具体化之前)

                执行代码阶段:变量赋值,函数引用,执行其他代码。

    AO示例:
    
    function test(a, b) {
      var c = 10;
      function d() {}
      var e = function _e() {};
      (function x() {});
    }
     
    test(10); // call
    当进入test(10)的执行上下文时,它的AO为:
    
    testEC={
        AO:{
            arguments:{
                callee:test
                length:1,
                0:10
            },
            a:10,
            c:undefined,
            d:<reference to FunctionDeclaration "d">,
            e:undefined
        }
    };
    由此可见,在建立阶段,VO除了arguments,函数的声明,以及参数被赋予了具体的属性值,其它的变量属性默认的都是undefined。函数表达式不会对VO造成影响,因此,(function x() {})并不会存在于VO中。
    
    当执行test(10)时,它的AO为:
    
    testEC={
        AO:{
            arguments:{
                callee:test,
                length:1,
                0:10
            },
            a:10,
            c:10,
            d:<reference to FunctionDeclaration "d">,
            e:<reference to FunctionDeclaration "e">
        }
    };
    可见,只有在这个阶段,变量属性才会被赋具体的值。

    15:知识概念 举例说明 


    // 填充VO的顺序是: 函数的形参 -> 函数申明 -> 变量申明。当变量申明遇到VO中已经有同名的时候,不会影响已经存在的属性
    function a(x) { return x * 2; } var a; console.log(a);
    // 活动对象是在进入函数上下文时刻被创建的,它通过函数的arguments属性初始化
    function b(x, y, a) {
    arguments[2] = 10;
    console.log(a);
    }
    b(1, 2);

    // __proto__ 指向原型对象
    function A(){};
    A.prototype.getName = function(){return console.log("honghong")};
    var a = new A();
    a.getName(); // honghong
    a.__proto__ = null;
    console.log(a instanceof A); // 检查a是否是A的原型 false
    a.getName(); // 指向的原型为空,所以报错

    // 构造函数动态传参
    function People(a, b, c) {
      this.a = a;
      this.b = b;
      this.c = c;
    }
    People.prototype.say = function() {
      console.log("say hello");
    }
    var obj = {};
    People.apply(obj, [1,2,3]);
    obj.__proto__ = People.prototype;
    console.log(obj.a,obj.b,obj.c);
    console.log(obj.say);


    16:防盗链的实现可以通过设置HTTP Header中的Referer实现

        base标签很有用,可以本地看线上的一些效果

        xml一般只在浏览器会有支持,像nodejs,小游戏等不支持xml,这时就需要把xml转化成json,或使用 window.DOMParser = require("./xmldom/xmldom.js").DOMParser

    17:es6写法

       var obj1 = {}, var obj2 = {...obj1}, 浅复制的另一种写法

  • 相关阅读:
    macOS10.9+xcode6编译ffmpeg2.4.2 for ios
    [think in java]第12章 通过异常处理错误
    机房合作感受
    LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)
    Java继承
    jQuery学习笔记之DOM操作、事件绑定(2)
    intellij IDEA常见操作
    log4j.properties配置详解
    jQuery学习笔记之概念(1)
    VC常用代码之创建进程
  • 原文地址:https://www.cnblogs.com/honghong87/p/9800479.html
Copyright © 2020-2023  润新知