• 原生JS 基础总结


    0. 好习惯    分号  ;  花括号 {}, var   弄清楚 null  , undefined  区别 , isNaN, === 与  == 区别
    1.  prompt , confirm , alert  不同框框
    数组常用方法
    var arr = [10, 20, '30', 'xyz'];
    arr.indexOf(10); // 元素10的索引为0
    arr.indexOf(20); // 元素20的索引为1
    arr.indexOf(30); // 元素30没有找到,返回-1
    arr.indexOf('30'); // 元素'30'的索引为2
    
    var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
    arr.slice(0, 3); // 从索引0开始,到索引3结束,但不包括索引3: ['A', 'B', 'C']
    arr.slice(3); // 从索引3开始到结束: ['D', 'E', 'F', 'G']
    push和pop
    push()向Array的末尾添加若干元素,pop()则把Array的最后一个元素删除掉:
    var arr = ['B', 'C', 'A'];
    arr.sort();
    arr; // ['A', 'B', 'C']
    
    unshift和shift
    如果要往Array的头部添加若干元素,使用unshift()方法,shift()方法则把Array的第一个元素删掉:
    
    var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
    // 从索引2开始删除3个元素,然后再添加两个元素:
    arr.splice(2, 3, 'Google', 'Facebook'); // 返回删除的元素 ['Yahoo', 'AOL', 'Excite']
    arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
    // 只删除,不添加:
    arr.splice(2, 2); // ['Google', 'Facebook']
    arr; // ['Microsoft', 'Apple', 'Oracle']
    // 只添加,不删除:
    arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因为没有删除任何元素
    arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
    
    var arr = ['A', 'B', 'C', 1, 2, 3];
    arr.join('-'); // 'A-B-C-1-2-3'
    
    2.  如果if的条件判断语句结果不是true或false怎么办
    
         JavaScript把null、undefined、0、NaN和空字符串''视为false,其他值一概视为true
    
    3. //三种方式遍历数组
    'use strict';
    var arr = ['小明', '小红', '大军', '阿黄'];
    arr.sort().forEach(function(name){
      console.log("欢迎 "+name);
    });
    
    
    
    'use strict';
    var arr = ['Bart', 'Lisa', 'Adam'];
    
    for(var i=0;i<arr.length;i++){
        alert(arr[i]);
    }
    
    for(var name of arr){
       console.log(name);
    }
    
    arr.foreach(function(name){
       console.log(name);
    });
    
    
    //Set 与 Map 的遍历
    
    var userSet=new Set(["user1","user2","user3"]);
    for(var user of userSet){
        console.log(user);
    }
    
    var userInfoMap=new Map([['jimi',12],['tom',17]]);
    for(var userInfo of userInfoMap){
        console.log(userInfo[0]+'--><--'+userInfo[1]);
    }
    4. 判断本身自己有的属性,去掉继承过来的属性 如 Object 的 toString 等等
    var person={
        name:"闹着玩",
        age: 18
    }
    for(var prop in person){
        if(person.hasOwnProperty(prop))
        console.log(person[prop]);
    }
    
    5. 函数 与 错误处理  (异步函数的错误只能够在内部捕获,外层包裹 try catch 并不会有什么卵用)
    var abc=function(num){
        if(typeof  num !='number'){
            throw new Error('not a number');
        }
        else{
            if(num>=0){
                return num;
            }
            else
                return -num;
        }
    };
    try{
        //abc('ssf');
        alert(abc(-129));
    }
    catch(err){
        console.log(err.message);
    }
    
    6.  变量申明提升,赋值不会提升
    我们在函数内部定义变量时,请严格遵守“在函数内部首先申明所有变量”这一规则。最常见的做法是用一个var申明函数内部用到的所有变量:
    function foo() {
        var
            x = 1, // x初始化为1
            y = x + 1, // y初始化为2
            z, i; // z和i为undefined
        // 其他语句:
        for (i=0; i<100; i++) {
            ...
        }
    }
    
    7. JSON 序列化生成字符串与反序列化生成对象
    var xiaoming = {
        name: '小明',
        age: 14,
        gender: true,
        height: 1.65,
        grade: null,
        'middle-school': '"W3C" Middle School',
        skills: ['JavaScript', 'Java', 'Python', 'Lisp']
    };
    
    var s = JSON.stringify(xiaoming);
    var person=JSON.parse(s);
    console.log('name: '+person.name);
    console.log(s);
    
    var arr = [1, 2, 3];
    
    其原型链是:
    arr ----> Array.prototype ----> Object.prototype ----> null
    
    函数也是一个对象,它的原型链是:
    foo ----> Function.prototype ----> Object.prototype ----> null
    
    function Person(name){
        this.name=name;
        this.hello=function(){
            alert('Hello '+this.name+' !');
        }
    }
    var person=new Person('frank');
    var personStr=JSON.stringify(person);
    alert(personStr);
    
    由于Function.prototype定义了apply()等方法,因此,所有函数都可以调用apply()方法。
    很容易想到,如果原型链很长,那么访问一个对象的属性就会因为花更多的时间查找而变得更慢,因此要注意不要把原型链搞得太长。
    7. map /reduce 
    
    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    var result=arr.map(function pow(x) {
        return x * x;
    });
    alert(result);
    
    'use strict';
    
    function product(arr) {
    return arr.reduce(function multi_all(x,y){
      return x*y;
    });
    }
    
    // 测试:
    if (product([1, 2, 3, 4]) === 24 && product([0, 1, 2]) === 0 && product([99, 88, 77, 66]) === 44274384) {
        console.log('测试通过!');
    }
    else {
        console.log('测试失败!');
    
    
    
    'use strict';
    
    function string2int(s) {
      var strArray=s.split("");
        return strArray.map(function(x){
                               return +x;
                             })
                       .reduce(function(x,y){
                             return (x*10)+y;
                        });
    }
    
    // 测试:
    if (string2int('0') === 0 && string2int('12345') === 12345 && string2int('12300') === 12300) {
        if (string2int.toString().indexOf('parseInt') !== -1) {
            console.log('请勿使用parseInt()!');
        } else if (string2int.toString().indexOf('Number') !== -1) {
            console.log('请勿使用Number()!');
        } else {
            console.log('测试通过!');
        }
    }
    else {
        console.log('测试失败!');
    }
    
    
    ////////------------------------==================
    'use strict';
    
    var arr = ['1', '2', '3'];
    var r;
    r = arr.map(parseInt);
    
    console.log(r);
    
    结果竟然是1, NaN, NaN,小明百思不得其解,请帮他找到原因并修正代码。
    提示:参考Array.prototype.map()的文档。
    由于map()接收的回调函数可以有3个参数:callback(currentValue, index, array),通常我们仅需要第一个参数,而忽略了传入的后面两个参数。不幸的是,parseInt(string, radix)没有忽略第二个参数,导致实际执行的函数分别是:
    parseInt('0', 0); // 0, 按十进制转换
    parseInt('1', 1); // NaN, 没有一进制
    parseInt('2', 2); // NaN, 按二进制转换不允许出现2
    可以改为r = arr.map(Number);,因为Number(value)函数仅接收一个参数。
    
    x=>parseInt(x)
    
    
    8. 高阶函数  filter
    'use strict';
    var arr=[];
    for(let i=0;i<10;i++){
        arr.push(i);
    }
    alert(arr.filter(function(element){
        return element % 2===0;
    }));
    
    
    'use strict';
    function  add(x,y,f){
        return f(x)+f(y);
    }
    alert('result: '+add(-5,6,Math.abs));
    
    9.  filter
    
    'use strict';
    var arr = ['A', '', 'B', null, undefined, 'C', '  '];
    alert(arr.filter(function(s){
        return s && s.trim();
    }));
    
    'use strict';
    
    var
        r,
        arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];
    r=arr.filter(function(element,index,self){
       if(self.indexOf(element)===index){
        return true;
      }
       else return false;
    });
    
    console.log(r.toString());
    去除重复元素依靠的是indexOf总是返回第一个元素的位置,后续的重复元素位置与indexOf返回的位置不相等,因此被filter滤掉了。
    // ---------------=================-------------------
    'use strict';
    
    function get_primes(arr) {
    
    return arr.filter(
    function(element){
      if(element===1) return false;
      else{
         for(var i=2;i<element;i++){
            if(element%i===0) return false; 
         }
         return true;
      }
    }
    );
    }
    
    // 测试:
    var
        x,
        r,
        arr = [];
    for (x = 1; x < 100; x++) {
        arr.push(x);
    }
    r = get_primes(arr);
    if (r.toString() === [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97].toString()) {
        console.log('测试通过!');
    } else {
        console.log('测试失败: ' + r.toString());
    }
    
    排序算法
    排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。
    'use strict';
    
    var arr = [10, 20, 1, 2];
    arr.sort(function (x, y) {
        if (x < y) {
            return -1;
        }
        if (x > y) {
            return 1;
        }
        return 0;
    });
    console.log(arr); // [1, 2, 10, 20]
    
    var arr = ['Google', 'apple', 'Microsoft'];
    arr.sort(function (s1, s2) {
        x1 = s1.toUpperCase();
        x2 = s2.toUpperCase();
        if (x1 < x2) {
            return -1;
        }
        if (x1 > x2) {
            return 1;
        }
        return 0;
    }); // ['apple', 'Google', 'Microsoft']
    原生JS基础总结
    如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。
  • 相关阅读:
    十大排序算法之选择排序(2)
    十大排序算法之冒泡排序(1)
    2018年年度总结
    敏捷软件开发学习笔记(四)之结构型设计模式
    敏捷软件开发学习笔记(三)之创造型设计模式
    elasticsearch+head+kibana
    闭包函数延迟绑定问题
    初谈dango的post提交csrf设置和文件上传
    浏览器的同源策略,及如可跨域
    socket并发通信的几种方式
  • 原文地址:https://www.cnblogs.com/Frank99/p/8296201.html
Copyright © 2020-2023  润新知