js基础学习总结

1.语言核心、DOM、BOM

2.在body中< script>写代码 or < script src=””>< /script>引入

3.变量声明提升
js在执行前,会预解析,会提升所有变量的声明(重点)。
变量声明提升会提升到当前作用域之前。
只提升声明,不加载值。
(和后边函数对应着看)

4.基本数据类型:

  • int float double都是number,NaN也是number,其他用的过程中可以typeof一下具体再看。
  • 字符串双引号单引号都可以,字符串可以用+号拼接,拼接时可以将number强转成字符串进来,称变量插值(跟python的效果类似)。它的方法作用和命名和java很类似。
  • Undefined值和类型一样,该类型是js特色。
  • 对象销毁、数组销毁或者删除事件监听等,需要用到null,null是object
  • Number()能强转number,String()能强转成string。是方法。
    强转.parseInt()等操作和java很像,比java强的是若数字后边跟文字,还能给截掉不报错。.toString()等等。这里.方法与java像,直接String()与java不像。

5.小数运算时,可调用 toFix()确定保留位数。

6.也有对象的概念,里面有Math.pow(a,b)的操作。

7.逻辑运算,短路原则,跟java一样。

8.逻辑处理语句,跟java一样

9.数组,跟java差不多,理解一下new Array(2);这种方式。

  • 如果更改的数组项下标超出大小了,不报错,会自动改数组,前面会留空empty。
  • 数组头尾操作,push() pop() unshift shift()
  • .splice()指定位置插入并替换、删除
  • .slice
  • 数组.join() (要不设置和空格是默认的,要么可以自己初始化)
  • 字符串.split(“”),跟java一样
  • 数组和字符串互相转换
    这些个东西都有很多方法,跟Java一样。

10.引用类型(对象)和基本类型
跟java一样。还是引用、指针、值和地址那一套,所以相等估计得调用方法,所以涉及到了深浅拷贝和递归注意事项。
在js里,基本类型是number、boolean、string、undefined、null,引用是array、object、function、regexp等等

11.函数(体现出js脚本语言的特性,不是把函数搞成方法,而是就叫c面向过程的”函数”。其实感觉也可以用方法理解)
function fun(){}
函数可以提升(这个好理解,加载时候,变量和函数,优先加载函数再加载变量)(不一定是加载这个词儿)
arguments表示它接收到的实参列表,它是一个类数组对象。
不用在fun的括号里写参数,直接能全拿进来

12.局部变量、全局变量(这俩都有自己特色)
涉及变量声明加载时机、遮蔽效应、全局不传参拿数等等,之后可以仔细研究一下js中变量在浏览器的加载机制。

13.闭包?(待研究)
函数能够记忆住其定义时所处的环境。即使函数不在其定义的环境中被调用,也能访问定义时所处环境的变量。(包括写在前面的和形参)
闭包产生时,函数所处环境的状态会始终保持在内存中,不会在外层函数调用后被自动清除。
Java、c++都有私有属性的概念,但是js中只能用闭包来模拟私有变量。
(又想一直留着这个变量属性,又不想让外部访问。)
外面有var接住了这个函数,才不会释放函数内存。
闭包有可能会导致内存泄露。

14.IIEF立即调用
(function(){
alert(1)})();

在一些场合,如for循环中,可以将全局变量转变为局部变量。

