js基础总结

数据类型

值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。

引用数据类型(对象类型):对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。

  1. 一个变量声明,但未赋值,输出则是undefined
  2. 函数没有明确返回值,如果用变量接受,输出则是undefined
  3. Undefine + number = NaN

变量

变量的声明
  1. 关键字 let, const,var

    let a = 100   // 作用域 从当前声明 到当前代码块结束(})可读可写
    const b = 100	// 作用域 从当前声明 到当前代码块结束(})只读
    var c = 100		// 作用域 全局作用域 var 会出现变量提升 在不声明变量之前c是undefined
    
  2. 解构赋值

    // 数组的解构
    let [a, b, c] = [1, 2, 3];
    // a = 1
    // b = 2
    // c = 3
    let [a, , b] = [1, 2, 3];
    // a = 1
    // b = 3
    
    // 对象的解构
    let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
    // foo = 'aaa'
    // bar = 'bbb'
    
变量的转换
//  字符串转number
parseInt("1234blue");   //returns   1234
parseInt("0xA");   //returns   10
parseInt("22.5");   //returns   22
parseInt("blue");   //returns   NaN
//  number转字符串
let n = 1234567890;
var str1 = n + '';
var str2 = String(n);
var str3 = n.toString();
变量的类型判断

typeof 可查看变量类型,一个变量应只存一个类型的数据。

//    Number
console.log(typeof 37);
console.log(typeof 3.14);
//  字符串
console.log(typeof 'bla');
// 布尔值 boolean
console.log(typeof true);
// Symbols symbols
console.log(typeof Symbol('foo'));

// 对象 object
console.log(typeof {
            a: 1
});
object.isArray()  // 判断是否是数组
// 函数
  console.log(typeof
            function() {});
变量命名规范
  1. 变量的第一个字符必须是字母、下划线_、或$_
  2. 其余的字符必须是 下划线 、字母、数字、或$
  3. 不能用js的关键字
  4. 驼峰命名法

字符串(String)

let str = "hello leo leo!"
let len = str.length				// 获取字符串长度
str.substring(start,end)   	// 截取字符串从start位置到end位置,如果end缺省则到结尾
str.substr(start,length)  	// 截取字符串从start位置截取length个字符
str.indexOf('a',start) 			// 返回字符串中检索'a'第一次出现的位置, 若无则返回-1;start:开始的位置
str = str.replace("leo","world")   // 字符串替换  字后str:"hello world leo!" 只能替换第一个子串

str = str.replace(/leo/g,"北京") 		// 字符串 正则表达式替换  字后str:"hello world world!"

数组

let arr = new Array()
arr.push(2)    					// 向数组的末尾添加一个或更多元素,并返回新的长度。
arr.pop()								// 删除数组的最后一个元素并返回删除的元素。
arr = [1,4, 5, 6, 7, 8]
let retArr = arr.filler((item) => item < 5) //使数组中通过筛选条件((item) => item < 5)的的每个元素创建新数组。
retArr.forEach((item, index) => {
  console.log(item, index)   // forEach 就是遍历数组 item就是每一元素 index 就是每个元素的数组下标
})
let retIndex = retArr.findIndex((item)=> item === 1) // retIndex是返回满足条件的第一条元素对应的数组下标
let retData = retArr.find((item)=> item === 1) // retData 是返回满足条件的第一个元素retArr。

retArr.reverse() //数组的翻转

// 最后数组的复杂排序

函数

在开发中函数是什么

函数是用来实现一定功能的代码块
代码块就是包裹在花括号中所有代码

/**
 * functionName 就是函数名
 * @param {*} parameters  函数的传参
 */
function functionName(parameters) {
  //执行代码块的所有代码
  console.log(parameters)
}
/*
js函数声明就是以下面结构封装的代码块

关键字function 方法名(参数1, 参数2) {

  代码块

}*/

函数声明后不会立即执行,当我们调用函数的时候才会执行, 下面做个示范


// 函数定义同时在js中也是函数声明  定义了一个获取全名的函数  两个参数 一个是姓, 一个名 返回值是全名
function getFullName(xing, ming) {
  //执行代码块的所有代码
  let fullName = xing + ming
  return fullName 
  // 打印下名,但是下面的代码不会执行,因为上面执行了return
  console.log(ming) 
}
const xing = '韩'
const ming = '强'

const fullName = getFullName(xing, ming)
console.log(fullName)

