web前端 - 精简系列二:Javascript

184 阅读6分钟

MDN Web 文档

原生js上半部分,主要是对对象,数组,字符串的操作。 中部分主要是循环判断和函数的一些操作, 下半部分主要是webAPIs浏览器内置应用编程接口来操作元素样式。

浏览器执行JS过程

  • 浏览器由2部分组成:
  • 渲染引擎: 用来解析 HTML 和 CSS, 俗称内核,比如chrome浏览器的blink,老版本的webkit
  • JS引擎: 也称为 JS 解释器, 用来读取网页中的JS代码,对其处理后运行, 比如chrome浏览器的v8引擎
  • 注意:浏览器本身是不会执行JS代码的,是通过内置的解释器引擎,来执行JS代码的,JS引擎会逐行解释每一句源码(转换为机器语言),然后交由计算机去执行, 所以JS是脚本语言,会逐行进行解释

数据类型

数字类型:Number 
非数字:isNaN 判断变量是否为非数字, 返回true或者falseisNaN(变量名)

字符串类型:String   
字符串拼接: 数值相加, 字符相连。

Undefined 声明没有赋值

Null 一个变量声明的时候给null, 表示里面存储的值为空

判断变量类型:typeof 变量名 // 返回变量的类型: number, string, boolean, undefined, object

字面量:通俗来讲:就是字面意思,表示根据字面意思去理解这个变量。

number转换为字符串:number.toString() || String(number) || number + '' 。这3种方式都能将number转换为字符串。

保留整数:parseInt(3.14 | 3.95)// 3   parseInt('120px')// 120 保留整数  

保留小数点:parseFloat(3.14) // 3.14

Number转换:Number('12') // 12   隐式转换 ('133' - '130') // 3
Boolean()转换为布尔类型: 
    false :('') 0 NaN null undefined
    true:('小白')  12 // 有内容就是true
--------------------------------  Demo 示例  --------------------------------
      // isNum 非数字返回布尔值true
      console.log(isNaN(4));
      console.log(isNaN('hello'));
      function isNum(x) {
        if (isNaN(x)) {
          return console.log('不是数字');
        }
        return console.log('是数字');
      }
      isNum(3); //是数字
      isNum('hello'); //不是数字

      // 字符串拼接: 数值相加, 字符相连。
      console.log('hello' + 123);
      console.log('ni' + 'hao');
      console.log(1 + 3);

      // Undefined 声明没有赋值
      var student;
      console.log(student);

      // Null 一个变量声明的时候给null, 表示里面存储的值为空
      var a = null;
      a = 'fula';
      console.log(a);

      console.log(typeof 1); //number
      console.log(typeof 'cool'); //string
      console.log(typeof false); //boolean
      var hero;
      console.log(typeof hero); //undefined
      var newArray = 'null';
      console.log(newArray); //null
      var obj = {
        color: 'yellow',
      };
      console.log(typeof obj); //object

      // number转换为字符串:number.toString() || String(number) || number + ''
      // 这3种方式都能将number转换为字符串。
      var num1 = 1;
      console.log(num1.toString());
      var num2 = 2;
      console.log(String(num2));
      var num3 = 3;
      console.log(num3 + '');

      // 保留整数:parseInt(3.14 | 3.95)// 3   parseInt('120px')// 120 保留整数
      console.log(parseInt(1.34)); //1
      console.log(parseInt(1.7)); //1

      // 保留小数点:parseFloat(3.14) // 3.14
      console.log(parseFloat(3.15)); //3.15
      console.log(parseFloat(3.75)); //3.75

      // Number转换:Number('12') // 12   隐式转换 ('133' - '130') // 3
      console.log(Number('13')); // 13
      console.log('120' - '115'); //5

      // Boolean()转换为布尔类型: false :('') 0 NaN null undefined true:('小白')  12 // 有内容就是true
      console.log(Boolean('')); // false
      console.log(Boolean(NaN)); // false
      console.log(Boolean(null)); // false
      console.log(Boolean(undefined)); // false
      console.log(Boolean(1)); //true
      console.log(Boolean('1')); //true

