JavaScript基础总结(4)

最近在写一些JavaScript的实践例子,发现了一些知识点,总结一下。

一、JavaScript中的数据类型

es5中一共有6种数据类型,分别是:Number、String、Boolean、Null、undefined、object。
es6中新增了一种:Symbol 。这种类型的对象是永不相等的,即始在创建时传入相同的赋值,可以解决属性名冲突,设置为标记。
谷歌67版本中还出现了一种 bigInt类型。指的是安全存储、操作大整数。(但是很多人不把这个做为一个类型)。
其中:
值类型:String、Number、boolean、null、undefined。
引用类型:object。里面包含的 function、Array、Date。

二、声明函数作用和变量作用提升

函数声明作用:解析器在向执行环境中加载数据时,对函数声明和函数表达式并非是相同的。解析器会率先读取函数声明,并使其在执行任何代码之前可用;至于函数表达式,则必须等到解析器执行到它所在的代码行时,才会真正被执行。

重点:在代码开始执行之前,解析器就已经通过一个函数声明提升的过程,读取并将函数声明添加到执行环境中。对代码求值时,JavaScript引擎在第一遍会声明函数并将它们放到源代码树的顶部。所以,即使声明函数的代码在调用它的代码后面,JavaScript 引擎也能把函数声明提升到顶部。

变量声明提升:变量的作用域是整个函数,但仅在var语句出现的位置进行赋值。var声明的变量会被提升到它所在的作用域的最顶端。

重点:变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后代码在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值。后面声明的同名函数会覆盖前面同名函数。

区别:在Js中,函数是第一对象,具有优先级,所以在函数和变量同时进行声明时,函数会被优先声明。

三、Js检测数据类型的几种方式
JavaScript有四种检测数据类型的方式

1、typeof
一元运算符,用来检测数据类型。只可以检测number,string,boolean,object,function,undefined。
对于基本数据类型是没有问题的,但是无法细分对象。

2、instanceof
二元运算符,需要两个操作数
检测某个对象是不是另外一个对象的实例
instanceof只可以判断对象和函数,不可以用来判断字符串类型和数字类型。

3、constructor
Js中所有对象都继承于Object,constructor是其中的一个属性。默认指向实例的构造函数。

4、Object.prototype.toString.call
Js中,通过Object.prototype.toString方法,判断某个对象属于哪种内置类型。

四、事件流、冒泡和捕获

事件流:当一个HTML元素产生一个事件时,该事件会在元素节点与根节点之间的路径传播,路径所经过的节点都会收到该事件,这个传播的过程叫做DOM事件流。

冒泡:事件由子元素传递到父元素的过程,叫做冒泡;
捕获:事件由父元素到子元素传递的过程,叫做事件捕获。

五、如何添加一个dom对象到body中?innerHTML和innerText有什么区别?
添加方法:document.getElementsByTagName(“body”).innerHTML="";

innerText会将所有输出的东西以文本的形式展示在页面上,inderHTML则会返回元素的HTML结构,根据内容会自动创建DOM。

六、事件的委托及其优点
       利用事件冒泡处理动态元素事件绑定的方法,专业术语叫事件委托,简单点来说就是给父元素绑定事件,用来监听子元素的冒泡事件,并找到是哪个子元素的事件,更加通俗一点那就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。
优点:
1、事件委托技术可以避免对每个字元素添加事件监听器,减少操作DOM节点的次数,从而减少浏览器的重绘和重排,提高代码的性能。
2、使用事件委托,只有父元素与DOM存在交互,其他的操作都是在JS虚拟内存中完成的,这样就大大提高了性能。

七、节点类型及其判断方法

节点类型 说明及值
元素节点 每一个HTML标签都是一个元素节点,如 <div> 、 <p>、<ul>等 ,值为1
属性节点 元素节点(HTML标签)的属性,如 id 、class 、name 等。值为2
文本节点 元素节点或属性节点中的文本内容。值为3
注释节点 表示文档注释,形式为<!-- comment text -->。值为8
文档节点 表示整个文档(DOM 树的根节点,即 document )值为9

nodeType、nodeName、nodeVale判断节点类型,节点名称和节点值。

