JS面试题-01

JS习题整理

1.输出结果

  var A = {
            n: 4399
        };
        var B = function () {
            this.n = 9999
        };
        var C = function () {
            var n = 8888;
        };
        B.prototype = A;
        C.prototype = A;
        var b = new B();
        var c = new C();
        A.n++;
        console.log(b.n);
        console.log(c.n); 
原型链的继承问题,B、C都继承了A中的属性,找B的n属性时,
    this指向对象, c中 只是定义了一个局部变量 和C没有绑定,没有任何关系(执行思路: 先去找自己的对象有没有属性 如果有则)
  console.log(b.n);  在查找 b.n 是首先查找 b 对象自身有没有 n 属性,如果没有会去原型(prototype)上查找  当执行 var b = new B() 时,函数内部 this.n=9999(此时this指向b) 返回b对象,b对象有自身的n属性,所以返回 9999    
console.log(c.n); 同理 当执行 var c = new C() 时,c对象没有自身的n属性,向上查找,找到原型      (prototype)上的 n 属性,因为 A.n++(此时对象A中的n为4400),所以返回4400

2.input节点获取

<form class="file" name="upload">
<input id="file" name="file" class="file"/>
</form

正确方法  document.getElementById("file")[1];
  1. alert(undefined==null)的输出结果是 true

  2. 下列不属于javascript内置对象的是 Window

  3. Math  Date  RegExp  Window   Error
    
    Js中的内置对象都有:  Arguments Array Boolean Date Error function Math Number Object ReExp String
    
    

    6.下面哪些代码执行后i的值为10

let i =1 + {
valueOf() { return 9; }
};

{ valueOf() { return 9; } } 是一个匿名对象,该对象有一个名为valueOf的方法,对象与数字相加时,对象调用自身的valueOf方法转换为数字,故输出 i == 1 + 9 == 10;
 let i = 5;

        function a(i) {
            i *= 2;
        }
        a(i); //i=5;
       i是形参,,属于局部变量,不影响全局变量i的值
        
   let i = 0;
new Array(10).forEach(() => {
i++;
});     
orEach方法按升序为数组中含有效值的每一项执行一次 callback函数,那些未初始化的项将被跳过。new Array(10)创建的数组默认值都是undefined,所以回调函数都会被跳过。

7.当用户打开一个网页时,想一直停留在当前打开的页面,禁止页面前进和后退,以下正确的是

window.history.forward(1);  window.history.forward(-1);
  1. Math.round(-2019.5)等于多少( ) -2019 如果是2019.51 则 答案为-2020

9.以下哪些方法会返回一个数组? 1 、2

1.Object.keys() 
方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。
参数:Object.keys(obj) 要返回其枚举自身属性的对象。
返回值:一个表示给定对象的所有可枚举属性的字符串数组。
2.String.prototype.split()  
split() 方法使用指定的分隔符字符串将一个String对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置 返回源字符串以分隔符出现位置分隔而成的一个 Array 
3.Array.prototype.join()
将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项目,那么将返回该项目而不使用分隔符。一个所有数组元素连接的字符串。如果 arr.length 为0,则返回空字符串
4.Promise.all()  
Promise.all(iterable);iterable一个可迭代对象,如 Array 或 String。
Promise.all(iterable) 方法返回一个 Promise 实例,
返回值:promise对象

10.对于代码 var a = 10.42; 取出 a 的整数部分

parseInt(a); 转换为整数      Math.floor(a);向下取整,   Math.ceil(x) 向上取整
 Math.round(x) 四舍五入  Math.random(x) 返回0~1 之间随机数, 包含0和不包含1
 例如a=10.51时,如果使用Math.round(a)==11   10.5时,则为10

11.用户在登陆某个账号时,通常是将账号名和密码分别输入到对应的文本框中,现要将账号名和密码连接起来作为用户的唯一标识符 userName.concat(pwd);

append()在被选元素的结尾(仍然在内部)插入指定内容

appendTo() 方法在被选元素的结尾(仍然在内部)插入指定内容

pop() 方法用于删除并返回数组的最后一个元素。

12.下面哪些方式在同一个窗口下能够检测一个js对象是数组类型?

Array.isArray() 
instanceof 运算符返回一个布尔值,表示对象是否为某个构造函数的实例
let arr=[1,2,3];
arr instanceof Array; //true 可以检测对象是数组类型
typeof可以判断的类型有number、string、boolean、symbol、undefined、function;   object、array、null 的变量都返回 object
Object.prototype.toString.call([1,2,3])  //返回结果则为 [Object Array] 

13.angularjs1中control间通信最好使用什么方式 ------广播

14.var foo = "10" + 3 - "1"; console.log(foo);

​ // 因为前面有字符串,字符串+Number,数字将转换为字符串, ,而 -字符串则转换为Number ,10+(3-1)=12

15.JS中function能够访问他们的 参数、 局部变量或函数、全局变量、外部函数、的变量或函数

16.下面有关JavaScript中 call和apply的描述,错误的是

call与apply都属于Function.prototype的一个方法,所以每个function实例都有call、apply属性

两者传递的参数不同,call函数第一个参数都是要传入给当前对象的对象,apply不是 (X)

apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入

call传入的则是直接的参数列表。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

target属性:

_blank 在新窗口打开网页   _self  在当前窗口打开网页   _top 在当前窗口打开网页,并且替换当前窗口的整个网页  _parent在父窗口中打开网页

css 属性overflow属性定义溢出元素

参数为scroll时,必会出现滚动条
参数为auto时候,子元素内容大于父元素时出现滚动条
参数为visible时,溢出的内容出现在父元素之外
参数为hidden时,溢出隐藏

border:0 和 border:none区别

border:0 只是像素为0在页面看不见,但浏览器对border-width/border-color进行了渲染,已经占内存值了,
border:none   相当于没有,浏览器解析的时候就不会作出渲染动作,不会消耗内存值
兼容性差异
 对于IE6、IE7与标签button、input而言,会出现此情况。
 如何让border:none实现全兼容,只需要在哦同一个选择符上添加背景属性即可。

下列函数那些是JavaScript的全局函数?

encodeURI  parseFloat  setTImeout eval   只有setTImeout不是全局函数
记忆: 6编码+2数据处理+4数字相关+1特殊编码相关
escape()、unescape()、encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponet()
2数据 Number()、String()
数字相关 isFinite()、isNAN()、parseFloat()、parseInt()
特殊相关: eval()

该函数返回结果

  console.log('one');
        setTimeout(function () {
            console.log('two');
        }, 0);
        console.log('three');//one three two
回调,被回调的函数会被放在event loop里,等待线程里的任务执行完之后才执行event loop里的代码,因此,
先执行线程里的,再执行event loop里的setTimeout函数

以下代码执行后的值为

 var result = "75team2017".match(/\d+\w*/g);
 console.log(result);
 //返回结果 ["75team2017"] 
 [&quot;75team2017&quot;]
 
 \d  匹配一个数字,等价于[0-9]
 \w  匹配字母、数字或者下划线,等价于[A-Za-z0-9_]
 +  匹配前面的一个表达式一次或者多次,
 *  匹配前一个表达式0次或者多次
 /g 全局匹配  
 &quot 形式为引号,表达含义 转义字符
 &&左为真返回右边,|| 左为假返回右边

下面关于promise的all方法说法错误的是

触发then时可以只带上iterable参数中的部分值,也可以带所有值。(X)
iterable是一个全部为promise对象的数组,只要数组中有一个promise实例被reject,那么最终的promise触发catch,只有数组中全部promise实例都resolve才会触发then,并且要带上iterable中全部promise,其中promise实例将会被结果代替

this对象理解

this总是指向函数的间接调用者(而非间接调用者)
在不手动改变this指向的前提下,this总是指向函数的直接调用对象
IE中attachEvent中的this总是指向全局对象window

js原型遵循5个规则: 1、所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(除了“null”以外); 2、所有的引用类型(数组、对象、函数),都有一个__proto__(隐式原型)属性,属性值是一个普通的对象; 3、所有的函数,都有一个prototype(显式原型)属性,属性值也是一个普通对象; 4、所有的引用类型(数组、对象、函数),proto__属性值指向(完全相等)它的构造函数的“prototype”属性值; 5、当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去__proto(即它的构造函数的prototype中)寻找。

每个对象都具有一个名为__proto__的属性
每个对象都具有一个名为prototype的方法 (x)
每个对象的__proto__属性指向自身构造函数的prototype
对象不具有prototype属性,只有函数才有prototype属性

JS中实现继承的6种方式

 原型链继承、借用构造函数继承、组合继承、原型链继承、寄生式继承、寄生组合式继承

a(10)执行结果

 function a(a) {
            a ^= (1 << 4) - 1;
            return a;
        }
// 1<<4 左移相当于1*2……4=16 
//a^16-1=15   a=a^15=10^15
//^ 异或运算
10的二进制00001010
15的二进制00001111  
===========>00000101  转换为10进制:  5  所以结果为5

指令种哪种作用域可以继承父scope 答案:scope: true

scope: true 和transclude:true会创建新的子作用域,并且进行原型继承
scope:{....}会创建新的独立作用域,不会进行原型继承
默认情况下创建directive使用了scope:false,不会创建子作用域

获取ID为a的DOM元素

document.getElementById('a');      document.querySelector('#a')

//------------------------------------------------------------------------------

使用浏览器访问五http://baidu.com/时,浏览器端会发生什么过程?

浏览器端构建HTTP请求,并发送->服务器端接收到HTTP请求,并进行解析->服务器端发送HTTP响应->浏览器接收到响应,并进行页面渲染
构建HTTP请求, 渲染页面