数组 - 循环

      // 使用循环求1-100之间,找出能被3整除的数字,把能被3整除的数,存进一个新的数组
      // 并计算能被3整除的数字的求和。(所有能被3整除数字的和)
      var arr = [1, 3, 5, 7, 9, 11, 15];
      var res = 0;
      var newArray = [];
      for (var i = 0; i < arr.length; i++) {
        if (arr[i] % 3 === 0) {
          newArray.push(arr[i]);
          res += arr[i];
        }
      }
      console.log(newArray); // Array(3) [ 3, 9, 15 ]
      console.log(res); // 27

      // 用双重循环打印九九乘法表:
      var str = '';
      for (var i = 1; i <= 9; i++) {
        for (var j = 1; j <= i; j++) {
          str += j + 'x' + i + '=' + j * i + '\t';
        }
        str += '\n';
      }
      console.log(str);

      // 数组求和:以及求平均值
      var arr1 = [1, 3, 6];
      var sum = 0;
      var average = 0;
      for (var i = 0; i < arr1.length; i++) {
        sum += arr1[i];
      }
      average = sum / arr1.length;
      console.log(sum); //10
      console.log(average); //3.33333

      // 求数组中最大值:
      var arr = [3, 5, 65, 33, 21, 76, 9, 34];
      var max = arr[0];
      for (var i = 0; i < arr.length; i++) {
        if (max < arr[i]) {
          max = arr[i];
        }
      }
      console.log(max);

      // 数组转换为用 / 分隔的字符串,
      var arr = ['a', 'b', 'c'];
      var str = '';
      for (var i = 0; i < arr.length; i++) {
        str += arr[i] + '/';
      }
      console.log(str);

      // 往空数组里存放 10个值
      var arr = [];
      for (var i = 0; i < 10; i++) {
        arr[i] = i;
      }
      console.log(arr); //Array(10) [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

      // 将大于10的放进一个新的数组
      var arr = [2, 5, 33, 6, 24, 7, 9, 12];
      var newArray = [];
      for (var i = 0; i < arr.length; i++) {
        if (arr[i] > 10) {
          newArray[newArray.length] = arr[i];
        }
      }
      console.log(newArray); //Array(3) [ 33, 24, 12 ]

      // 翻转数组:
      var arr = ['a', 'b', 'c'];
      var newArr = [];
      for (var i = arr.length - 1; i >= 0; i--) {
        newArr[newArr.length] = arr[i];
      }
      console.log(newArr); //Array(3) [ "c", "b", "a" ]

      // 冒泡排序:
      var arr = [0, 3, 9, 5, 4, 7, 12, 99, 6, 8, 9];
      for (var i = 0; i < arr.length; i++) {
        for (var j = 0; j < arr.length - i - 1; j++) {
          if (arr[j] > arr[j + 1]) {
            var temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
          }
        }
      }
      console.log(arr); //Array(11) [ 0, 3, 4, 5, 6, 7, 8, 9, 9, 12, … ]

函数 function

      // 函数版:求数组中最大值
      function getMax(arr) {
        var max = arr[0];
        for (var i = 0; i < arr.length; i++) {
          if (max < arr[i]) {
            max = arr[i];
          }
        }
        return max;
      }
      console.log(getMax([1, 5, 9, 12, 7, 9, 32, 5])); //32

      // 函数版: 冒泡排序
      function sort(arguments) {
        var max = arguments[0];
        for (var i = 0; i < arguments.length; i++) {
          for (var j = 0; j < arguments.length - i - 1; j++) {
            if (arguments[j] > arguments[j + 1]) {
              var temp = arguments[j];
              arguments[j] = arguments[j + 1];
              arguments[j + 1] = temp;
            }
          }
        }
        return arguments;
      }
      console.log(sort([1, 3, 5, 8, 4, 9, 13, 21, 6]));
      //Array(9) [ 1, 3, 4, 5, 6, 8, 9, 13, 21 ]

      // 函数版: 翻转数组
      function reveser(arguments) {
        var newArr1 = [];
        for (var i = arguments.length - 1; i > 0; i--) {
          newArr1[newArr1.length] = arguments[i];
        }
        return newArr1;
      }
      console.log(reveser([1, 3, 5, 7, 9, 11, 13]));