15.DOM(Document Object Model

  1. 将文档表示为DOM节点树,有元素节点、文本节点、属性节点等等。
    nodeType属性可以显示这个节点具体的类型。

  2. document对象,是整个HTML文档的根。
    访问元素节点的常用方法(兼容性各不相同):
    .getElementByID()
    .getxxx
    .getxxx

  3. 一般< script >放在最后面,不然拿不到html标签。或者添加监听,也可以写前面。

  4. 树的节点之间有“父子兄弟”的关系,可以通过这些关系互相找,也都有函数。

  5. 节点操作
    innerHTML、innerText,设置节点内容(上树)
    .style.backgroundColor(css的-变驼峰)=”red”,改变css样式。
    直接.或者get or set Attribute(),改变html属性。
    节点可以通过js创建、移除和克隆。

  6. DOM事件(.等等,如box1.onclick,称onclick为事件)
    DOM事件传播(外父标签,内子标签):先从外往内传(捕获阶段),再从内往外传(冒泡阶段)。注意:最内层的标签元素,因为就自己,就不再区分捕获还是冒泡了,所以代码书写顺序会影响执行顺序,但其他的代码书写顺序不会影响执行顺序。
    DOM0级事件监听:.onXXX=function(){};的写法只能监听冒泡阶段。
    DOM2级事件监听:.addEventListener(‘click’,function(){}, true or false) 监听不同阶段通过true或false改。

  7. 如果给元素设置两个或多个同名事件,则DOM0级写法后面写的会覆盖先写的;而DOM2级会按顺序执行。

  8. DOM事件对象:e/event,浏览器给封装的,写在function的形参上。如.onXXX=function(e){e.xx};
    事件对象中还有许多操作,如阻止事件传播等等,有机会深入研究。

  9. 事件委托(处理动态绑定事件的问题):
    批量添加事件监听的性能问题
    事件监听的注册会消耗一定的系统内存,而批量添加事件会导致监听数量太多,内存消耗大。
    每个< li>的事件的处理函数都是不同的函数,再js中函数也是引用,所以函数本身也会占用内存。

事件委托:利用事件冒泡的机制,将后代元素事件委托给任意一个祖先元素。
通常结合e.target
常用场景:
批量添加事件监听
动态元素上树

使用事件委托时注意:
不能委托不冒泡的事件给祖先元素。
最内层元素不能再有额外的内层元素,因为e.target添加监听的最内层元素。

  1. 定时器和延时器(异步语句)
    setInterval()函数:定时器
    setTimeout()函数:延时器
    配合css可以实现动画效果。

16.BOM(Browser Object Model):允许 JavaScript 与浏览器对话
window对象:全局变量是window对象的属性。直接写在.js文件里,不同的< srcipt>里,不同的,js文件里,都是全局变量,都是windows的属性。
还有其他常用玩法

17.对象

  1. 在 JavaScript 中,几乎“所有事物”都是对象。所有 JavaScript 值,除了原始值,都是对象。
    布尔是对象(如果用 new 关键词定义)
    数字是对象(如果用 new 关键词定义)
    字符串是对象(如果用 new 关键词定义)
    日期永远都是对象
    算术永远都是对象
    正则表达式永远都是对象
    数组永远都是对象
    函数永远都是对象
    对象永远都是对象

  2. 在js中,对象是键值对的集合,表示属性和值的映射关系
    大括号表示对象,属性是key:value,的形式;方法也是key:value,的形式,但value是函数。

  3. 函数上下文this(需要再研究下?)
    函数中的this,表示函数的上下文,函数中的this指代什么,需要通过调用函数时的前言后语来判断。
    函数的上下文,由调用方式决定。同一个函数,用不同的形式调用,则上下文不同。
    函数代码里写this,不知道this指代什么,因为函数只有被调用时,它的上下文才能被确定。

规则1:对象.调用函数,函数中this指代这个打点对象(xiaoming.sayHello())
规则2:圆括号直接调用函数,函数中this指代window对象(var sh=xiaoming.syHello(); sayHello();)
规则3:数组(类数组对象)枚举出函数进行调用,上下文是这个数组。arguments对象是最常见的类数组对象。
规则4:IIFE中的函数,上下文是window对象。
规则5:定时器、延时器调用函数,上下文是window对象。
规则6:事件处理函数的上下文是绑定事件的DOM元素。
call和apply能指定函数的上下文。

  1. new的东西搞对象,和java基本一样,也是类和实例,但js不是类,是可以看作是类
    js中可以new一个函数,会返回一个对象。(它这里应该说的就是new构造函数,它这里过程有点意思,创建了个空对象,然后用this给值)
    js中任何函数都可以是构造函数,只需要new调用它。

Java/c++,面向对象的语言
JavaScript,基于对象的语言

因此,js中构造函数可以类比成面向对象中的“类”,写法确实类似,但和真正的面向对象有本质不同,除此之外,js有自己特有的特性。

  1. prototype对象
    构造函数的prototype属性是它的实例的原型

实例可以访问它的原型的属性和方法,“原型链查找”。

方法应该写在类(js叫原型)里,不应该放在构造函数里new新的,不合理,此时就可以用prototype搞在原型上。

原型链的重点是object.prototype,类似于java中可以调用object的方法。

  1. 继承
    Student.prototype = new People();
    (super关键字可以找父类)

  2. 包装类、Math对象、Date对象
    时间戳:1970.1.1 0点整距离某时刻的毫秒数

17.ES6

  1. 引入let,let和var的区别:
    1.var允许重复声明,let不允许
    2.var会变量提升,let不存再变量提升(正常逻辑)
    3.let会暂时死区,同名时会自动绑定当前作用域(绑定区块),解决了var在外边但函数内能拿到的不舒服
    4.全局中声明的let,不会绑到window
    5.let有块级作用域。(var i = 3;for(;i<8;i++){} 和 for(var i=3; i <8; i++){}一样
    有了let,就不一样了,成了我们正常理解的java和c了,写在for里外面就拿不到了。

  2. const
    关键字 const 有一定的误导性。
    它没有定义常量值。它定义了对值的常量引用。
    因此,我们不能更改常量原始值,但我们可以更改常量对象的属性。(当然,基本数据类型肯定就没法修改了)

  3. 模板字符串
    Let info=’我的名字是’:${person.username}

  4. 箭头函数(类似lamada表达式)

  5. Map对象、Set对象、Iterator跟javac++一样

  6. JS异步操作Async 、promise(见前端技术知识总结)

  7. class类玩法,跟java差不多,也有super的用法,也有extends用法,也能写私有属性了(加个_),也得写构造函数constructor,为了不让每次实例化都有一个方法,所以这里方法定义的和constructor同级(这样的写法跟java等写法更相似了)

  8. 解构赋值
    数组解构赋值:
    模式(结构)匹配
    索引值相同的完成赋值
    Eg. const[a,b,c]=[1,2,3]
    对象解构赋值:
    模式(结构)匹配
    属性名相同的完成赋值
    Eg. const{ age:age, username:username }={username:’Alex’, age:18};

18.js常用方法
split():字符串按规则拆成数组
join():数组按规则拼成字符串
例子:return val.split(“”).join(“\n”),效果是把一行字符串竖着显示

19.js中= =、= = =、!==、!= = =

  • ==做类型转换,做完后再比较
  • ===不做类型转换,必须类型和值都相等
  • !=是==的逆反,做类型转换
  • !==是= = =的逆反,不做类型转换

你可能感兴趣的:(前端相关学习记录,javascript,前端)