JS知识库

JS知识库

这是我的个人知识库的一部分,欢迎访问

JS知识库 | 前端知识库@阳树阳树🚀

#基础知识点

#this相关问题

this的顺序规则:
1.函数是否在new中调用(new绑定)?如果是的话this绑定的是新创建的对象。

var bar = new foo();

2.函数是否通过call、apply(显式绑定)或者硬绑定调用?

var bar = foo.call(obj2);

3.函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this绑定的是那个上下文对象。

var bar = obj1.foo();

4.如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到undefined,否则绑定到全局对象。

 var bar = foo();

#DOM核心

#关于DOM操作,主要有创建,增,删,改,查,属性操作,事件操作。

#(1)创建

1.document.write
2.innerHTML
3.createElement

state:
1.document.write 是直接将内容写入页面的内容流,但是文档流执行完毕会导致页面全部重绘,只保留html标签和写入内容。
2.innerHTML 是将内容写入某个DOM节点,不会导致页面全部重绘。
3.innerHTML 创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂。

innerHTML在不使用拼接字符串的情况下,比创造元素拼接元素要快一些。 4.虽然createElement()创建多个元素慢一些,但是结构更清晰。

#(2)增

1.appendChild

// 此方法在node节点「父亲节点」里,顺序增加一个节点
node.appendChild(child)

2.insertBefore

// 此方法在node节点「父亲节点」里,在开头增加一个节点
node.insertBefore()

#(3)删

1.removeChild

//此方法从DOM中删除一个子节点,返回删除的节点。
node.removeChild()

#(4)改

主要修改dom的元素属性,dom的内容,属性,表单的值等

修改内容index
元素属性src,href,title
普通元素内容innerHTML,innerText
元素样式style,className
表单内容value,type,disabled

#(5)查

1.DOM提供的API方法:getElementById,getElementByTagName(古老用法)
2.H5提供的新方法:querySelector,querySelectorAll
3.利用节点操作获取元素:父(parentNode),子(children),兄(previousElementSibling,nextElementSibling)

#(6)属性操作

1.setAttribute:设置dom的属性值 2.getAttribute:得到dom的属性值 3.removeAttribute移除属性

#(7)事件操作

鼠标事件触发条件
onclick鼠标点击触发
onmouseover鼠标经过触发
onmouseout鼠标离开触发
onfocus获得鼠标焦点触发
onblur失去鼠标焦点触发
onmousemove鼠标移动触发
onmouseup鼠标谈起触发
onmousedown鼠标按下触发

#《你不知道的JavaScript》读书笔记

let,var and const

1.let
(1)let 如果是在作用块中定义的变量,不会提升「如果先用后定义会报错,undefined」,并且作用域也不变。
(2)let不可以重复声明,否则会报错;var则可以。

建议:写代码的时候加一对花括号来“显式”标明这个作用块

2.var 如果是在作用块中定义的变量,会提升到该作用块的开头部分「但只会提前声明而不会提前赋值」,同时作用域上升一级。

3.const 定义一个变量,声明变量时必须初始化变量,同时const也不能被重复声明
如果这个量被改变会报错
不过如果const声明的是一个对象,那改变对象里面的值并不算修改了这个对象,所以可以,也并不会报错。

IFFE:立即执行函数

IFFE(Immediately Invoked Function Expression):立即执行函数

在书上看到的内容巧合的出现在了JavaScript的专业课程上,有种不期而遇的幸福感
立即执行函数有两种执行方式:
1.(fun{….}());
2.(fun{….})();
好处:不会污染全局作用域

LHS and RHS

1.LHS:赋值操作的目标是谁「左侧」
2.RHS(retrieve his source value):谁是赋值操作的源头「非左侧」

提升

var a = 2;

这段代码可以拆分成

var a

a = 2

两个语句。
第一个语句自动提升到该作用域的最顶部,
而第二个语句保留在原位置:“使用var时,没有一个一个变量是未声明的”

闭包

理解:

闭包使得函数可以从外部访问定义时的词法作用域。

识别闭包:

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。

典型例子:

function foo() {
	var a = 2;

	function bar() {
		console.log( a );
	}
	return bar;
}
var baz = foo();
baz();//console.log(a) ==> 2

块作用域与闭包结合
需求:从1打印到5

