美文网首页
js基础-2

js基础-2

作者: 南崽 | 来源:发表于2020-04-06 18:23 被阅读0次

1. for in、Object.keys 和 Object.getOwnPropertyNames 对属性遍历有什么区别?

for in会遍历自身原型链上的可枚举属性
Object.keys会将对象自身的可枚举属性key输出
会将自身所有的属性的key输出

ECMAScript 将对象的属性分为两种数据属性访问器属性

for in

for in

Object.keys

Object.keys

Object.getOwnPropertyNames

Object.getOwnPropertyNames

2.iframe 跨域通信和不跨域通信

不跨域通信

iframe主页面 子页面
  • 主页面要是想要调取子页面的showalert方法
myIframe.window.showalert();
  • 子页面要掉主页面的fullscreen方法
window.parent.fullScreens();
  • js在iframe子页面获取父页面元素
window.parent.document.getElementById("元素id");
  • js在父页面获取 iframe 子页面元素代码
window.frames["iframe_ID"].document.getElementById("元素id");

跨域通信

使用postMessage(官方用法)

  • 子页面
window.parent.postMessage("hello", "http://127.0.0.1:8089");
  • 父页面接收
window.addEventListener("message", function(event) {
  alert(123);24.如何判断一个对象是否为数组
第一种方法:使用 instanceof 操作符。第二种方法:使用 ECMAScript 5 新增的 Array.isArray()方法。第三种方法:使用使用 Object.prototype 上的原生 toString()方法判断。
});

3.H5 与 Native 如何交互

jsBridge

4.如何判断一个对象是否为数组

  • 使用instanceof操作符
  • 使用ES5新增的Array.isArray()方法
  • 使用使用Object.prototype上的原生toString()方法判断

4. 什么是面向对象?

面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为

面向对象和面向过程的异同

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用

面向对象是把构成问题事务分解成各个对象建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为

5. 对松散类型的理解

JavaScript中的变量松散类型

所谓松散类型就是指当一个变量申明出来就可以保存任意类型的值,就是不像 SQL一样申明某个键值为int就只能保存整型数值,申明varchar只能保存字符串;一个变量所保存值的类型也可以改变,这在JavaScript中是完全有效的,只是不推荐;相比较于将变量理解为"盒子",《JavaScript编程精解中提到应该将变量理解为"触手",它不保存值,而是抓取值。这一点在当变量保存引用类型值时更加明显。JavaScript中变量可能包含两种不同的数据类型的值:基本类型引用类型基本类型是指简单的数据段,而引用类型指那些可能包含多个值的对象

6. JS 单线程还是多线程,如何显示异步操作

JS本身是单线程的,他是依靠浏览器完成的异步操作

  1. 主线程执行js中所有的代码
  2. 主线程在执行过程中发现了需要异步的任务任务后扔给浏览器(浏览器创建多个线程执行),并在callback queque中创建对应的回调函数(回调函数是一个对象,包含该函数是否执行完毕等)
  3. 主线程已经执行完毕所有同步代码
    开始监听callback queque一旦浏览器中某个线程任务完成将会改变回调函数的状态;主线程查看到某个函数的状态为已完成,就会执行该函数。

7. JavaScript 数组的函数 map/forEach/reduce/filter

map/forEach/reduce/filter
输出结果

8. JS块级作用域,变量提升

块级作用域

JS作用域有:全局作用域,函数作用域,没有块作用域的概念;

ES6新增块级作用域
块作用域由{}包括,if语句和for语句里面的{}也属于块作用域

变量提升

如果变量声明在函数里面,则将变量声明提升函数开头
如果变量声明是一个全局变量,则将变量声明提升到全局作用域的开头


输出结果

9. var、let、const 的区别

  • var定义的变量没有块的概念,可以跨块访问, 不能跨函数访问。
  • let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
  • const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改
  • 同一个变量只能使用一种方式声明,不然会报错

10. null/undefined 的区别

null: Null 类型,代表"空值",代表一个空对象指针,使用typeof运算得到 "object",是一个特殊的对象值

undefined: Undefined类型,当一个声明了一个变量未初始化时,得到的就是 undefined

11. 重排与重绘的区别,什么情况下会触发?

简述重排的概念

浏览器下载完页面中的所有组件(HTML、JavaScript、CSS、图片)之后会解析生成两个内部数据结构(DOM 树和渲染树),DOM 树表示页面结构渲染树表示 DOM节点如何显示;
重排DOM 元素几何属性变化,DOM 树结构变化,渲染树需要重新计算

简述重绘的概念

重绘是一个元素外观的改变所触发的浏览器行为,例如改变visibilityoutline背景色等属性;浏览器会根据元素的新属性重新绘制,使元素呈现新的外观;由于浏览器的流布局,对渲染树的计算通常只需要遍历一次就可以完成

简述重绘和重排的关系