对象

      // for in 遍历对象
      var obj = {
        color: 'yellow',
        sayHi: function () {
          console.log('Hi');
        },
      };
      obj.sayHi(); // Hi
      for (var k in obj) {
        // console.log(k); // color  sayHi
        // console.log(obj); //Object { color: "yellow", sayHi: sayHi() }
        console.log(obj[k]); //yellow  function sayHi()
      }

      // 用对象的形式封装求数组最大值最大值,和最小值
      var myMath = {
        max: function (arr) {
          var max = arr[0];
          for (var i = 0; i < arr.length - 1; i++) {
            if (max < arr[i]) {
              max = arr[i];
            }
          }
          return max;
        },
        min: function (arr) {
          var min = arr[0];
          for (var i = 0; i < arr.length - 1; i++) {
            if (min > arr[i]) {
              min = arr[i];
            }
          }
          return min;
        },
      };
      var arr = [3, 4, 8, 0, 9, 11, 23, 56, 9, 7];
      console.log(myMath.max(arr));
      console.log(myMath.min(arr));

数组

      // 数组方法: push末尾添加  unshift开头添加  pop删除末尾  shift删除开头
      var arr = [1, 2, 3];
      arr.push(4); // Array(4) [ 1, 2, 3, 4 ]
      arr.unshift(0); // Array(4) [ 0, 1, 2, 3 ]
      arr.pop(); // Array [ 1, 2 ]
      arr.shift(); // Array [ 2, 3 ]
      console.log(arr);

      // reverse翻转
      arr.reverse(); // Array(3) [ 3, 2, 1 ]

      // sort排序
      var arr1 = [1, 4, 9, 6, 3, 2];
      arr1.sort(); // Array(6) [ 1, 2, 3, 4, 6, 9 ]
      console.log(arr1);

      // indexOf() 查找数组中的项,查找到返回1,没查找到返回-1.
      var arr = ['a', 'b', 'c'];
      console.log(arr.indexOf('b')); // 1
      console.log(arr.indexOf('d')); // -1

      // join() / toString() 将数组转换为字符串
      var arr = [1, 3, 5, 7, 9];
      console.log(arr.toString()); // 1,3,5,7,9
      console.log(arr.join('-')); // 1-3-5-7-9

      // splice 将字符串转换为数组
      console.log(arr.splice(',')); // Array(5) [ 1, 3, 5, 7, 9 ]

      // 数组去重
      function repetition(arr) {
        var newArr = [];
        for (var i = 0; i < arr.length; i++) {
          if (newArr.indexOf(arr[i]) === -1) {
            newArr.push(arr[i]);
          }
        }
        return newArr;
      }
      console.log(repetition([1, 3, 5, 7, 9, 9, 6, 3, 4, 8, 7]));
      Array(8)[(1, 3, 5, 7, 9, 6, 4, 8)];

      // concat数组拼接
      var arr1 = [1, 2, 3];
      var arr2 = [4, 5, 6];
      console.log(arr1.concat(arr2)); //Array(6) [ 1, 2, 3, 4, 5, 6 ]

      // splice(起始索引位置, 结束的位置(包含起始位置))
      // slice(起始索引位置,  结束的位置(包含起始位置))
      var arr = [1, 2, 3, 4];
      console.log(arr.splice(1, 2)); //Array [ 2, 3 ]
      console.log(arr.slice(0, 2)); //Array [ 1, 2 ]