代码1:

for(var i = 1 ; i <= 5; i++){
     (function(){
       	 setTimeout(function timer(){
                console.log( i );
            },i*1000);
            })();
    	}
		// 6 6 6 6 6

原因:
一直输出6是因为i是共用的,执行完了五次循环之后,创建了五个事件之后,i=6

代码2:

for(var i = 1 ; i <= 5; i++){
        (function(j){
           // var j = i;
            setTimeout(function timer(){                    		console.log( j );
            },j*1000);
        })( i );
    }
	//1 2 3 4 5

原因:
每次创建这个函数的时候都有一个传入值,不会复用i

代码3:

  for(let i = 1 ; i <= 5; i++){
        (function(){
            setTimeout(function timer(){
               console.log( i );
            },i*1000);
        })();
    }
// 1 2 3 4 5 

原因:
每次创建这个函数的时候let都创建了一个块作用域,i是小的作用域里的,已经覆盖掉了原本的i,所以没问题

#JS知识点每日一题

#JS原始数据类型有哪些?引用数据类型有哪些?

#七大原始值

1.boolean
2.symbol
3.null
4.undefined
5.string
6.number
7.bigint

#引用数据类型

对象:Object(包含普通对象-Object,数组对象-Array,正则对象-RegExp,日期对象-Date,数学函数-Math,函数对象-Function)

#this的指向问题

#this隐式绑定的情况

1.全局上下文
2.直接调用函数
3.对象.方法的形式调用
4.DOM事件绑定(特殊)
5.new构造函数绑定
6.箭头函数

#全局上下文

全局上下文默认this指向window, 严格模式下指向undefined。

#直接调用函数

直接赋值然后调用

See More

let obj = {
  zzk: function() {
    console.log(this);
  }
}
let func = obj.zzk;
func();

直接调用this相当于全局上下文

#对象.方法的形式调用

obj.zzk();

这就是对象.方法的的情况,this指向对象

#DOM事件绑定

onclick和addEventerListener中 this 默认指向绑定事件的元素。

IE比较奇异,使用attachEvent,里面的this默认指向window。

#new+构造函数

此时构造函数中的this指向实例对象。

#箭头函数?

箭头函数没有this, 因此也不能绑定。里面的this会指向当前最近的非箭头函数的this,找不到就是window(严格模式是undefined)。比如:

See More

let obj = {
  a: function() {
    let do = () => {
      console.log(this);
    }
    do();
  }
}
obj.a(); 
// 找到最近的非箭头函数a,a现在绑定着obj, 因此箭头函数中的this是obj

优先级: new > call、apply、bind > 对象.方法 > 直接调用。

#分析实例

eg1:

See More

function a(){
	function b(){
		console.log(this);
		function c() {
			"use strict";
			console.log(this);
		}
		c();
	}
	b();
}
a();
//输出为 Winodw和undefined;
//执行顺序是首先调用a()方法,然后嵌套着调用b()方法,此时console.log(this)为全局--> Window
//调用b()方法的时候又会调用c()方法,在function c()中使用了严格模式,在严格模式中默认this为undefined
//其实就是第一个是全局,第二个是严格模式的默认值

eg2:

See More

var name = '小白';

function special() {
	console.log('姓名:'+this.name);
}

var girl = {
	name:'zzk',
	detail: function () {
		console.log('姓名:'+this.name);
	},
	woman: {
		name:'cxz',
		detail: function(){
			console.log('姓名:'+this.name);
		},
	},
	special:special,
}

girl.detail();
//ans:zzk
//这是对象.方法的情况
//this指向这个对象
girl.woman.detail();
//ans:cxz
//看后面两个,还是对象.方法的情况,this指向这个对象
girl.special();
//ans:zzk
//这是对象.方法的情况
//this指向这个对象

#原始类型有哪几种?null 是对象嘛?

答:
原始数据类型有6种,分别是:“Symbol,number,String,null,undefined,boolean.”
用typeof来查看null的话,显示的确实是Object,但其实这是历史遗留的Bug。
在 JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,
000 开头代表是对象,然而 null 表示为全零,所以将它错误的判断为 object 

#浅拷贝与深拷贝

​​​​​​​

浅拷贝与深拷贝

offset

client

scroll

​​​​​​​ 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值