重绘不会引起重排,但重排一定会引起重绘,一个元素的重排通常会带来一系列的反应,甚至触发整个文档重排重绘性能代价是高昂的

什么情况下会触发重排?

页面渲染初始化时;(这个无法避免)
浏览器窗口改变尺寸;
元素尺寸改变时;
元素位置改变时;
元素内容改变时;
添加删除可见的DOM元素时。

12. 发布订阅设计模式

发布/订阅模式(Publish Subscribe Pattern)属于设计模式中的行为(Behavioral Patterns)

13. jsonp 优缺点?

1). 优点

  1. jsonp不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制,jsonp可以跨越同源策略;
  1. jsonp兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequestActiveX的支持;
  1. 请求完毕后可以通过调用callback的方式回传结果;将回调方法的权限给了调用方;这个就相当于将controller层view层终于分开了;如果有两个页面需要渲染同一份数据,你们只需要有不同的渲染逻辑就可以了,逻辑都可以使用同 一个jsonp服务。

2). 缺点

  1. jsonp只支持GET请求而不支持POST等其它类型的HTTP 请求
  1. jsonp只支持跨域 HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题
  1. jsonp调用失败的时候不会返回各种HTTP状态码
  1. 安全性。万一假如提供jsonp的服务存在页面注入漏洞,即它返回的javascript的内容是被人控制的;那么所有调用这个jsonp的网站都会存在漏洞。于是无法把危险控制在一个域名下,所以在使用jsonp的时候必须要保证使用的jsonp服务必须是安全可信

14. 兼容各种浏览器版本的事件绑定

事件绑定

15. typescript 遇到过什么坑

main.js 报错: (Cannot find module './App.vue'.)
原因: typescript不能识别.vue文件
解决办法: 引入vuetypescript declare

16. Ajax 是什么?如何创建一个 Ajax?

Ajax全称是asychronous javascript and xml,可以说是已有技术的组合,主要用来实现客户端服务器端异步交互,实现页面的局部刷新

基本步骤: 创建对象、建立连接、发送数据、接收数据

ajax

17. 同步和异步的区别?

同步:阻塞的

浏览器服务器请求数据,服务器比较忙,浏览器一直等着(页面白屏),直到服务器返回数据浏览器才能显示页面

异步:非阻塞的

浏览器服务器请求数据,服务器比较忙,浏览器如常显示页面,服务器返回数据的时候通知浏览器一声,浏览器把返回的数据渲染到页面,局部更新

18. 如何解决跨域问题?

  • jsonp,允许script加载第三方资源
  • 反向代理(nginx 服务内部配置 Access-Control-Allow-Origin *)
  • cors前后端协作设置请求头部,Access-Control-Allow-Origin等头部信息
  • iframe嵌套通讯,postmessage

19. 页面编码和被请求的资源编码如果不一致如何处理?

get请求中的中文需要encodeURIComponent编码处理,post 请求不需要进行编码

20. 创建 ajax 过程

  • 创建XMLHttpRequest对象,也就是创建一个异步调用对象
  • 创建一个新的HTTP 请求,并指定HTTP请求的方法URL验证信息
  • 设置响应HTTP请求状态变化的函数
  • 发送HTTP请求
  • 获取异步调用返回的数据
  • 使用JavaScriptDOM实现局部刷新

相关文章

  • 小程序系列--JS基础

    JS基础 最后一遍JS基础,需要一定的语言基础 1. JS在网页中使用 2. 注释 3. 变量 声明变量 var...

  • js基础2

    1.事件 1)添加事件 点击事件:onclick 2)图片显隐 出现: 3)this的用法 在匿名函数中的this...

  • js基础2

    一、js引入方式和打印方式 四种引入方式(1) 百度一下 (2) (3)在html页面的任何位置加入 js代码...

  • JS基础2

    函数 主要参考:https://wangdoc.com/javascript/types/function.htm...

  • js基础(2)

    5、Math中的常用方法(10个)6、Date日期操作基础详解以及常用方法(12个) 5、Math中的常用方法(1...

  • JS基础--2

    js中的程序控制语句 常见的程序有三种执行结构: 顺序结构 分支结构 循环结构 顺序结构:程序从第一行开始执行,按...

  • js基础2

    1、 栈方法和队列方法 1)栈操作的方式:先进后出原则----通过重数组尾部添加数据项,然后在从数组的尾部获取尾部...

  • JS 基础 2

    Ba la la la ~ 读者朋友们,大家好,冷锋时间,话不多说,发车! 一、ECMAScript中关...

  • js基础(2)

    1、innerText用于改变标签内文本时,如果标签内含有其他元素则子元素将被覆盖 2、createAttribu...

  • js基础2

    js数据类型 js定义了6种数据类型,数值、字符串、布尔值称为原始数据类型的值即基本数据类型。将对象称为复杂类型的...

网友评论

      本文标题:js基础-2

      本文链接:https://www.haomeiwen.com/subject/yljbphtx.html