// 函数能可以有返回值,也可以没有返回值, 当我们需要返回一个有效值,就可以通过return 返回有效值
// return 在函数的代码块中是终止代码块的向下执行, 也就是return下面的代码将不会再执行
// 比如说上面的打印名的代码
函数定义的三种方式
  1. 函数关键字(function)语句

    function fnMethodName(x){
      alert(x)
    }
    
  2. 函数字面量(Function Literals)

    var fnMethodName = function(x){
      alert(x)
    }
    
  3. Function()构造函数

    var fnMethodName = new Function(‘x','alert(x);') 
    // 由Function构造函数的参数个数可变。最后一个参数写函数体,前面的参数写入参。
    
箭头函数

箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,

一种只包含一个表达式,省略掉了{ ... }和return。还有一种可以包含多条语句,这时候就不能省略{ ... }和return

// 第一种 
() => return 'hello'
(a, b) => a + b   

// 如果返回一个对象,需要特别注意,如果是单表达式要返回自定义对象,不写括号会报错,因为和函数体的{ ... }有语法冲突。 如下
() =>{
  return {msg: 'hello'}
}
// 第二种 
(a) => {
  a = a + 1
  return a
}
普通函数和箭头函数的区别

对象

内置对象

Math,Date,String,Array,Object,Promise,Symbol,Map , Set,Class 类

  1. Promise是一个对象,从它可以获取异步操作的消息

    const promise = new Promise(function(resolve, reject) {
      // ... some code
    	/* con 异步操作成功 */
      if (con){
        resolve(value);
      } else {
        reject(error);
      }
    });
    // Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
    promise.then(function(value) {
      // success
    }, function(error) {
      // failure
    });
    // then 成功的回调 catch 失败的回调
    promise.then(function(value) {
      // success
    }).catch(function(error) {
      // failure
    });
    
    
  2. Symbol表示独一无二的值,最大的用法是用来定义对象的唯一属性名。

自定义对象
  1. Json 对象

    // json对象转json字符串
    let obj = {
      id:1,
      age: 22,
      name: 'leo'
    }
    let str = JSON.stringify(obj);
    let str = obj.toJSONString();
    // json字符串转 json对象
    let obj = str.parseJSON(); // 将JSON字符串转换为JSON对象
    let obj = JSON.parse(str); // 将字符串转换为JSON对象
    
  2. 创建自定义对象有几种方式

    1. 基于已有对象扩充其属性和方法

      let obj = new Object();
      obj.name = "zhangsan";
      obj.sayName = function(name)
      {
             this.name = name;
             alert(this.name);
      }
      obj.sayName("lisi");
      //这种方式的弊端:这种对象的可复用性不强,如果需要使用多个对象,还需要重新扩展其属性和方法。
      
    2. 工厂方式

      function createObject()
      {
             var obj = new Object();
             obj.username = "zhangsan";
             obj.password = "123";
      
             obj.get = function()
             {
                    alert(this.username + ", " + this.password);
             }
             return obj;
      }
      
      var object1 = createObject();
      var object2 = createObject();
      
      object1.get();
      
      // 采用带参数的构造方法:
      
      function createObject(username, password)
      {
             var obj = new Object();
             obj.username = username;
             obj.password = password;
      
             obj.get = function()
             {
                    alert(this.username + ", " + this.password);
             }
             return obj;
      }
      var object1 = createObject("zhangsan", "123");
      object1.get();
      
      // 让多个对象共享函数对象 这样,不用每个对象都生成一个函数对象
      function get()
      {
          alert(this.username + ", " + this.password);
      }
      
      //函数对象只有一份
      function createObject(username, password)
      {
             var object = new Object();
      
             object.username = username;
             object.password = password;
      
             object.get = get; //每一个对象的函数对象都指向同一个函数对象
      
             return object;
      }
      
      var object1 = createObject("zhangsan", "123");
      var object2 = createObject("lisi", "456");
      
      object1.get();
      object2.get();
      //优点:让一个函数对象被多个对象所共享,而不是每一个对象拥有一个函数对象。
      //缺点:对象和它的方法定义分开了,可能会造成误解和误用。
      
    3. 构造函数方式

      // 构造函数的定义方法其实和普通的自定义函数相同。
      function Person()
      {
             //在执行第一行代码前,js引擎会为我们生成一个对象
             this.username = "zhangsan";
             this.password = "123";
      
             this.getInfo = function()
             {
                    alert(this.username + ", " + this.password);
             } 
      
             //此处有一个隐藏的return语句,用于将之前生成的对象返回
             //只有在后面用new的情况下,才会出现注释所述的这两点情况
      }
      
      //生成对象
      let person = new Person();//用了new
      person.getInfo();
      
    4. 原型("prototype")方式

      function Person()
      {
      }
      
      Person.prototype.username = "zhangsan";
      Person.prototype.password = "123";
      
      Person.prototype.getInfo = function()
      {
         alert(this.username + ", " + this.password);
      }
      
      var person = new Person();
      var person2 = new Person();
      
      person.username = "lisi";
      
      person.getInfo();
      person2.getInfo();
      // 使用原型存在的缺点:1.不能传参数;2.有可能会导致程序错误。
      // 如果使用原型方式来定义对象,那么生成的所有对象会共享原型中的属性,这样一个对象改变了该属性也会反映到其他对象当中。
      // 单纯使用原型方式定义对象无法在构造函数中为属性赋初值,只能在对象生成后再去改变属性值。
      
    5. 动态原型方式

      // 在构造函数中通过标志量让所有对象共享一个方法,而每个对象拥有自己的属性。
      function Person()
      {
             this.username = "zhangsan";
             this.password = "123";
      
             if(typeof Person.flag == "undefined")
             {
                    //此块代码应该只在第一次调用的时候执行
                    alert("invoked");
      
                    Person.prototype.getInfo = function()
                    {
                           //这个方法定义在原型中,会被每一个对象所共同拥有
                           alert(this.username + ", " + this.password);
                    }
      
                    Person.flag = true;//第一次定义完之后,之后的对象就不需要再进来这块代码了
      
             }
      }
      
      var p = new Person();
      var p2 = new Person();
      
      p.getInfo();
      p2.getInfo();
      
浏览器对象

所有浏览器都支持 window 对象。它代表浏览器的窗口。

所有全局 JavaScript 对象,函数和变量自动成为 window 对象的成员。

全局变量是 window 对象的属性。

全局函数是 window 对象的方法。

// 下面两种写法是一样的
window.document.getElementById("blog");
document.getElementById("blog");

// 该例显示浏览器窗口的高度和宽度:(不包括工具栏和滚动条)
var w = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;

var h = window.innerHeight
|| document.documentElement.clientHeight
|| document.body.clientHeight; 

// 下面的方法要了解一下
window.open() 		//打开新窗口
window.close() 		//关闭当前窗口
window.moveTo() 	//移动当前窗口
window.resizeTo() //重新调整当前窗口

运算相关(循环, 条件等)

循环
  1. for循环

     let arr = [1,2,3,8,4]
     // for循环
     for (let i=0;i<arr.length;i++)
     { 
         console.log(i)
         //  break 语句 可用于跳出循环。继续执行循环后的代码
       	 // continue 语句中断循环中的迭代,如果出现了指定的条件,然后继续循环中的下一个迭代
     }
     /**
     语法
     for (语句 1; 语句 2; 语句 3)
     {
         被执行的代码块
     }
     */
    
  2. For/In 循环

    let person={fname:"Bill",lname:"Gates",age:56}; 
    for (x in person)  // x 为属性名
    {
       	console.log(x)
    }
    
  3. while循环

    let i = 0
    while (i<5)
    {
        // 被执行的代码块
        i++  
    }
    /**
    while (条件)
    {
        需要执行的代码
    }
    */
    
  4. do/while 循环

    do
    {
        // 被执行的代码块
        i++;
    }
    while (i<5);
    /**
    do
    {
        需要执行的代码
    }
    while (条件);
    */
    
  5. switch语句

    switch(n)
    {
        case 1:
            //执行代码块 1
            break;
        case 2:
            //执行代码块 2
            break; //跳出switch语句
        default:
            //与 case 1 和 case 2 不同时执行的代码
    }
    
条件语句
if (condition)
{
    //当条件为 true 时执行的代码
}

// 变量的比较   a > b   a < b  a === b

js的DOM操作

DOM是什么
DOM的常用方法
  1. 获取节点:

    document.getElementById(idName)      //通过id号来获取元素,返回一个元素对象
    document.getElementsByName(name)    //通过name属性获取id号,返回元素对象数组
    document.getElementsByClassName(className)  //通过class来获取元素,返回元素对象数组(ie8以上才有)
    document.getElementsByTagName(tagName)    //通过标签名获取元素,返回元素对象数组
    
  2. 获取/设置元素的属性值:

    element.getAttribute(attributeName)   //括号传入属性名,返回对应属性的属性值
    element.setAttribute(attributeName,attributeValue)   //传入属性名及设置的值
    
  3. 创建节点Node:

    document.createElement("h3")    //创建一个html元素,这里以创建h3元素为例
    document.createTextNode(String); //创建一个文本节点;
    document.createAttribute("class"); //创建一个属性节点,这里以创建class属性为例
    
  4. 增添节点:

    elelment.appendChild(Node);  					//往element内部最后面添加一个节点,参数是节点类型
    elelment.insertBefore(newNode,existingNode); //在element内部的中在existingNode前面插入newNode
    
  5. 删除节点:
    ```js
    element.removeChild(Node) //删除当前节点下指定的子节点,删除成功返回该被删除的节点,否则返回null

    
    
DOM的常用属性
  1. 获取当前元素的父节点 :

    1. element.parentNode //返回当前元素的父节点对象
  2. 获取当前元素的子节点:

    1. element.chlidren //返回当前元素所有子元素节点对象,只返回HTML节点
    2. element.chilidNodes //返回当前元素多有子节点,包括文本,HTML,属性节点。(回车也会当做一个节点)
    3. element.firstChild //返回当前元素的第一个子节点对象
    4. element.lastChild //返回当前元素的最后一个子节点对象
  3. 获取当前元素的同级元素:

    1. element.nextSibling //返回当前元素的下一个同级元素 没有就返回null
    2. element.previousSibling //返回当前元素上一个同级元素 没有就返回null
  4. 获取当前元素的文本:

    1. element.innerHTML //返回元素的所有文本,包括html代码
    2. element.innerText //返回当前元素的自身及子代所有文本值,只是文本内容,不包括html代码
  5. 获取当前节点的节点类型:node.nodeType //返回节点的类型,数字形式(1-12)常见几个1:元素节点,2:属性节点,3:文本节点。

  6. 设置样式:element.style.color=“#eea”; //设置元素的样式时使用style,这里以设置文字颜色为例。

ES6 模块

export 与 import

模块导入导出各种类型的变量,如字符串,数值,函数,类。

  • 导出的函数声明与类声明必须要有名称(export default 命令另外考虑)。

  • 不仅能导出声明还能导出引用(例如函数)。

  • export 命令可以出现在模块的任何位置,但必需处于模块顶层。

  • import 命令会提升到整个模块的头部,首先执行。

    /*-----export [test.js]-----*/
    let myName = "Tom";
    let myAge = 20;
    let myfn = function(){
        return "My name is" + myName + "! I'm '" + myAge + "years old."
    }
    let myClass =  class myClass {
        static a = "yeah!";
    }
    export { myName, myAge, myfn, myClass }
     
    /*-----import [xxx.js]-----*/
    import { myName, myAge, myfn, myClass } from "./test.js";
    console.log(myfn());// My name is Tom! I'm 20 years old.
    console.log(myAge);// 20
    console.log(myName);// Tom
    console.log(myClass.a );// yeah!
    
as的用法

​ export 命令导出的接口名称,须和模块内部的变量有一一对应关系。导入的变量名,须和导出的接口名称相同,即顺序可以不一致。

/*-----export [test.js]-----*/
let myName = "Tom";
export { myName as exportName }
 
/*-----import [xxx.js]-----*/
import { exportName } from "./test.js";
console.log(exportName);// Tom
//使用 as 重新定义导出的接口名称,隐藏模块内部的变量
/*-----export [test1.js]-----*/
let myName = "Tom";
export { myName }
/*-----export [test2.js]-----*/
let myName = "Jerry";
export { myName }
/*-----import [xxx.js]-----*/
import { myName as name1 } from "./test1.js";
import { myName as name2 } from "./test2.js";
console.log(name1);// Tom
console.log(name2);// Jerry

ES6 async

async function name([param[, param[, ... param]]]) { statements }
- name: 函数名称。
- param: 要传递给函数的参数的名称。
- statements: 函数体语句。

async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。

async function helloAsync(){
    return "helloAsync";
  }
  
console.log(helloAsync())  // Promise {<resolved>: "helloAsync"}
 
helloAsync().then(v=>{
   console.log(v);         // helloAsync
})

await 操作符用于等待一个 Promise 对象, 它只能在异步函数 async function 内部使用。

[return_value] = await expression;
//expression: 一个 Promise 对象或者任何要等待的值。
//返回 Promise 对象的处理结果。如果等待的不是 Promise 对象,则返回该值本身。
// 如果一个 Promise 被传递给一个 await 操作符,await 将等待 Promise 正常处理完成并返回其处理结果。
function testAwait (x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}
 
async function helloAsync() {
  var x = await testAwait ("hello world");
  console.log(x); 
}
helloAsync ();
// hello world

JavaScript原型和原型链

https://zhuanlan.zhihu.com/p/250813781

https://www.cnblogs.com/tg666/p/12059205.html

https://blog.csdn.net/lvanboy/article/details/88542746

posted @ 2022-04-01 09:39  itleo  阅读(31)  评论(0)    收藏  举报