| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> JavaScript知识库 -> 原生面试题系列02 -> 正文阅读 |
|
|
[JavaScript知识库]原生面试题系列02 |
11、原型和原型链1)、原型: 每个函数都会有一个属性prototype。这个属性就是原型属性。JavaScript在实现面向对象时,会经常使用原型。每个对象(实例)的有一个属性( __ proto __)指向构造函数的prototype属性(prototype指向的内存区域)。prototype属性里保存着所有对象(实例)共享的属性和方法。 2)、原型链:当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的 __ proto __ 隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的 __ proto __中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。 12、作用域和作用域链原生js面试题:作用域和作用域链,let声明的全局变量不是window对象的属性_jiang7701037的博客-CSDN博客_let不影响作用域链 作用域,就是变量起作用的区域(范围)。或者说,js代码执行时,查找变量的范围。 作用域链是指:当js编译器在寻找变量时,先在最近的作用域(花括号)里找,如果找不到,则朝上一级作用域(花括号)里找,依次类推,直到找到或者找不到为止。这就是作用域链。 13、Ajax的步骤与封装 AJAX中的200和4分别是什么意思1)、AJAX的步骤: ajax的流程,readyState和status的意思
?
1、创建XMLHttpRequest
?
let xhr = new XMLHttpRequest()
?
2、设置(请求方式,请求路径,请求参数)
?
xhr.open("get", "regSave.php?username=jzm&userpass=123", true)
?
3、设置回调函数(后端有响应时,调用的回调函数)
?
? ?xhr.onreadystatechange = function() {
?
? ? ? ?if (xhr.readyState == 4 && xhr.status == 200) {
? ? ? ? ? ? ?xhr.responseText //后端响应的内容,如:php中的echo 后面跟的内容
? ? ? }
? }
?
4、发送
xhr.send();
?
//readyState:请求响应的状态(请求响应进行到哪一步了)
?
//status:响应结果的描述,是个状态码(数字)
?
2)、封装ajax的代码: ?
function ajax2110UseObj(obj){
?
? ?let defaultObj = {
? ? ? ?method:"get",
? ? ? ?url:"#",
? ? ? ?params:"",
? ? ? ?callback:null,
? ? ? ?isAsync:true
? }
?
? ?for(let key in defaultObj){
? ? ? ?// 把obj里没有传入的属性使用defaultObj的对应属性。
? ? ? ?if(obj[key]==undefined){
? ? ? ? ? ?obj[key]=defaultObj[key];
? ? ? }
? }
?
? ?// 1、创建XMLHttpRequest对象
? ?let xhr = new XMLHttpRequest();
?
? ?// 2、设置请求相关信息
? ?let urlAndParams = obj.url;
? ?if(obj.method.toLowerCase()=="get"){
? ? ? ?urlAndParams += "?"+obj.params
? }
?
? ?xhr.open(obj.method,urlAndParams,obj.isAsync);
?
? ?// 3、设置回调函数(后端响应时,调用的函数)
? ?xhr.onreadystatechange = function(){
? ? ? ?if(xhr.readyState==4 && xhr.status==200){ ? ? ? ? ? ?
? ? ? ? ? ?obj.callback && obj.callback(xhr.responseText);
? ? ? }
? }
?
? ?if(obj.method.toLowerCase()=="get"){
? ? ? ?// 4、发送请求
? ? ? ?xhr.send();
? }else if(obj.method.toLowerCase()=="post"){
? ? ? ?// 如果是post方式,必须设置请求头。
? ? ? ?xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
? ? ? ?xhr.send(obj.params);
? }
?
}
?
3)、200和4分别是什么意思 readyState属性:表示ajax从请求到响应过程中的状态,即:请求响应过程中进行到了哪一步?readyState的取值是0 ---- 4。 0:表示刚创建好对象XMLHttpRequest 1:open函数调用完毕后, 2:表示后端接收到了响应 3:表示后端正在处理 4:表示后端处理完毕(即:请求响应的过程结束了) readyState==4:表示请求响应的过程完毕 status属性: 这是表示http的响应状态码。200表示执行成功。关于其它HTTP状态码,可以查看文章: HTTP请求响应系列02_响应报文的详解_jiang7701037的博客-CSDN博客 14、深浅拷贝 区别以及如何进行深拷贝面试题:深拷贝和浅拷贝(超级详细,有内存图)_jiang7701037的博客-CSDN博客_深拷贝和浅拷贝 场景: 说深拷贝和浅拷贝,特指引用类型。 区别: 深拷贝: 把引用类型的地址及其它的数据都拷贝一份 浅拷贝: 只拷贝了引用类型的地址 如何进行深拷贝: 深拷贝的思路: 创建空对象,循环原对象的每个键,一一 赋值给空对象,并使用递归的方式,把对象属性也进行复制,以下为示例代码: ?
// 功能:封装一个深拷贝的函数
// 参数:被拷贝的对象
// 返回值:拷贝的对象
?
function copyObj(obj){
? ?let newObj ={};
? ?for(let key in obj){ ? ? ? ?
? ? ? ?if(typeof obj[key] == "object"){ //如果说当前属性是对象的话,那么再做深拷贝
? ? ? ? ? ?newObj[key] = copyObj(obj[key]);
? ? ? }else{
? ? ? ? ? ?newObj[key] = obj[key];
? ? ? }
? }
? ?return newObj;
}
?
var obj1= {
? ?name:"张三疯",
? ?sex:"男",
? ?address:{
? ? ? ?province:"陕西",
? ? ? ?city:"西安"
? }
}
?
let obj2 = copyObj(obj1);
面试题:深拷贝和浅拷贝(超级详细,有内存图)_jiang7701037的博客-CSDN博客_深拷贝和浅拷贝 15、promise都有哪几种状态 其执行状态概述: Promise是异步编程的一种解决方案,从语法上讲,Promise是一个对象,可以获取异步操作的消息 作用: (1)、避免回调地狱的问题 (2)、Promise对象提供了简洁的API,使得控制异步操作更加容易 Promise有三种状态: pendding :正在进行中, rejected :失败, resolved : 成功 基础用法: new Promise(function(resolve,reject){ 异步代码 }) 16、数组去重的方法①利用数组indexof方法 ? function unique(arr) {
? ? ? ?var arr1 = [];
? ? ? ?for (var i = 0; i < arr.length; i++) {
? ? ? ? ? ?if (arr1.indexOf(arr[i]) == -1) {
? ? ? ? ? ? ? ?arr1.push(arr[i]);
? ? ? ? ? }
? ? ? }
? ? ? ?return arr1;
? }
?
? ?console.log(unique([1,1,2,2,3,3,3,4,5,6,6,6,7]));//1,2,3,4,5,6,7
②ES6的Set function unique(arr){
? ?return [...new Set(arr)]
}
?
console.log(unique([1,2,1,2,2,3,2,1]));
数组去重的方法比较多,大家可以自行再思考 17、js如何创建数组,js数组都有哪些方法?1、有两种创建方式: ①字面量创建: var arr=[]; ②构造函数创建: var arr1=new Array(); 2、js数组的方法: push 尾增 pop 尾删 unshift 头增 shift 头删 concat 数组拼接 join 数组转字符串 reverse 逆序 sort 按字符串UniCode码排序 map 对数组的每个元素做某个处理,参数是回调函数,并且有返回值 slice 复制 indexOf 查找数组中的元素,找到返回该元素下标, 没找到返回-1 splice 截取 filter 过滤 every 对数组中的每一项进行判断,若都符合则返回true,否则返回false some 对数组中的每一项进行判断,若都不符合则返回false,否则返回true reduce:将数组所有数值进行叠加返回 forEach 对数组的每个元素做某个处理,参数是回调函数 18、同一个数组,同样的限制条件,map和filter find返回值有什么区别相同点:都不会改变原数组 不同点: map返回值是一个新的数组,新数组中的元素为原始数组中的元素调用函数处理后的值。 find返回值:方法返回数组中满足提供的测试函数的第一个元素的值,否则返回 undefined。返回值不是数组! const array1 = [5, 12, 8, 130, 44]; ? const found = array1.find(element => element > 10); ? console.log(found);//12 ? filter返回值:返回一个新数组 是原数组中符合条件的所有元素。 19、延时器(宏任务微任务)javascript的事件循环(event loop)_jiang7701037的博客-CSDN博客 1)、宏任务(macrotask ) 宏任务一般包括: setTimeout,setInterval,I/O 操作(包括AJAX请求)。 2)、微任务(microtask ) 微任务一般包括:promise.then() 里的操作 20、闭包 什么情况下会使用闭包概念:定义在一个函数内部的函数,并且这个内部函数能够访问到外层函数中定义的变量 作用: ①让外部访问函数内部变量成为可能 ②局部变量会常驻在内存中 ③可以避免使用全局便变量,防止全局变量污染 缺点: 会造成内存泄露(内存空间长期被占用,而不被释放) 场景: 1)、只有一个方法的对象 因为闭包允许将函数与其所操作的某些数据(环境)关联起来。这显然类似于面向对象编程。在面向对象编程中,对象允许我们将某些数据(对象的属性)与一个或者多个方法相关联。 因此,通常你使用只有一个方法的对象的地方,都可以使用闭包。 示例: //面向对象的类
// class Person{
// ? ? constructor(){
// ? ? ? ? this.name = "陈琳"
// ? ? }
?
// ? ? eat(){
// ? ? ? ? console.log(this.name+"在吃,天在看……");
// ? ? }
// }
?
// let p1 = new Person();
?
// p1.eat();
?
//使用闭包
function person(str){
? ?var name = str;
? ?return function(){
? ? ? ?console.log(name+"在吃,天在看……");
? }
}
?
let eat = person("陈琳");
eat();
?
2)、如果某些数据,只希望某些函数操作使用 3)、用闭包模拟私有方法 编程语言中,比如 Java,是支持将方法声明为私有的,即它们只能被同一个类中的其它方法所调用。 而 JavaScript 没有这种原生支持,但我们可以使用闭包来模拟私有方法。私有方法不仅仅有利于限制对代码的访问:还提供了管理全局命名空间的强大能力,避免非核心的方法弄乱了代码的公共接口部分 function person(str){
? ?var name = str;
? ?var age = 20;
? ?
? ?function setAge(transAge){
? ? ? ?fn2();
? ? ? ?age = transAge;
? }
?
? ?function getAge(){
? ? ? ?fn2();
? ? ? ?return age;
? } ? ?
?
? ?function fn2(){
? ? ? ?console.log("fn2");
? }
?
? ?return {
? ? ? ?setAge:setAge,
? ? ? ?getAge:getAge
? } ?
}
?
let p = person("陈琳");
p.setAge(18);
console.log(p.getAge());
?
p.fn2();
|
|
|
| JavaScript知识库 最新文章 |
| ES6的相关知识点 |
| react 函数式组件 & react其他一些总结 |
| Vue基础超详细 |
| 前端JS也可以连点成线(Vue中运用 AntVG6) |
| Vue事件处理的基本使用 |
| Vue后台项目的记录 (一) |
| 前后端分离vue跨域,devServer配置proxy代理 |
| TypeScript |
| 初识vuex |
| vue项目安装包指令收集 |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年12日历 | -2025/12/4 5:49:02- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |