槽点极多的JAVASCRIPT

原生JS && JQuery && BootStrap

原生 js

js 的三种插入方式

  1. 行间式 : 直接在html 标签内写入
<body id="body" onload="body.style.backgroundColor='red'">
  1. 内联式:在 script 标签中写入
<script type="text/javascript">
    body.style.backgroundColor='orange'
</script>
  1. 外联式:在 script 标签的 src 属性中引入 外部 js 文件
<script type="text/javascript" src="./js/01.js"></script>

三种方式不存在优先级,按照代码的执行顺序,谁后导入谁生效

注释

// 单行注释

/ ** / 多行注释

三种弹出框

  1. 普通弹出框 alert()
  2. 确认框 confirm()
  3. 输入框 prompt

变量的声明

<script>
var a;	// 未赋值时 a 默认为 undefined
a = 100		// 定义过的变量无需再次定义直接可以赋值
</script>

ES5变量的定义

​ ES5标准下没有块级作用域,只有方法可以产生实际的局部作用域

<script>
//无块级作用域的局部变量
var a = 10;
//全局变量
b = 20;

//验证 : 
(function () {
        var x = 10;
        y = 20;
})()

alert(x) //报错,x只能在局部作用域中使用
alert(y); //正常使用


//块级作用域
{
    var n = 10; // 无视块级作用域
    m = 20;  // 全局变量,更无视块级作用域
}
alert(n)  // 可以
 alert(m)  // 可以
</script>

ES6变量的定义

<script>
//有块级作用域的局部变量
let aa = 100;
//有块级作用域的常量 
//注意 : 常量值不允许更改
const bb = 200;

//验证 : 
{
    let xx = 100;
    const yy = 200;
}
alert(xx);  // 无法访问
alert(yy);  // 无法访问
//函数产生的局部作用域同该情况
</script>

数据类型

number 数字类型

js 中没有 int float 类型,统一为 number 类型

<script>
	var a = 10;
	console.log(typeof a == 'number');
</script>

string 字符串类型

<script>
	var a = '字符串';
</script>

boolean 布尔类型

js 中 布尔类型分为 true false 两种

0 undefined null “” NaN 均为 false 其余为 true

undefined 未定义类型

未初始化的变量类型默认为 undefined 类型

<script>
	var b;
    console.log(b, typeof b);
    var c = undefined;
    console.log(c, typeof c);
</script>

function 函数类型

<script>
	var m = function () {};
</script>

object 对象类型

<script>
    var obj = {};
    obj = new Object();
    console.log(obj, typeof obj);
    console.log(obj instanceof Object);
</script>
特殊对象类型

null 空对象

<script>
    var o = null;
	console.log(o == null);
</script>

Array 数组对象

<script>
	o = new Array(1, 2, 3, 4, 5);
</script>

Data 时间对象

<script>
	o = new Date();
</script>

RegExp 正则对象

<script>
	o = new RegExp();
</script>

类型转换

显性转换

<script>
    // 1. 数字,布尔转化为  => 字符串
    var a = 10;
    var b = true;

    var c = new String(a);
    console.log(c, typeof c); // '10', object

    var c = String(a);
    console.log(c, typeof c); // '10', string
    c = String(b);
    console.log(c, typeof c); // 'true', string

    c = a.toString();
    console.log(c, typeof c); // '10', string
    c = b.toString();
    console.log(c, typeof c); // 'true', string
</script>
<script>
    // 2. 布尔,字符串转化为数字
    var aa = true;
    var bb = '10';

    var cc = Number(aa);
    console.log(cc, typeof cc); // 1 number
    cc = Number(bb);
    console.log(cc, typeof cc); // 10 number

    cc = + aa;
    console.log(cc, typeof cc); // 1 number
    cc = + bb;
    console.log(cc, typeof cc); // 10 number

    // 针对字符串
    cc = parseFloat('3.14.15.16abc');
    console.log(cc, typeof cc); // 3.14
    cc = parseInt('10.35abc');  // 10
    console.log(cc, typeof cc);
    // 字符串以非数字开头,结果为NaN
    // NaN(not a number)特点:
    // 1.非数字类型
    // 2.不与任何数相等,包含自己
    // 3.通过isNaN()进行判断
