zl程序教程

您现在的位置是:首页 >  后端

当前栏目

JS 知识点

2023-09-11 14:14:56 时间

JS三大组成部分

ECMASCRIPT(声明JS变量、判断、循环等语法)
DOM(document)
BOM(window、location等)

setTimeout

for(var i = 0; i < 3; i++){
  setTimeout(function(){
      console.log(i);   
  },0); 
};
# 答案:3

# 解决方法
for(let i = 0; i <= 3; i++){
  setTimeout(function(){
      console.log(i);   
  },0); 
};
// 0 1 2 3

for (var i = 0; i < 3; i++) {
  (function(i) {
    setTimeout(function () {
      console.log(i);
    }, 0, i)
  })(i)
};
// 0 1 2

undeclared 与 undefined 的区别?

undefined:声明了变量,但是没有赋值

undeclared:没有声明变量就直接使用

let & const 与 var 的区别?

var 存在变量提升,可重复声明同一变量,声明的变量均可改

let 没有变量提升,不可重复声明同一变量,声明的变量均可改

const 没有变量提升,不可重复声明同一变量,声明的基本数据类型不可改,引用类型可改属性,不可只声明变量而不赋值

暂时性死区问题

var a = 100;

if(1){
    a = 10;
    
    # 在当前块作用域中存在a使用let/const声明的情况下,给a赋值10时,只会在当前作用域找变量a,
    # 而这时,还未到声明时候,所以控制台 Error:a is not defined
    let a = 1;
}

获取DOM元素有哪些方法

方法描述返回类型
document.getElementById(id)通过id获取dom符合条件的dom对象
document.getElementsByTagName(tagName)通过标签名获取dom符合条件的所有dom对象组成的类数组
document.getElementsByClassName(class)通过class获取dom符合条件的所有dom对象组成的类数组
document.getElementsByName(name)通过标签的属性name获取dom符合条件的所有dom对象组成的类数组
document.querySelector(选择器)通过选择器获取dom符合条件的第一个dom对象
document.querySelectorAll(选择器)通过选择器获取dom符合条件的所有dom对象组成的类数组

操作DOM元素有哪些方法

标题描述
createElement创建一个标签节点
createTextNode创建一个文本节点
cloneNode(deep)复制一个节点,连同属性与值都复制,deep为true时,连同后代节点一起复制,不传或者传false,则只复制当前节点
createDocumentFragment创建一个文档碎片节点
appendChild追加子元素
insertBefore将元素插入前面
removeChild删除子元素
replaceChild替换子元素
getAttribute获取节点的属性
createAttribute创建属性
setAttribute设置节点属性
romoveAttribute删除节点属性
element.attributes将属性生成类数组对象

DOM的类型

元素节点              Node.ELEMENT_NODE(1)
属性节点              Node.ATTRIBUTE_NODE(2)
文本节点              Node.TEXT_NODE(3)
CDATA节点             Node.CDATA_SECTION_NODE(4)
实体引用名称节点       Node.ENTRY_REFERENCE_NODE(5)
实体名称节点          Node.ENTITY_NODE(6)
处理指令节点          Node.PROCESSING_INSTRUCTION_NODE(7)
注释节点              Node.COMMENT_NODE(8)
文档节点              Node.DOCUMENT_NODE(9)
文档类型节点          Node.DOCUMENT_TYPE_NODE(10)
文档片段节点          Node.DOCUMENT_FRAGMENT_NODE(11)
DTD声明节点            Node.NOTATION_NODE(12)

JS的作用域及作用域链

什么是作用域呢?

在 Javascript 中,作用域分为 全局作用域函数作用域

全局作用域:代码在程序任何地方都能访问,window对象的内置属性都属于全局作用域

函数作用域:在固定的代码片段才能被访问

在这里插入图片描述
作用域有上下级关系,上下级关系的确定就看函数是在哪个作用域下创建的。如上,fn作用域下创建了bar函数,那么“fn作用域”就是“bar作用域”的上级。

作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。

什么是作用域链?

一般情况下,变量取值到 创建 这个变量 的函数的作用域中取值。

但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。

var x = 10;

function fn(){
    console.log(x);
}

function show(f){
    var x = 20;
    f();    // 10 
}

