针对数组的这个问题,ES5 提供了 Array.isArray() 方法 。该方法用以确认某个对象本身是否为 Array 类型,而不区分该对象在哪个环境中创建。
Object.prototype.toString.call('') // [object String]
Object.prototype.toString.call(1) // [object Number]
Object.prototype.toString.call(true) // [object Boolean]
Object.prototype.toString.call(Symbol()) // [object Symbol]
Object.prototype.toString.call(undefined) // [object Undefined]
Object.prototype.toString.call(null) // [object Null]
Object.prototype.toString.call(new Function()) // [object Function]
Object.prototype.toString.call(new Date()) // [object Date]
Object.prototype.toString.call([]) // [object Array]
Object.prototype.toString.call(new RegExp()) // [object RegExp]
Object.prototype.toString.call(new Error()) // [object Error]
Object.prototype.toString.call(window) // [object global] window 是全局对象 global 的引用
Object.prototype.toString.call(document) // [object HTMLDocument]
常用类型判断
Array.isArray(response) ? response : [] //判断是否是数组
(2)引用类型和基本类型的区别?
(3)什么是栈?什么是堆?
(4)手写 翻转字符串
(5)箭头函数和普通函数的区别
箭头函数带(this)
(6)let var const的区别
作用域
(7)get 和 post 的区别
(8)跨域产生的原因,同源策略是什么?说说你了解的解决办法
跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的。
同源策略,是浏览器对 JavaScript 实施的安全限制,只要协议、域名、端口有任何一个不同,都被当作是不同的域。
跨域原理,即是通过各种方式,避开浏览器的安全限制。
(9)Promise
(10)数组去重的方法
allLabel = Array.from(new Set(allLabel));
(11)图片懒加载
(12)Cookie、sessionStorage、localStorage 的区别
(13)Promise
(14)this
当函数独立调用的时候,在严格模式下它的this指向undefined,在非严格模式下,当this指向undefined的时候,自动指向全局对象(浏览器中就是window)
当obj在全局声明的时候,obj内部属性中的this指向全局对象,当obj在一个函数中声明的时候,严格模式下this会指向undefined,非严格模式自动转为指向全局对象。
new做了下面这些事:
- 创建一个临时对象
- 给临时对象绑定原型
- 给临时对象对应属性赋值
- 将临时对象return
如果要判断一个运行中函数的 this 绑定,就需要找到这个函数的直接调用位置。找到之后就可以顺序应用下面这四条规则来判断 this 的绑定对象。
-
- 由new调用?绑定到新创建的对象。
- 由call或者apply(或者bind)调用?绑定到指定的对象。
- 由上下文对象调用?绑定到那个上下文对象。
- 默认:在严格模式下绑定到undefined,否则绑定到全局对象。
(14)事件
(15)浏览器
按照渲染的时间顺序,流水线可分为如下几个子阶段:构建 DOM 树、样式计算、布局阶段、分层、栅格化和显示。如图:
- 渲染进程将 HTML 内容转换为能够读懂DOM 树结构。
- 渲染引擎将 CSS 样式表转化为浏览器可以理解的styleSheets,计算出 DOM 节点的样式。
- 创建布局树,并计算元素的布局信息。
- 对布局树进行分层,并生成分层树。
- 为每个图层生成绘制列表,并将其提交到合成线程。合成线程将图层分图块,并栅格化将图块转换成位图。
- 合成线程发送绘制图块命令给浏览器进程。浏览器进程根据指令生成页面,并显示到显示器上。
XSS(Cross-Site Scripting,跨站脚本攻击)
CSRF(Cross-site request forgery)跨站请求伪造
(16)原型链
(17)作用域
(18)map
(1)类似于对象,是键值对的集合,数据可为任意类型。与Object的区别在于Object的键 只能是字符串或者Symbols,但Map可以为任意类型,且Map中的键值是有序的 Map结构的实例方法
- set(key, value)
(2)可以看到map的键可以使任意的数据类型,这个是map最显著的一个特点,所以map主要的作用是数据存储
- get(key)
获取key对应的键值,若没有则返回undefined
(3)返回布尔值,查询key是否在当前对象中
- has(key)
(4)删除key对应的键值对,删除成功返回true否则返回false
-
delete(key)
(5)清除所有键值对,没有返回值 -
clear()
(6)返回新的MapIterator对象,按顺序插入Map对象中所有value
- values()
(7)callback(key,value,Map)必选,对象中每个元素都要执行的回调函数
- forEach(callback,thisArg)
key-当前元素的键
value-当前元素的值
Map-当前正在遍历的对象
map.forEach((key, value) => {
console.log(key + '=' + value)
})
(8)返回新的MapIterator对象,按顺序插入Map对象中所有key
- keys()
(9)返回新的MapIterator对象,按顺序插入Map对象中每个元素的[key,value]数组
- entries()
(19)对象解构
const result = {
name: 'crazyu',
age: 12,
sex: 'man',
address: '江苏省上海市'
}
// 不推荐写法: 这种写法没有错误,但是不够简洁
// result 可能是后台返回的值
const name = result && result.name
const age = result && result.age
const sex = result && result.sex
const address = result && result.address
// 推荐写法
const { name, age, sex, address } = result || {}
// tips: 如果你需要解构的变量很多,建议这行写,这样代码很整洁,避免单行代码过长导致阅读困难,
// 需要左右滚动的文件真的会很麻烦,也很让人抓狂, 代码中该空格的地方要空格
const {
name,
age,
sex,
address,
favorite: '',
movie,
music,
id,
} = result || {}
(20)Null判断运算符: ??
// 在某一个特定的场景下你需要排除字段 不能是以下这种情况: null、undefined 、 ‘’,
// 不推荐写法
if (result !== null && result !== undefined && result !== '') {
}
// 推荐写法
if ((result ?? '') !== '') {
}
(21)数组常用方法
/ 如果查找是否存在id = ‘333’的元素,则使用some,不要去使用for 、map等其他循环体完整的去循环数组
const isExist = result.some(item => item.id === '333')
// 如果查找数组的元素是否都符合某一个条件使用 every
// 比如当前数组元素age是否都大于18
const isAdult = result.every(item => item.age > 18)
// 查找age == 18的元素,并且返回
const item = result.find(item => item.age === 18)
console.log(item) // { name : 'crazyu2', id: '222', age: 18 }
// 查找age == 18的下标
const index = result.findIndex(item => item.age === 18)
console.log(index) // 1
// 查找 age > 18 的元素集合
const adults = result.filter(item => item.age > 18) || []
(22)数字分隔符
const sixBillion2 = 6000_000_000
console.log(sixBillion2) // 6000000000
const sum = 1000 + 6000_000_000 // 6000001000
(23)原生AJAX请求
//创建 XMLHttpRequest 对象
var ajax = new XMLHttpRequest();
//规定请求的类型、URL 以及是否异步处理请求。
ajax.open('GET',url,true);
//发送信息至服务器时内容编码类型
ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//发送请求
ajax.send(null);
//接受服务器响应数据
ajax.onreadystatechange = function () {};