</script>

隐性转换(自动转换)

<script>
    5 + null  // 5
     "5" + null  // "5null"
    "5" + 1  // "51"
    "5" - 1  // 4
    "" + ? // "?"
</script>

三目运算符

结果 = 条件表达式 ? 结果1 :结果2

<script>
	var num = if 20 > 30 ? 1 : 0
</script>

ES6语法解构赋值

数组的解构赋值

<script>
    let [a, b, c] = [1, 2, 3]
    // a=1,b=2,c=3
    let [a, ...b] = [1, 2, 3]
    // a=1,b=[2,3]
</script>

对象的解构赋值

<scrip>
	let {key: a} = {key: 10}
	// a=10
</scrip>

字符串解构赋值

<script>
    let [a,b,c] = 'xyz'
    // a='x',b='y',c='z'
</script>

流程控制

if 语句

<script>
    if (表达式1) {
        code1;
    } else if (表达式2) {
        code2;
    } 
    else {
        code3;
    }
</script>

switch 语句

<script>
    switch (表达式) {
        case 值1: 代码块1; break;
        case 值2: 代码块2; break;
        default: 代码块3;
    }

   //  1.表达式可以为 整数表达式 或 字符串表达式
   //  2.值可以为 整数 或 字符串
   //  3.break可以省略
   //  4.default为默认代码块,需要出现在所有case最下方,在所有case均未被匹配时执行
</script>

for 循环

<script>
    for (循环变量①; 条件表达式②; 循环变量增量③) {
        代码块④;
    }
    for (var i = 0; i < 5; i++) {
      '循环体代码'
    }
    // 1.循环变量可以在外、在内声明
    // 2.执行逻辑 ① ②④③ ... ②④③ ②,入口为①,出口为②,②④③个数为[0, n]
</script>

while 循环

<script>
    while (条件表达式) {
        代码块;
    }
</script>

函数初级

函数的定义

function 函数名 (参数列表) {
    函数体;
}

var 函数名 = function (参数列表) {
    函数体;
}

匿名函数

function (参数列表) {
    函数体;
}

//匿名函数需要自调用
(function (参数列表) {
    函数体;
})(参数列表);

BOM操作

窗口操作

// 新tag打开目标地址
open("http://www.yahoo.com");
// 自身tag转跳目标地址
open("http://www.yahoo.com", '_self');
// 自定义窗口打开目标地址
open("http://www.yahoo.com", '_blank', 'width=300, height=300');

历史记录 history

// 历史后退
history.back();
// 历史前进
history.forward()

导航器 navigator

// 拥有浏览器信息的字符串
navigator.userAgent;

地址信息

// 协议
location.protocol
// 服务器
location.hostname
// 端口号
location.port
// 参数拼接
location.search

DOM操作

标签关系

获取父级标签 : sub.parentElement

获取上一个兄弟标签: sub.previousElementSibling

获取下一个兄弟标签: sub2.nextElementSibling

获取所有子标签: sup.children

获取第一个子标签: sup.firstElementChild

<div class="sup">
    <div class="sub1"></div>
    <div class="sub2"></div>
    <div class="sub3"></div>
</div>

<script>
    var sub2 = document.querySelector('.sub2');
    // 父级标签
    console.log(sub2.parentElement);
    // 上一个标签
    console.log(sub2.previousElementSibling);
    // 下一个标签
    console.log(sub2.nextElementSibling);

    var sup = document.querySelector('.sup');
    // 所有子标签
    console.log(sup.children);
    // 第一个子标签
    console.log(sup.firstElementChild);
    // 最后一个子标签
    console.log(sup.lastElementChild);
</script>

操作页面标签

// 创建一个div标签
var div = document.createElement("div");
// 设置属性样式
div.className='box';
// 添加到body末尾,返回自身
div = body.appendChild(div);
// 插入到body中box标签前,返回自身
div = body.insertBefore(div, box);
// 替换掉body中box标签,返回box
box = body.replaceChild(div, box);
// 在body中移除div,返回自身
div = body.removeChild(div);

获得标签对象

// 1.通过id名获取唯一满足条件的页面元素
document.getElementById('id名');
// 该方法只能由document调用

// 2、通过class名获取所有满足条件的页面元素
document.getElementsByClassName('class名');
// 该方法可以由document及任意页面元素对象调用
// 返回值为HTMLCollection (一个类数组结果的对象,使用方式同数组)
// 没有匹配到任何结果返回空HTMLCollection对象 ([])

// 3.通过tag名获取所有满足条件的页面元素
document.getElementsByTagName('tag名');
// 该方法可以由document及任意页面元素对象调用
// 返回值为HTMLCollection (一个类数组结果的对象,使用方式同数组)
// 没有匹配到任何结果返回空HTMLCollection对象 ([])

操作页面

  • innerText:普通标签内容(自身文本与所有子标签文本)(不被解析)
  • innerHTML:包含标签在内的内容(自身文本及子标签的所有)(被解析)
  • value:表单标签的内容
  • outerHTML:包含自身标签在内的内容(自身标签及往下的所有)

操作页面样式

div.style.backgroundColor = 'red';

结合css操作页面样式

页面元素对象.className = "";  // 清除类名
页面元素对象.className = "类名";  // 设置类名
页面元素对象.className += " 类名";  // 添加类名

一次性定时器

setTimeout(函数, 毫秒数, 函数所需参数(可以省略));

setTimeout(function (data) {
        console.log(data);
    }, 1000, "数据");

持续性定时器

setInterval(函数, 毫秒数, 函数所需参数(可以省略));

 setInterval(function() {
        console.log("呵呵");
    }, 1000);

定时器清除

  1. 持续性与一次性定时器通常都应该有清除定时器操作
  2. 清除定时器操作可以混用 clearTimeout() | clearInterval()括号参数为定时器编号
  3. 定时器的返回值就是定时器编号,就是普普通通的数字类型
  4. 允许重复清除
  5. 允许清除不存在的定时器编号
做个定时器
    var timer = setInterval(function() {
        console.log("呵呵");
    }, 1000);
查看定时器的返回值是什么
    console.log(timer);// 打印1 ,则返回值就是创建过的定时器的编号

点击页面清除定时器
    document.onclick = function () {
        console.log("定时器清除了");
        clearInterval(timer);
        // clearTimeout(timer);
    };

清除所有定时器

如果上方创建过n个定时器,那么timeout值为n+1
var timeout = setTimeout(function(){}, 1);
    for (var i = 0; i < timeout; i++) {
        // 循环将编号[0, n]所有定时器都清除一次
        clearTimeout(i)
    }

绑定事件

on 绑定事件

document.onclick = function() {
    console.log("文档点击");
}
// on事件只能绑定一个方法,重复绑定保留最后一次绑定的方法
document.onclick = function() {
    console.log("文档点击");
}
// 事件的移除
document.onclick = null;

非 on 事件绑定

addEventListener('事件名',回调函数,冒泡方式);
document.addEventListener('click', function() {
     console.log("点击1");
})
document.addEventListener('click', function() {
     console.log("点击2");
})
// 非on事件可以同时绑定多个方法,被绑定的方法依次被执行
// addEventListener第三个参数(true|false)决定冒泡的方式
function fn () {}
document.addEventListener('click', fn);
// 事件的移除
document.removeEventListener('click', fn);

事件的冒泡与默认事件

  • 事件的冒泡:父子都具有点击事件,不处理的话,点击子级也会出发父级的点击事件
  • 在子集绑定事件里设置ev.stopPropagation();ev.cancelBubble = true;
<body >
        <div id="sup">
          <div id="sub"></div>
      </div>
  </body>
  
  <script>
  var sub = document.querySelector('#sub');
  sub.onclick = function (ev) {
      // 方式一
      ev.stopPropagation();
      // 方式二
      ev.cancelBubble = true;
    console.log("sub click");
  }
  </script>
  • 默认事件:取消默认的事件动作,如鼠标右键菜单
  • ev.preventDefault();return false;
<body>
        <div id="sup">
          <div id="sub"></div>
      </div>
  </body>
  
  <script>
  var sub = document.querySelector('.sub');
  sub.oncontextmenu = function (ev) {
      // 方式一
      ev.preventDefault();
      // 方式二
      return false;
    console.log("sub menu click");
  }
  </script>
原文地址:https://www.cnblogs.com/Ethan99/p/10976344.html