show(fn);

在这里插入图片描述

数组的splice 与 slice 的区别?

方法参数描述
splicesplice(start, num, item1, item2, ...)从start索引开始,截取num个元素,并插入item1、item2到原数组里,影响原数组
sliceslice(start, end)从start开始,截取到end - 1,如果没有end,则截取到左后一个元素,不影响原数组

substr 和 substring 的区别?

方法参数描述
substrsubstr(start,length)返回从start位置开始length长度的子串
substringsubstring(start,end)返回从start位置开始到end位置的子串(不包含end)

includes 比 indexOf好在哪?

includes 可以检测 NaN,indexOf 不能检测 NaN,includes 内部使用了 Number.isNaNNaN 进行了匹配。

什么是Promise, 解决了什么问题?

有什么用呢?

1、解决回调地狱问题
2、代码可读性提高
3、你可以信任Promise,它的状态只会改变一次并且不可逆

什么是async/await?解决了什么问题?

对于async/await,我总结为一句话async/awaitgenerator + Promise的语法糖,它用同步方式执行异步代码。

new操作符为什么能创建一个实例对象?

分析一下new的整个过程:

1、创建一个空对象
2、继承构造函数的原型
3、this指向obj,并调用构造函数
4、返回对象

简单实现一下new:

function myNew (fn, ...args) {
    # 第一步:创建一个空对象
    const obj = {}

    # 第二步:继承构造函数的原型
    obj.__proto__ =  fn.prototype

    # 第三步:this指向obj,并调用构造函数
    fn.apply(obj, args)


    # 第四步:返回对象
    return obj
}

鼠标事件有哪些?

注明:鼠标左中右键看event对象上的button属性,对应1、2、3

事件说明
click单机鼠标左键触发,右键无效,当用户焦点在按钮并按下Enter,也会触发
dbclick双击鼠标左键触发,右键无效
mousedown单机鼠标任意一个按键都触发
mouseout鼠标指针位于某个元素上且将要移出元素边界时触发
mouseover鼠标指针移出某个元素到另一个元素上时触发
mouseup鼠标指针移出某个元素到另一个元素上时触发
mouseover松开任意鼠标按键时触发
mousemove鼠标在某个元素上时持续发生
mouseenter鼠标进入某个元素边界时触发
mouseleave鼠标离开某个元素边界时触发

JS数组的四种遍历方式

一.普通遍历

<script>
var arr = new Array();
	arr[0] = 2;
	arr[1] = 3;
	arr[2] = 4;
			
console.log("普通遍历:")
for(var i=0; i<arr.length;i++){
	var obj = arr[i];
	console.log(obj);
}

</script>

在这里插入图片描述

二.for/in方式

注意:需要定义数组下标;index

console.log("元素下标式遍历:")
for(var index in arr){
	console.log(arr[index]);
}

三.for/of方式

注意:需要定义数组元素(值)

console.log("元素对象式遍历:")
for(var ele of arr){//ele为数组元素值
	console.log(ele);
}

四.forEach()方式

forEach使用时的格式如下:
   数组名.forEach(function(val,index,[arr]){
   函数体;
})
其中,val为数组元素值;
index为数组下标
arr为遍历的数组名,可有可无的
console.log("forEach方式:");
# 特别注意:
# 第一个位置的参数.指的是数组元素值; 
# 第二个位置的参数:指的是数组下标;  arr(遍历的数组名)可有可无;
arr.forEach(function(val,index,arr){
		console.log(val,index);
})

<script>
var arr = new Array();
	arr[0] = 2;
	arr[1] = 3;
	arr[2] = 4;
			
console.log("forEach方式:");

/*
# 特别注意:
# 第一个位置的参数.指的是数组元素值; 
# 第二个位置的参数:指的是数组下标;  arr(遍历的数组名)可有可无;
*/

arr.forEach(function(val,index,arr){
		console.log(val,index);
})

</script>

在这里插入图片描述

console.dir() 和 console.log() 的区别

console.log() 可以取代 alert() 或 document.write(),在网页脚本中使用 console.log() 时,会在浏览器控制台打印出信息。

console.dir() 可以显示一个对象所有的属性和方法。