• JS面试题(一)


    1.什么是window对象?什么是document对象?

    window对象代表浏览器中打开的一个窗口。
    document对象代表整个html文档。实际上,
    document对象是window对象的一个属性。
    

    2. 如何判断一个对象是否属于某个类

    使用 instanceof 即if(a instanceof Person) {alert(‘yes’)} 【in stæns]】
    

    3. 对JSON的了解

    一种轻量级的数据交换格式.
    类似于xml。数据格式简单,易于读写,占用宽带小.
    JSON的值是键值对的形式(key: value).
    两个函数:
    JSON.parse(str) // 解析JSON字符串变成js值或对象
    JSON.stringify(obj) // 将一个js值(对象或者数组)转换为一个JSON字符串
    

    4. JS 中的主要有哪几类错误

    JS有三类的错误:
    加载时错误:加载web页面时出现的错误(如语法错误)称为加载时错误。
    运行时错误:由于滥用html语言中的命令而导致的错误。
    逻辑错误:这些错误是由于对具有不同操作的函数执行了错误的逻辑而导致的
    

    5. JS中如何将页面重定向到另一个页面?

    使用 window.location.replace(url)
    window.location.replace(" https://www.onlineinterviewquestions.com/");
    

    6.JS中的深拷贝与浅拷贝的区别?

    在深拷贝中,新对象中的更改不会影响原始对象,
    而在浅拷贝中,新对象中的更改,原始对象中也会跟着改。
    

    7. 解释一下什么是箭头函数?

    在es6中有了箭头函数。
    箭头函数不能用作构造函数,也不支持this,
    arguments,super
    

    8. encodeURI()

    encodeURI() 函数可以对URL进行编码。
    【它将url作为参数并返回编码的字符串】
    var uri = "my profile.php?name=sammer";
    var encoded_uri = encodeURI(uri);
    

    8.0 decodeURI()

    decodeURI()函数用于解码js中的URL。
    var uri = "my profile.php?name=sammer";
    var encoded_uri = encodeURI(uri);
    decodeURI(encoded_uri);
    
    encodeURI()编码 嗯往下按【编码】
    decodeURI()解码 
    

    9.有哪些内置对象?

    有6个
    Function、Arguments、Math、Date、RegExp(正则表达式)、Error
    

    10 DOM怎样添加、移除、移动、复制、创建和查找节点 ???

    // 创建新节点
    createDocumentFragment() //创建一个DOM片段
    createElement() //创建一个具体的元素
    createTextNode() //创建一个文本节点
    
    // 添加、移除、替换、插入
    appendChild()
    removeChild()
    replaceChild()
    insertBefore() //在已有的【子节点前】插入一个新的子节点
    

    11.null和undefined的区别?

    1. null表示一个尚未存在的对象。
    1. undefined 定义了变量但是没有赋值。
    
    2. ECMAScript 认为undefined是unll派生出来的。
    他们的值是一样的,但是类型却是不一样的。
    null==undefined (ok)  null === undefined (err) 
    
    3 null转为数值时为0
      undefined转为数值时为NaN
    
    NaN是一个非数字类型的number类型。
    NaN==NaN(ok)  NaN===NaN(ok) 
    

    12. 什么情况下会出现 undefined。

    (1)变量被声明了但没有赋值时,就等于undefined。
    
    (2) 调用函数时,该提供的参数没有提供,该参数等于undefined。
    
    (3)对象没有该属性的时候,该属性的值为 undefined。
    
    (4)函数没有返回值时,默认返回undefined。
    function fn2(){
    	var per = 'xxxx';
    	//无返回值
    }
    var b = fn2();
    console.log(b); //出现 undefined
    将函数赋值给一个变量,然后输出这个变量就是undefined 
    

    13.什么是跨域?

    协议, 域名, 端口号, 不同就是不同的域。
    不同的域之间相互请求资源,就叫“跨域”。
    ps:https与http也是不同的域
    
    浏览器基于:“同源策略”
    认为跨域请求是不安全的 所以拒绝访问。(浏览器把响应的数据拦截了)
    

    14.解决跨域的方式

     1)后端代理。
    
    2)JSONP(利用script标签的src属性跨域 只是支持get方式 不支持post方式 且 需要后端支持)
    
    3)设置响应头(cros) (后端) (推荐)
    res.header("Access-Control-Allow-Origin", "*");  // 允许访问的域 * 代表左右
    res.header("Access-Control-Allow-Headers", "需要携带的请求头"); // 允许携带的请求头
    

    15.判断数组的方式有哪些 (5种)

    1.通过原型链做判断
    (目标源arr).__proto__ === Array.prototype;
    
    2.通过ES6的Array.isArray()做判断
    Array.isArrray(目标源arr); 【əˈreɪ]】
    
    3.通过instanceof做判断
    arr instanceof Array
    
    4.通过Array.prototype.isPrototypeOf
    Array.prototype.isPrototypeOf(arr) true
    
    5.通过Object.prototype.toString.call()做判断
    Object.prototype.toString.call(arr).slice(8,-1) === 'Array';
    Object.prototype.toString.call(arr)==="[object Array]"   
    

    明天继续=======================

    16. 数据类型检测的方式有哪些

    1==>typeof 对数组、对象、null都会被判断为object。
    其他判断都正确。
    所以typeof判断基本数据类型。
    console.log(typeof 2) //number
    console.log(typeof null);// object
    
    2==>instanceof能正确判断引用数据类型
    console.log(2 instanceof Number);// false
    
    3.constructor有两个作用,
    一是判断数据的类型。
    二是对象实例通过 constrcutor 对象访问它的构造函数。
    需要注意,如果创建一个对象来改变它的原型。
    constructor就不能用来判断数据类型了:
    console.log((2).constructor === Number); // true
    
    4.Object.prototype.toString.call()
    Object.prototype.toString.call()使用Object对象的原型方法 toString 来判断数据类型:
    var a = Object.prototype.toString;
    console.log(a.call(2)); //[object Number]
    

    17. typeof null 的结果是什么,为什么?

    typeof null 的结果是Object。
    因为:在 JavaScript 第一个版本中,
    所有值都存储在 32 位的单元中
    每个单元包含一个小的类型标签和当前要存储值的真实数据
    【类型标签】存储在每个单元的低位中,共有五种数据类型。
    000: object   - 当前存储的数据指向一个对象。
      1: int      - 当前存储的数据是一个 31 位的有符号整数。
    010: double   - 当前存储的数据指向一个双精度的浮点数。
    100: string   - 当前存储的数据指向一个字符串。
    110: boolean  - 当前存储的数据是布尔值。
    
    有两种特殊数据类型:
    undefined的值是 (-2)30(一个超出整数范围的数字);
    null 的值是机器码 NULL 指针(null 指针的值全是 0)
    
    那也就是说null的类型标签也是000,
    和Object的类型标签一样,所以会被判定为Object。
    

    17.1 typeof null 的结果是什么,为什么?我的理解

    typeof null 的结果是Object。
    因为:在 JavaScript 第一个版本中,
    所有值都存储在 32 位的单元中
    每个单元包含一个【小的类型标签】和当前要存储值的【真实数据】
    {000: object   - 当前存储的数据指向一个对象。你的理解}
    object的标签类型是000
    
    null 的值是机器码 NULL 指针(null 指针的值全是 0)
    和Object的类型标签一样,所以会被判定为Object。
    

    18 为什么0.1+0.2 ! == 0.3,如何让其相等

    
    

    19 typeof NaN 的结果是什么?

    typeof NaN; // "number"
    

    20 解释一下NaN,或者你对NaN的理解

    NaN是一个非数字类型的Number类型。不是一个明确的值。
    在“执行数学运算没有成功,这是失败后的结果”。
    如果时间运算失败的情况会出现NaN.
    在ios的移动时间是 2012-12-12 12:12:12在进行元素的时候可能返回NaN
    

    21 解释一下什么是 promise ?

    promise是js中的一个对象,用于生成[可能在将来]产生结果的值。 
    promise 可以有三种状态:
    1.pending:初始状态,既不是成功也不是失败
    2.fulfilled:意味着操作完全成功 [fu fei old]
    3.rejected:意味着操作失败 [ rejected ]
    在使用的时候,new Promise,在Promise中有两个参数resolve, reject,
    他们既是参数也是函数。resolve处理成功。reject处理失败的。
    

    明天继续========================

    es6的面试题

    22 let、const、var的区别

    块级作用域,变量提升,添加全局属性,重复声明,暂区时性死,初始值设置
    
    1. let 和const具有作用域 
    2. var存在变量提升,let和const不存在变量提升
    
    3. 给全局添加属性:
    使用var声明的变量,会添加到全局对象window作为属性.可以通过window.变量名访问
    let和const不会
    
    4. var声明变量时,可以重复声明变量,相同名变量会覆盖之前声明的。
    const和let不允许重复声明变量。
    
    5暂时性死区: 在使用let、const命令声明变量之前,该变量都是不可用的。
    这在语法上,称为暂时性死区。使用var声明的变量不存在暂时性死区。
    
    6 初始值设置:在变量声明时,
    var 和 let 可以不用设置初始值。
    而const声明变量必须设置初始值
    

    23 const对象的属性可以修改吗

    答:对象的属性是可以修改的。
    因为:
    const保证的并不是变量的值不能改动,
    而是变量指向的那个[内存地址]不能改动.
    对于基本类型的数据(数值、字符串、布尔值),变量指向的那个内存地址.
    
    但对于引用类型的数据(主要是对象和数组)来说,
    保存的只是一个指针,const只能保证这个指针的指向是固定不变的。
    至于它指向的数据结构【是不是】可变的,就完全不能控制了。
    
    代码解释
    const obj={
      name:'咋还尼桑'
    }
    obj.name='2131'
    console.log(obj.name);
    

    24.箭头函数与普通函数的区别

    如果只有一个参数,可以省去参数的小括号   const a=name=>{}
    如果函数体的返回值只有一句,可以省略大括号
    如果函数体不需要返回值,且只有一句话,可以给这个语句前面加一个void关键字。
    最常见的就是调用一个函数:
    let fn = () => void doesNotReturn();
    
    最大区别:1.不能使用new,不能作为构造函数。
    2.箭头函数不绑定arguments
    3.箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值
    4.箭头函数没有原型属性 是undefined
    5.箭头函数不能当做Generator函数,不能使用 yield 【有d】 关键字
    
    var a = ()=>{
      return 1;
    }
    function b(){
      return 2;
    }
    console.log(a.prototype);  // undefined
    console.log(b.prototype);   // {constructor: ƒ}
    <!-- https://www.cnblogs.com/biubiuxixiya/p/8610594.html -->
    

    25. 箭头函数的this指向哪⾥?

    箭头函数不同于传统JavaScript中的函数,箭头函数并没有属于⾃⼰的this,
    它所谓的this是捕获其所在上下⽂的 this 值,作为⾃⼰的 this 值,
    并且由于没有属于⾃⼰的this,所以是不会被new调⽤的
    

    26. 扩展运算符的作用及使用场景

    取出对象中的所有可遍历属性,拷贝到当前对象之中
    let bar = { a: 1, b: 2 };
    let baz = { ...bar }; // { a: 1, b: 2 }
    
    数组的扩展运算符:可以将一个数组转为用逗号分隔的【参数序列】,且每次只能展开一层数组。
    console.log(...[1, 2, 3])  // 1 2 3
    console.log(...[1, [2, 3, 4], 5])
    // 1 [2, 3, 4] 5
    

    27. javascript的typeof返回哪些数据类型. 开始的

    答案:string,boolean,number,undefined,function,object。
    null 数组 是object
    

    28 字符串与数组的转换

    split()前者是将字符串切割成数组的形式,
    join() 的区别是将数组转换成字符串
    巧计:一串串的,像是脚印,join
    

    29 如何阻止事件冒泡

    答案:ie:阻止冒泡e.cancelBubble = true; [kan shuo ba bo]
    非IE event.stopPropagation(); [ pa p儿 gA xing]
    

    30 如何阻止默认事件

    答案:(1)return false;(2) event.preventDefault();
    

    31 创建新节点

    createElement() //创建一个具体的元素
    createTextNode() //创建一个文本节点
    
    2)添加、移除、替换、插入
    appendChild() //添加
    removeChild() //移除
    replaceChild() //替换
    insertBefore() //插入
    

    32. document load 和document ready的区别

    答案:document.onload 是在结构和样式,外部js以及图片加载完才执行js.
    document.ready是[dom树创建完成]就执行的方法,原生种没有这个方法,
    jquery中有 $().ready(function)
    

    33.Javascript的事件流模型都有什么?

    “事件冒泡”:事件由最具体的元素接受,然后逐级向上传播
    “事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的
    “DOM事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡
    

    34 js延迟加载的方式有哪些?

    1. 按需异步载入js
    2.(创建script,插入到DOM中,加载完毕后callBack)、
    3. defer和async、动态创建DOM方式
    

    ============================================ 明天继续===============================

    35. 如何获取javascript三个数中的最大值和最小值?

    【 mæ θ】Math 数学
    Math.max(a,b,c);//最大值
    Math.min(a,b,c)//最小值
    

    36.form中的input可以设置为readonly和disable,请问2者有什么区别?

    readonly 不可编辑,可以选择和复制;值可以传递到后台
    disabled 不可编辑,不能选择和复制;值不可以传递到后台
    

    37 可视区域距离页面顶部的距离

    let scrollTop=document.documentElement.scrollTop
    ||document.body.scrollTop
    

    38. 节点的种类有几种,分别是什么?

    (1)元素节点:nodeType ===1;
    (3)属性节点:nodeType ===2;
    (2)文本节点:nodeType ===3;
    元1属2文3
    

    39. {offsetWidth offsetHeight}和{clientWidth clientHeight}的区别

    (1)offsetWidth (content宽度+padding宽度+border宽度)
    (2)offsetHeight(content高度+padding高度+border高度)
    
    (3)clientWidth(content宽度+padding宽度)
    (4)clientHeight(content高度+padding高度)
    
    client [k lai en t]
    Width  【wei d  s】
    

    40.判断数组的方式有哪些 (5种)

    1.通过原型链做判断
    (目标源arr).__proto__ === Array.prototype;
    
    2.通过ES6的Array.isArray()做判断
    Array.isArrray(目标源arr); 【əˈreɪ]】
    
    3.通过instanceof做判断
    arr instanceof Array
    
    4.通过Array.prototype.isPrototypeOf
    Array.prototype.isPrototypeOf(arr) true
    
    5.通过Object.prototype.toString.call()做判断
    Object.prototype.toString.call(arr).slice(8,-1) === 'Array';
    Object.prototype.toString.call(arr)==="[object Array]"   
    

    =========================================================================

    有趣的循环

    for(var i = 1; i <= 3; i++){  //建议使用let 可正常输出i的值
      setTimeout(function(){
          console.log(i);   //4 4 4
      },0); 
    };
    
    这个问题说明的是:先执行同步,然后再去执行异步。
    let 会产生块级作用
    
    为啥是4, i=4的时候,不满足条件,循环了3次。
    let 会产生块级做作用域 输出 1 2 3
    

    有趣的题

    var a = 100;
    function test() {
      alert(a); //100 
      a = 10; 
      alert(a); //10
    }
    test();
    alert(a); //10
    

    写一个获取非行间样式的函数

    function getStyle(obj,attr) {
      if(obj.currentStyle) {
        return obj.currentStyle[attr];
      }else{
        getComputedStyle(obi,false)[attr] 
      }
    }
    

    写一个function,清除字符串前后的空格。(兼容所有浏览器)

    String.prototype.trim= function(){
    return this.replace(/^\s+/,"").replace(/\s+$/,"");
    
    }
    

    程序中捕获异常的方法?

    try{
     
    }catch(e){
     
    }finally{
     
    }
    

    有趣的题

    var uname = 'jack'
      function change() {
        alert(uname) // ? undefined
        var uname = 'lily'
        alert(uname) //? lily
      }
      change()
    

    降维数组

    var arr=[[1,2],[3,4]];
    function Jw(obj){
      return Array.prototype.concat.apply([],obj);
    }
    Jw(arr);
    

    9. typeof NaN 的结果是什么?

    解释一下什么是 promise ???? ok

    深入了解 深拷贝与浅拷贝

    DOM怎样添加、移除、移动、复制、创建和查找节点

    如何在JS中动态添加/删除对象的属性

    什么时候会产生null

    9.call() 和 apply() 的区别和作用?

    解释事件冒泡以及如何阻止它?

    函数声明与函数表达式的区别?

    参考地址 https://juejin.cn/post/6940945178899251230
    https://blog.csdn.net/weixin_45151960/article/details/104832916

    16. 数据类型检测的方式有哪些

    1.typeof 
    console.log(typeof 2);               // number
    console.log(typeof true);            // boolean
    console.log(typeof 'str');           // string
    console.log(typeof []);              // object    
    console.log(typeof function(){});    // function
    console.log(typeof {});              // object
    console.log(typeof undefined);       // undefined
    console.log(typeof null);            // object
    其中数组、对象、null都会被判断为object,其他判断都正确。
    所以 typeof 判断基本数据类型。
    ==============================================
    2.instanceof能正确判断引用数据类型
    console.log(2 instanceof Number);                    // false
    console.log(true instanceof Boolean);                // false 
    console.log('str' instanceof String);                // false 
    
    console.log([] instanceof Array);                    // true
    console.log(function(){} instanceof Function);       // true
    console.log({} instanceof Object);                   // true
    ===============================================
    3.constructor
    console.log((2).constructor === Number); // true
    console.log((true).constructor === Boolean); // true
    console.log(('str').constructor === String); // true
    console.log(([]).constructor === Array); // true
    console.log((function() {}).constructor === Function); // true
    console.log(({}).constructor === Object); // true
    
    
    constructor有两个作用,
    一是判断数据的类型。
    二是对象实例通过 constrcutor 对象访问它的构造函数。
    需要注意,如果创建一个对象来改变它的原型。
    constructor就不能用来判断数据类型了:
    
    function Fn(){};
    //如果创建一个对象来改变它的原型。
    Fn.prototype = new Array();
    var f = new Fn();
    console.log(f.constructor===Fn);    // false
    console.log(f.constructor===Array); // true
    
    
    4. Object.prototype.toString.call()
    Object.prototype.toString.call()使用Object 对象的原型方法 toString 来判断数据类型:
    
    var a = Object.prototype.toString;
    console.log(a.call(2)); //[object Number]
    console.log(a.call(true)); //[object Boolean]
    console.log(a.call('str')); // [object String]
    console.log(a.call([])); // [object Array]
    console.log(a.call(function(){})); // [object Function]
    console.log(a.call({})); //[object Object]
    console.log(a.call(undefined)); //[object Undefined]
    console.log(a.call(null)); //[object Null]
    

    我对nextTick的理解

    新增资产的流程配置模块。
    处理资产变更的流程单号跳转流程引擎
    优化资产变更后的提示
    
    作者:明月人倚楼
    出处:https://www.cnblogs.com/IwishIcould/

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!

    万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    支付宝
    微信
    本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    Pentaho
    知识地图
    分享学习笔记本
    2015-7-1 记而随,随而记
    web 导出 csv
    vs2013 密钥
    超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
    如何绘制业务流程图?
    总是保存下拉选项的第一个值
    mac 修改密码后 频繁输入钥匙串问题修复方法
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/15697378.html
Copyright © 2020-2023  润新知