关于HTTP/2的描述

解决浏览器线头阻塞的问题、使用了头部压缩、使用了二进制分帧封装HTTP消息
HTTP/0.9 功能捡漏,只支持GET方法 只能发送HTML格式字符串
HTTP/1.0 支持多种数据格式,增加了POST、HEAD等方法,增加了头信息、每次只能发送一个请求(无持久连接)
HTTP/1.1 默认持久连接、请求管道化、增加缓存处理、增加了Host字段、支持断点传输分块传输等
HTTP/2.0 二进制分帧、多路复用、头部压缩、服务器推送

服务端渲染和客户端渲染正确的是

服务端渲染对SEO更加友好,而且首屏渲染通常更快一些
SPA是客户端渲染的

客户端渲染: 浏览器中输入Vue组件、进行生成DOM和操作DOM
服务器渲染: 将组件渲染位服务器端的HTML字符串,将它们直接发送到浏览器,最后将这些静态标记"激活"为客户端上完全可交互的应用程序
服务器端渲染优点:
更好的SEO,由于搜索引擎爬虫抓取工具可以直接查看完全渲染的页面。
更快的内容到达时间,特别是对于缓慢的网络情况或运行缓慢的设备,无需等待所有的JS都完成下载并执行,才显示服务器渲染的标记,所以你的用户将会更快速的看到完整的渲染页面
缺点:
开发条件所限,浏览器特定的代码,只能在某些生命周期子函数中使用,
设计构建设置和部署的更多要求,与可以部署在任何静态文件服务器上的完全静态单页面应用程序SPA不同,服务器渲染应用程序,需要处于Node.js server运行环境,
更多的服务器端负载。在Node.js中渲染完整的应用程序,显然会比仅仅提供静态文件的server更加大量占用cpu资源,因此如果在高流量环境下使用,请准备相应的服务器负载,并明智地采用缓存策略。

有效防止XSS的手段

过滤用户请求中的非法字符、对请求中的特殊字符进行转译、配置CSP(Content Security  Policy)

排序算法中,时间复杂度不超过nlogn

堆排序、归并排序、   (快速排序、冒泡排序)不符合

transform正确的是

只对受控于盒模型的元素生效、可以通过matrix函数整合多种变形效果、transform变形的几点可以通过transform-origin设置,变形的默认系中心点

webpack

webpack是一个模块打包工具、webpack可以实现热更新,开发更加高效 、小项目用webpack,大的项目用脚手架,vue-cli,create-react-app

那些方法会中断js执行

alert、sync ajax请求

ES6规范中,基本数据类型

基本数据类型: Number、String、Null、Undefined、Boolean、Symbol
引用数据类型: Object、Function、Array

下列哪些协议是应用层协议

HTTP、SSH、FTP   

进程

进程有独立的地址空间、进程间可以通过网络通信、进程是系统进行资源分配和调度的基本单位
内存可以在不同进程间共享

关于TCP与UDP的描述

HTTP是基于TCP,  但是 HTTP3 基于UDP
TCP提供可靠度的字节流服务,,使用UDP传输数据,源端和终端不建立连接

浏览器缓存

浏览器会先在浏览器缓存中查询是否有要请求的文件满足需求,再决定是否发送请求
缓存位置: service Worker.Memory Cache.Disk Cache.Push Cache ,浏览器请求会按该优先级顺序,进行查找缓存,都没有命中时,才回去请求网络

可以解决跨域问题的是

 CORS、代理、JSONP 

排序算法中不稳定的有

快速排序、选择排序、
数据结构中 排序算法,稳定排序算法: 冒泡、插入、计数、合并、基数、桶排序、鸡尾酒排序
不稳定排序: 选择排序、希尔排序、组合排序、堆排序、平滑排序、快速排序

关于GBK和UTF-8

UTF-8 中文3个字节,英文1个字节 UTF8编码占2个字节

JS模块化规范

AMD、CMD、CommonJs、UMD、ES6

CSS中触发GPU硬件加速的

transform、 opacity、filter、will-change

可逆的算法

即能够加密用解密的 RSA/DES/3DES/AES/SM4  BASE64

哪种语法会创建宏任务

setTimeout
  var fizzBuzz = function (n) {
            var arr = [];
            for (var i = 1; i <= n; i++) {
                if ((i % 3) == 0 && (i % 5) == 0) {
                    arr.push('FizzBuzz');
                } else if ((i % 3) == 0) {
                    arr.push('Fizz');
                } else if ((i % 5) == 0) {
                    arr.push('Buzz');
                } else {
                    arr.push(i.toString())
                }
            }
            return arr
        };

        console.log(fizzBuzz(15)); 

posted @ 2021-09-10 08:24  Gurad-your-heart  阅读(151)  评论(0)    收藏  举报