八、用js检测一个元素是显示还是隐藏
通过display是否等于none来判断。

<div class="wrap" style="display:none">
	元素
</div>
function  isNone(){
	if ($("div").css("display") == "none") {
		alert("这是一个diaplay=none的元素")
	}else{
		alert("这不是一个diaplay=none的元素")
	}
}

九、同步和异步

同步:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。如果在函数返回的时候,调用者就能够得到预期的结果(即拿到了预期的返回值或者看到了预期的效果),那么这个函数就是同步的。

异步:不进入主线程、而进入"任务队列"的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。如果在函数A返回的时候,调用者还不能马上得到预期的结果,而是需要在将来通过一定的手段得到,那么这个函数就是异步的 。

十、null和undefined的区别

null表示没有对象,即该处不应该有值
1) 作为函数的参数,表示该函数的参数不是对象
2) 作为对象原型链的终点

undefined表示缺少值,即此处应该有值,但没有定义
1)定义了形参,没有传实参,显示undefined
2)对象属性名不存在时,显示undefined
3)函数没有写返回值,即没有写return,拿到的是undefined
4)写了return,但没有赋值,拿到的是undefined

null和undefined转换成number数据类型:

null 默认转成 0
undefined 默认转成 NaN

十一、拖拽会用到的事件以及注意事项

dragstart:拖拽开始时触发事件
dragenter:拖拽鼠标进入元素时在该元素上触发
dragover:拖拽时鼠标在目标元素上移动时触发
dragleave:拖拽时鼠标移出目标元素时在目标元素上触发
drag:拖拽期间在被拖拽元素上连续触发
drop:鼠标在拖放目标上释放时,在拖放目标上触发
dragend:鼠标在拖放目标上释放时,在拖拽元素上触发

注意事项:在使用拖拽时,要注意阻止一些比如说冒泡事件来防止影响或者中断拖拽,而且拖拽内容和面向的对象也要注意属性,最后还要注意浏览器的兼容性问题。

十二、字符串操作函数
concat() : 将两个或多个字符的文本组合起来,返回一个新的字符串。
indexOf() :返回字符串中一个子串第一处出现的索引。如果没有匹配项,返回 -1 。
charAt() :返回指定位置的字符。
lastIndexOf() : 返回字符串中一个子串最后一处出现的索引,如果没有匹配项,返回 -1 。
match() :检查一个字符串是否匹配一个正则表达式。
substr() 函数 :返回从string的startPos位置,长度为length的字符串
substring() :返回字符串的一个子串。传入参数是起始位置和结束位置。
slice() :提取字符串的一部分,并返回一个新字符串。
replace() :用来查找匹配一个正则表达式的字符串,然后使用新字符串代替匹配的字符串。
search() :执行一个正则表达式匹配查找。如果查找成功,返回字符串中匹配的索引值。否则返回 -1
split() :通过将字符串划分成子串,将一个字符串做成一个字符串数组。
length :返回字符串的长度,所谓字符串的长度是指其包含的字符的个数。
toLowerCase() :将整个字符串转成小写字母。
toUpperCase() :将整个字符串转成大写字母。

十三、如何理解闭包
闭包就是能够读取其他函数内部变量的函数。在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成:定义在一个函数内部的函数。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

十四、js垃圾回收机制
现在各大浏览器通常用采用的垃圾回收有两种方法:标记清除、引用计数。
1、标记清除
这是最常用的,在变量进出环境时都会被做上不同的标记,垃圾收集器运行时会给内存中的所有变量都加上标记,然后会去掉环境中的变量和标记。在此之后加上标记的变量就会被删除清理,意思是环境中已经无法访问到这些变量了,所以做删除处理。
2、引用计数
变量被赋值,则这个值的引用计数为1;之前赋值的变量重新赋了一个值,则之前这个值的引用次数就减1;如果减为0的时候,则说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。这样,垃圾收集器下次再运行时,它就会释放那些引用次数为0的值所占的内存。

发布了29 篇原创文章 · 获赞 1 · 访问量 574

猜你喜欢

转载自blog.csdn.net/Always_Love/article/details/103888043