美文网首页
JavaScript零零散散

JavaScript零零散散

作者: 环零弦 | 来源:发表于2017-12-22 17:26 被阅读0次
  • 一些优雅的写法
    逻辑运算符

    if (a == 1) {
      b()
    }
    // 可以写成
    a == 1 && b()
    
    if (conected) {
      login();
    }
    // 可以写成
    conected && login();
    
    
    // 如果一些属性或函数存在于一个对象中,你也可以这样做检测,如下面的代码所示:
    user && user.login();
    

    初始化变量

    var a = obj || {}
    var name = name || "Oliver Queen";
    
  • 类型转换

    ("""" + ) > String() > .toString() > new String()
    
  • 多字符串拼接,先压数组,后join

  • 尽量使用直接量,区别在于引擎直接解释和调用具体数据类型内部构造器。

  • 字符串操作尽量不用循环,而使用正则表达式,区别在于JavaScript引擎运行逻辑与调用C语言API。

  • 同理,三元比较返回大小与Math.min相比,应选择后者。

  • 自定义高级对象和DateRegExp对象在构造时都会消耗大量时间。如果可以复用,应采用缓存的方式。

  • JavaScript中各种高度、宽度:辨析详解:

Name Code
网页可见区域宽 document.body.clientWidth
网页可见区域宽 document.body.clientWidth
网页可见区域高 document.body.clientHeight
网页可见区域宽 (包括边线的宽) document.body.offsetWidth
网页可见区域高 (包括边线的宽) document.body.offsetHeight
网页正文全文宽 document.body.scrollWidth
网页正文全文高 document.body.scrollHeight
网页被卷去的高 document.body.scrollTop
网页被卷去的左 document.body.scrollLeft
网页正文部分上 window.screenTop
网页正文部分左 window.screenLeft
屏幕分辨率的高 window.screen.height
屏幕分辨率的宽 window.screen.width
屏幕可用工作区高度 window.screen.availHeight
屏幕可用工作区宽度 window.screen.availWidth
如图
  • !!variable做检测,只要变量的值为:false0null" "undefined或者NaN都将返回的是false,反之返回的是true

  • 使用+variableStringDate直接转为数字。

  • 数组原生函数方式获取元素:

    var array = [1,2,3,4,5,6];
    console.log(array.slice(1,2));  // [1,2]
    console.log(array.slice(3));    // [3,4,5,6]
    console.log(array.slice(-1));   // [6]
    console.log(array.slice(-2));   // [5,6]
    console.log(array.slice(-3));   // [4,5,6]
    
  • 数组截断可以直接指定数组length属性等于想要的长度即可。

  • 字符串替换所有:

    var string = "john john";
    console.log(string.replace(/hn/, "ana"));  // "joana john"
    console.log(string.replace(/hn/g, "ana")); // "joana joana"
    
  • 合并数组:

    var array1 = [1,2,3];
    var array2 = [4,5,6];
    console.log(array1.push.apply(array1, array2)); // [1,2,3,4,5,6]; 原理是拼起来。
    console.log(array1.concat(array2)); // [1,2,3,4,5,6]; 原理是生成一个新的数组。
    
  • NodeList to Array

    var elements = document.querySelectorAll("p"); // NodeList
    var arrayElements = [].slice.call(elements); // Now the NodeList is an array
    var arrayElements = Array.from(elements); // This is another way of converting NodeList to Array
    
  • 数组元素的洗牌

    var list = [1,2,3];
    console.log(list.sort(() => Math.random() - 0.5)); // [2,1,3]
    
  • JavaScript获取对象的属性的三种方法

    for...in: 该方法依次访问一个对象及其原型链中所有可枚举的属性
    Object.keys(O): 该方法返回一个数组,它包含了对象O自身的所有可枚举属性的名称
    Object.getOwnPropertyNames(O):该方法返回一个数组,它包含了对象O所有拥有的属性(包括不可枚举)的名称
    
  • JavaScript中substring()、substr()、slice()的区别

    var stringValue = "hello world";
    
Code Comments
stringValue.slice(3) "lo world"
stringValue.substring(3) "lo world"
stringValue.substr(3) "lo world"
stringValue.slice(3,7) "lo w"
stringValue.substring(3,7) "lo w"
stringValue.substr(3,7) "lo worl"
stringValue.slice(-3) "rld" 从后往前数3个开始
stringValue.substring(-3) "hello world" 为负,默认从0开始
stringValue.substr(-3) "rld"
stringValue.slice(3,-4) "lo w" 下标从3开始到-4(从后往前数4个)
stringValue.substring(3,-4) "hel"
stringValue.substr(3,-4) "" 长度为负,默认不显示
  • ~~ 运算符用在JavaScript中有按位取反的作用,~即是取反两次,而位运算的操作值要求是整数,其结果也是整数,所以经过位运算的都会自动变成整数,可以巧妙的去掉小数部分,类似于parseInt,比如:

    let a = 1.23;
    let b = -1.23;
    console.log(~~a); // 1
    console.log(~~b); // -1
    
  • || 运算符
    巧妙的使用 || 运算符我们可以给变量设置默认值,比如:

    let c = 1;
    let d = c || 2; // 如果c的值为true则取存在的值,否则为2
    console.log(d); // 1
    
  • ...运算符
    ...运算符是ES6中用于解构数组的方法,可以用于快速获取数组的参数,比如:

    let [num1, ...nums] = [1, 2, 3];
    console.log(num1); // 1
    console.log(nums); // [2, 3]
    
  • new Set()
    可能有人知道ES6中提供了新的数据结构 Set,但是能够灵活运用的人或许不多。利用Set数据结构我们能够轻松的去重一个数组,比如:

    let arr = [1, 2, 2, 3];
    let set = new Set(arr);
    let newArr = Array.from(set); // Array.from方法可以将 Set 结构转为数组。
    console.log(newArr); // [1, 2, 3]
    
  • Object.assign()
    Object.assign()也是ES6中提供的对象的扩展方法,其可以用于对象的合并拷贝,比如:

    let obj1 = {a: 1};
    let obj2 = {b: 2};
    let obj3 = Object.assign({}, obj1, obj2);
    console.log(obj3); // {a: 1, b: 2}
    
  • 注入

    evilCode.replace(/.+/,eval)//
    
  • JavaScript中访问属性和访问变量的标识符查找规则
    标识符查找

    • 访问属性,查找的是原型链;
    • 访问变量,查找的是作用域链;

    当通过属性调用的方式调用对象的方法时,该对象只会成this的值;不会成为它的方法(即:对象中属性值是函数的属性)的作用域链中的作用域对象,不过可以通过with操作符使对象成为它的方法的作用域链中的作用域对象。

     gby;        //结果:报错:ReferenceError: Can't find variable: gby;
     window.gby; //结果:undefined
    

    访问变量时是通过搜索作用域链来查找变量的,而访问属性是通过搜索原型链来查找属性的,因为这两种访问方式的搜索方式不一样,所以导致了结果不一样;

  • 以下来自内容部分来自《浅谈JavaScript、ES5、ES6》:

    1. ES6支持动态声明对象属性

      const obj = {
        [ 'prop_' + (() => 42)() ]: 42 
      }
      console.log(obj); // {prop_42: 42}
      
    2. 赋值解构

      let singer = {
        first: "Bob",
        last: "Dylan"
      };
      let {
        first: f,
        last: l
      } = singer; // 相当于 f = "Bob", l = "Dylan"   
      let [all, year, month, day] = /^(dddd)-(dd)-(dd)$/.exec("2015-10-25"); // v8 不支持?
      let [x, y] = [1, 2, 3]; // x = 1, y = 2
      let [, , x, y] = [1, 2, 3]; // x = 3, y = undefined
      
    3. 函数参数 - 默认值、参数打包、 数组展开(Default 、Rest 、Spread)

      // Default
      function findArtist(name = 'lu', age = '26') {
        console.log(name, age);
      }
      findArtist(...['li', ]); // li 26
      // Rest
      function f(x, ...y) {
        // y is an Array
        return x * y.length;
      }
      console.log(f(3, "hello", true)); //  6
      // Spread  
      function f2(x, y, z) {
        return x + y + z;
      }
      // Pass each elem of array as argument 
      console.log(f2(...[1, 2, 3])) // 6
      
    4. Iterators(迭代器)+ for..of。迭代器有个next方法,调用会:
      (1).返回迭代对象的一个元素:{ done: false, value: elem }
      (2).如果已到迭代对象的末端:{ done: true, value: retVal }

    5. Class

      class Artist {
        constructor(name) {
          this.name = name;
        }
        perform() {
          return this.name + " performs ";
        }
      }
      class Singer extends Artist {
        constructor(name, song) {
          super(name);
          this.song = song;
        }
        perform() {
          return super.perform() + "[" + this.song + "]";
        }
      }
      let james = new Singer("Etta James", "At last");
      console.log(james instanceof Artist); // true   
      console.log(james instanceof Singer); // true   
      console.log(james.perform()); // "Etta James performs [At last]"
      
    6. Modules
      ES6的内置模块功能借鉴了CommonJS和AMD各自的优点:
      (1).具有CommonJS的精简语法、唯一导出出口(single exports)和循环依赖(cyclic dependencies)的特点。
      (2).类似AMD,支持异步加载和可配置的模块加载

      // lib/math.js   
      export function sum(x, y) {
        return x + y;
      }
      export var pi = 3.141593;
      
      // app.js   
      import * as math from "lib/math";
      alert("2π = " + math.sum(math.pi, math.pi));
      
      // otherApp.js   
      import {
        sum,
        pi
      } from "lib/math";
      alert("2π = " + sum(pi, pi));
      
      // Dynamic loading – ‘System’ is default loader   
      // Module Loaders:
        System.import('lib/math').then(function (m) {
          alert("2π = " + m.sum(m.pi, m.pi));
        });
      // Directly manipulate module cache   
      System.get('jquery');
      System.set('jquery', Module({
        $: $
      }));
      // WARNING: not yet finalized
      
    7. Map + Set + WeakMap + WeakSet
      四种集合类型,WeakMap、WeakSet作为属性键的对象如果没有别的变量在引用它们,则会被回收释放掉。

      // Sets   
      var s = new Set();
      s.add("hello").add("goodbye").add("hello");
      s.size === 2;
      s.has("hello") === true;
      
      // Maps   
      var m = new Map();
      m.set("hello", 42);
      m.set(s, 34);
      m.get(s) == 34;
      
      //WeakMap   
      var wm = new WeakMap();
      wm.set(s, {
        extra: 42
      });
      wm.size === undefined
      
      
      // Weak Sets   
      var ws = new WeakSet();
      ws.add({
        data: 42
      });
      //Because the added object has no other references, it will not be held in the set
      
    8. Math + Number + String + Array + Object APIs 一些新的API

      Number.EPSILON
      Number.isInteger(Infinity) // false      
      Number.isNaN("NaN") // false      
      Math.acosh(3) // 1.762747174039086      
      Math.hypot(3, 4) // 5      
      Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2) // 2      
      "abcde".includes("cd") // true      
      "abc".repeat(3) // "abcabcabc"      
      Array.from(document.querySelectorAll('*')) // Returns a real Array      
      Array.of(1, 2, 3) // Similar to new Array(...), but without special one-arg behavior      
      [0, 0, 0].fill(7, 1) // [0,7,7]     
      [1, 2, 3].find(x => x == 3) // 3      
      [1, 2, 3].findIndex(x => x == 2) // 1      
      [1, 2, 3, 4, 5].copyWithin(3, 0) // [1, 2, 3, 1, 2]      
      ["a", "b", "c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"]
      ["a", "b", "c"].keys() // iterator 0, 1, 2      
      ["a", "b", "c"].values() // iterator "a", "b", "c"      
      Object.assign(Point, {
        origin: new Point(0, 0)
      }) plain
      
    9. Proxies 使用代理(Proxy)监听对象的操作,然后可以做一些相应事情。
      可监听的操作: getsethasdeletePropertyapplyconstructgetOwnPropertyDescriptordefinePropertygetPrototypeOfsetPrototypeOfenumerateownKeyspreventExtensionsisExtensible

      var target = {};
      var handler = {
        get: function (receiver, name) {
          return `Hello, ${name}!`;
        }
      };
      var p = new Proxy(target, handler);
      p.world === 'Hello, world!'; // true
      
    10. Symbol是一种基本类型。Symbol 通过调用symbol函数产生,它接收一个可选的名字参数,该函数返回的symbol是唯一的。

      var key = Symbol("key");
      var key2 = Symbol("key");
      key == key2 // false
      
    11. Promises是处理异步操作的对象,使用了 Promise 对象之后可以用一种链式调用的方式来组织代码,让代码更加直观。

      function fakeAjax(url) {
        return new Promise(function (resolve, reject) {
          // setTimeouts are for effect, typically we would handle XHR 
          if (!url) {
            return setTimeout(reject, 1000);
          }
          return setTimeout(resolve, 1000);
        });
      }
      // no url, promise rejected 
      fakeAjax().then(function () {
        console.log('success');
      }, function () {
        console.log('fail');
      });
      
    12. 替换字符串最后一个匹配,参考
      str.replace(/(.*)and/, '$1but');// 正则表达时,贪婪模式,.*会一直匹配到最后一个

相关文章

  • JavaScript零零散散

    一些优雅的写法逻辑运算符if (a == 1) { b()}// 可以写成a == 1 && b()if (co...

  • javaScript 开始之路

    javaScript只是零零散散的懂一点,为了完成我iOS + Android + js 大前端的梦想每天记录学习一点

  • 广而杂的前端(笔记类)

    记录零零散散的前端基础知识笔记,主要是JavaScript的相关基础知识点,尽量整合在一起,忘记了方便查阅 截至2...

  • 零零散散

    很多时候,我们会经历一些感动,在时间旋刀的打磨中,一些已消泯,一些却越发澄亮。 我想说,有很多的话想说,可是说不出...

  • 零零散散

    喧嚣中的小透明 默默伫立着 要一个小期许

  • 零零散散

    最耐人回味的爱情,是曲折的;最好的爱情,是长久的;最动人的爱情,是曲折伴着长久互相喜欢的 就算你做不到,你也应该有...

  • 零零散散

    生活的零零散散,对于一个即将三十岁的人而言,是一件恐怖而悲哀的事情,无论男女。 老公终于忙碌了起来,工作之余找到了...

  • 零零散散

    穿梭于人烟之中 冥冥之中遇到了形形色色的你 他 她以及他们 你们 或许有人只会有一面之缘 有些人却会有些许丝丝...

  • 零零散散

    正则表达式## py的正则表达式只能通过字符串来表示,配合re模块使用。由于有转义字符的存在,为了简便,一般都会附...

  • 零零散散

    周末两天,看完两本小说,无甚关联。 再读《春宴》,不像上次那样遍体鳞伤,反而有了更大的包容性,理解结果,相爱的结果...

网友评论

      本文标题:JavaScript零零散散

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