字符串

      // indexOf 返回该字符串所在的索引, 查找不到返回-1
      var str = 'student';
      console.log(str.indexOf('d')); // 3
      console.log(str.indexOf('p')); // -1

      // 使用while循环统计出现最多的字符串,和字符串出现的次数
      var str = 'alshfasjbfkjasghfafasdvfasdfasf';
      function getMaxStr(str) {
        var obj = {};
        for (var i = 0; i < str.length; i++) {
          var key = str[i];
          if (obj[key]) {
            obj[key]++;
          } else {
            obj[key] = 1;
          }
        }
        var maxCount = 0;
        var maxString = '';
        for (var k in obj) {
          if (maxCount < obj[k]) {
            maxCount = obj[k];
            maxString = k;
          }
        }
        return (
          '出现最多次数的字母是:' + maxString + ', 出现的次数是:' + maxCount
        );
      }
      console.log(getMaxStr(str));

      // concat字符串拼接
      var str = 'an';
      console.log(str.concat('ny')); //anny

      // substr 字符串截取(起始的位置(索引值), 截取的个数(从起始的索引开始)),
      var str = 'happy new year';
      console.log(str.substr(2, 3)); // ppy

      // 使用while循环将数组中的o替换为?
      var str = 'oppodjopmdoohdosmo';
      while (str.indexOf('o') !== -1) {
        str = str.replace('o', '?');
      }
      console.log(str); //?pp?dj?pmd??hd?sm?

      // 使用split将字符串转换为数组
      var str = 'a, b, c';
      console.log(str.split(',')); //Array(3) [ "a", " b", " c" ]

WebAPIs

webAPIs之DOM文档对象模型

JavaScript之 ------ 文档对象模型(DOM)

      // 点击按钮切换图片
      var btn1 = document.querySelector('.btn1');
      var btn2 = document.querySelector('.btn2');
      var img = document.querySelector('img');
      btn1.addEventListener('click', function () {
        img.src = '../image/哪吒.jpg';
      });
      btn2.addEventListener('click', function () {
        img.src = '../image/student.jpg';
      });

      // 点击修改表单中的内容,和禁用表单的输入状态
      var btn = document.querySelector('.btn');
      var ipt = document.querySelector('.ipt');
      btn.onclick = function () {
        ipt.value = '这是一段优美的文字';
        btn.disabled = true;
      };

      // 复选框案例: 全选和单选按钮
      var parent = document.querySelector('.parent');
      var sons = document.querySelectorAll('.son');
      // 1:全选事件:
      parent.addEventListener('click', function () {
        for (var i = 0; i < sons.length; i++) {
          sons[i].checked = this.checked;
        }
      });
      // // 复选框事件,全部选中,父按钮就选中
      for (var i = 0; i < sons.length; i++) {
        sons[i].addEventListener('click', function () {
          var flag = true; // 标识符
          for (var i = 0; i < sons.length; i++) {
            if (!sons[i].checked) {
              flag = false;
              break;
            } // 只要有复选框没选中,标识符就是false
          }
          parent.checked = flag; //全选中,就让父按钮被选中。
        });
      }

      // 自定义属性操作 setAttribute getAttribute removeAttribute
      var box = document.querySelector('.box');
      box.addEventListener('click', function () {
        this.setAttribute('index', 1);
        var inx = this.getAttribute('index'); //1
        this.removeAttribute('index');
      });

      // firstChild lastChild 操作第一个节点和最后一个节点:
      // 方式一:ul.firstChild
      // 方式二:ul.firstElementChild
      // 方式三(推荐):ul.children[0] // 实际开发中的写法,没有兼容性,又简洁。
      var box = document.querySelector('.box');
      console.log(box.firstChild.innerHTML); //1
      console.log(box.lastChild.innerHTML); //2
      console.log(box.children[1].innerText); //2

      // createElement 创建节点    removeChild删除节点
      var ul = document.querySelector('ul');
      var li = document.createElement('li');
      li.innerHTML = '我是新创建了li';
      ul.appendChild(li);
      ul.removeChild(li);

      // 事件委托
      var ul = document.querySelector('ul');
      ul.addEventListener('click', function (e) {
        console.log(e.target);
        e.target.style.backgroundColor = 'yellow'; // 让被点击的li标签,背景高亮
      });

      // 常用的键盘事件: onkeydown 键盘按下   onkeyup 键盘松开
      // 另一种:onkeypress 键盘按下,不识别功能键 如箭头 和ctrl + shift
      document.addEventListener('keydown', function (e) {
        console.log(e.keyCode);
      });

      // 鼠标事件:
      // e.clientX | Y 浏览器可视区域的坐标
      // e.pageX | Y   文档页面的坐标 IE9支持
      // e.screenX | Y 电脑屏幕的坐标
      document.addEventListener('click', function (e) {
        console.log(e.clientX); // 158
        console.log(e.pageX); // 158
        console.log(e.screenX); // 159
      });

