Javascript重点总结

DOM

DOM节点

  • 文档节点   
  • HTML元素节点
  • 文本节点   
  • 属性节点
  文档节点 HTML元素节点 文本节点 属性节点
nodeName #document 标签名 #text 属性名

nodeValue

- undefined\null 文本内容 属性值
nodeType 9 1 3 2

DOM方法

Javascript重点总结_第1张图片

DOM事件

Javascript重点总结_第2张图片

JS变量类型

存储方式:值类型、引用类型([](数组), {} (Object) 都可以有自己的属性

Javascript重点总结_第3张图片

JS的存储类型: boolean、number、string、object、function、undefined

Javascript重点总结_第4张图片

ES6补充:Symbol类型

强制类型转换出现的场景:

  • ==:会发生类型转换   所以 100 == ‘100’ 是true
  • if语句,会把括号里的东西转换成booleanJavascript重点总结_第5张图片

if判断中为false的:if(0)、if(NaN)、if('')、if(null)、if(undefined)、if(false)

  • 逻辑运算符也会发生强制类型转换Javascript重点总结_第6张图片

何时使用===和==?

Javascript重点总结_第7张图片

JS中的内置函数

Javascript重点总结_第8张图片

补充:内置对象:Math,JSON

JSON

JSON是:JS对象、一种数据格式

常用的方法:

JSON.stringify({a:10, b:20}) // JSON转换为字符串
JSON.parse('{"a":10, "b":20}') //字符串转换为JSON格式

 

原型和原型链

  • 为什么JS有原型和原型链?

我的理解:JS构造函数的时候不能构造函数的内部方法,并且没有继承的关系,所以就要用原型和原型链来表示和使用函数的方法,并且便于继承

  • javascript的原型链有显式和隐式两种

显式原型链:即我们常见的prototype;

隐式原型链:在一般环境下无法访问,即不可见,在FireFox下可以通过__proto__方式访问;隐式原型链用于javascript引擎内部对原型链的搜寻,通过显示原型链来设置;

  • 每个构造函数(constructor)都有一个原型对象(prototype),原型对象都包含一个指向构造函数的指针,而实例(instance)都包含一个指向原型对象的内部 指针.

Javascript重点总结_第9张图片

  • prototype和__proto__的概念

  prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象。它是显示修改对象的原型的属性(显式属性)。

  __proto__是一个对象拥有的内置属性(请注意:prototype是函数的内置属性,__proto__是对象的内置属性),是JS内部使用寻找原型链的属性。

      用chrome和FF都可以访问到对象的__proto__属性,IE不可以。

  • new 的过程
var Person = function(){};
var p = new Person();

   new的过程拆分成以下三步:
   (1) var p={}; 也就是说,初始化一个对象p
   (2) p.__proto__ = Person.prototype;
   (3) Person.call(p); 也就是说构造p,也可以称之为初始化p

关键在于第二步,我们来证明一下:

var Person = function(){};
var p = new Person();
alert(p.__proto__ === Person.prototype);

    这段代码会返回true。说明我们步骤2是正确的。

  • f.hasOwnProperty

Javascript重点总结_第10张图片

  • 原型链Javascript重点总结_第11张图片
  • f instanceof Foo 判断是不是原型对象的实例

执行上下文

Javascript重点总结_第12张图片

由于JS是一种解释性的语言,所以在代码执行之前,JS会把变量定义、函数声明先拿出来占个位置

Javascript重点总结_第13张图片 

前两行:变量提升hoisting  

变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。

arguments

Array.prototype.slice.call(arguments) //将arguments转换成数组

this

Javascript重点总结_第14张图片

Javascript重点总结_第15张图片

this的各种使用场景:

//构造函数中的this

function Foo(name) {
    this.name = name
    return this
}

var f = new Foo('zhangsan')

//作为一个对象属性的this

var obj = {
    name : 'A',
    printName: function() {
        console.log(this.name)
    }
}
obj.printName()

//普通函数的this
function fn() {
    console.log(this)
}
fn() //打印出来的是window,即全局变量

//call apply bind中的this
function fn1(name, age){
    console.log(name)
    console.log(this)
}
fn1.call({x:100},'zhangsan',20)
fn1.apply({x:200},['zhangsan',20])

var fn2 = function(name, age){
    console.log(name)
    console.log(this)
}.bind({y:200})
fn2('zhangsan', 20)

call、apply、bind的作用是改变函数运行时的上下文,bind在使用后会返回一个新的函数供我们使用

即可以实现继承!!!!!!!!

fun.apply(thisArg, [argsArray])

fun.call(thisArg, arg1,arg2, ...)

作用域

JS没有块级作用域,有的是函数作用域和全局作用域

当前作用域没有定义的变量,叫做“自由变量”

函数在哪定义,函数的父级作用域就在哪

作用域链:一个变量一直往上寻找它的父级作用域

你可能感兴趣的:(前端学习)