DOM
DOM节点
- 文档节点
- HTML元素节点
- 文本节点
- 属性节点
文档节点 HTML元素节点 文本节点 属性节点 nodeName #document 标签名 #text 属性名 nodeValue
- undefined\null 文本内容 属性值 nodeType 9 1 3 2
DOM方法
DOM事件
JS变量类型
存储方式:值类型、引用类型([](数组), {} (Object) 都可以有自己的属性)
JS的存储类型: boolean、number、string、object、function、undefined
ES6补充:Symbol类型
强制类型转换出现的场景:
- ==:会发生类型转换 所以 100 == ‘100’ 是true
- if语句,会把括号里的东西转换成boolean
if判断中为false的:if(0)、if(NaN)、if('')、if(null)、if(undefined)、if(false)
- 逻辑运算符也会发生强制类型转换
何时使用===和==?
JS中的内置函数
补充:内置对象: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)都包含一个指向原型对象的内部 指针.
- 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
- 原型链
- f instanceof Foo 判断是不是原型对象的实例
执行上下文
由于JS是一种解释性的语言,所以在代码执行之前,JS会把变量定义、函数声明先拿出来占个位置
前两行:变量提升hoisting
变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
arguments
Array.prototype.slice.call(arguments) //将arguments转换成数组
this
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没有块级作用域,有的是函数作用域和全局作用域
当前作用域没有定义的变量,叫做“自由变量”
函数在哪定义,函数的父级作用域就在哪
作用域链:一个变量一直往上寻找它的父级作用域