DOM回顾总结: dom主要是对元素进行操作,主要有:创建,删除,修改,查询,属性操作,事件操作。

BOM浏览器对象模型

JS 浏览器BOM(浏览器对象模型)

      // window.onload等待页面元素加载后,才会加载js脚本
      window.onload = function () {
        console.log(123);
      };

      // 定时器:setInterval连续 || setTimeout一次性 ,
      clearTimeout清除一次性 || clearInterval清除连续;
      var timer1 = setInterval(function () {
        console.log(11);
      }, 1000);
      var btn = document.querySelector('.btn');
      btn.addEventListener('click', function () {
        clearInterval(timer1);
      });

      // this指向问题:this一般指向它调用的那个对象,
      // 谁调用或者谁触发就是谁,但是全局和命名函数以及定时器中this默认指向是window
      console.log(this); //window

      function fn1() {
        console.log(this); //window
      }
      fn1();

      setTimeout(function () {
        console.log(this); // window
      }, 2000);

      var obj = {
        say: function () {
          console.log(this);
        },
      };
      obj.say(); //Object { say: say() }

      var btn = document.querySelector('.btn');
      btn.addEventListener('click', function () {
        console.log(this); //<button class="btn">
      });

      function Fun() {
        console.log(this);
      }
      var fun = new Fun(); //Object {  }

      // ---------------------  offset client scroll系列用法: ------------------
      // offset 可以得到元素的位置偏移,大小等。获取元素距离带有定位父元素的位置。获取元素自身的大小(宽度高度),返回的值不带px。
      // 常用:
      // offsetParent 返回子元素距离有定位父元素的位置
      // offsetTop  返回子元素距离有定位父元素上方偏移的位置
      // offsetLeft 返回子元素距离有定位父元素左边的偏移位置
      // offsetWidth 返回自身内容区的宽度,padding,边框,返回值不带单位
      // offsetHeight 返回自身内容区的高度,padding,边框,返回值不带单位
      var parent = document.querySelector('.parent');
      var son = document.querySelector('.children');
      console.log(son.offsetParent); //<div class="parent">
      console.log(son.offsetTop); // 100
      console.log(son.offsetLeft); // 100
      console.log(son.offsetWidth); // 100
      console.log(son.offsetHeight); // 100

      // offset 常用于获取元素的位置
      // client 常用于获取元素大小
      // scroll 常用于滚动距离
      // 注意: 页面滚动的距离用 window.pageXOffset 获得

      // 本地存储之localStorage:
      // 2:本地存储之localStorage:声明周期永久生效,除非手动删除 否则关闭页面也会存在,可以多窗口(页面)共享(同一浏览器可以共享),以键值对的形式存储使用
      // 存储数据:localStorage.setItem('uname', val)
      // 获取数据:localStorage.getItem('uname')
      // 删除数据:localStorage.removeItem('uname');
      // 删除所有数据:localStorage.clear();
      var btn = document.querySelector('.btn');
      btn.addEventListener('click', function () {
        localStorage.setItem('token1', '333666');
      });
      var btn2 = document.querySelector('.btn2');
      btn2.addEventListener('click', function () {
        localStorage.removeItem('token1');
      });
      var btn3 = document.querySelector('.btn3');
      btn3.addEventListener('click', function () {
        var token = localStorage.getItem('token1');
        console.log(token);
      });

			// 点击返回顶部按钮,回到顶部
      var goBack = document.querySelector('.goBack');
      goBack.addEventListener('click', function () {
        window.scroll(0, 0);
      });

下一篇: web前端 - 精简系列三:jQuery