对累积的技巧进行总结

103 阅读6分钟

针对数组的这个问题,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 的绑定对象。

    1. 由new调用?绑定到新创建的对象。
    2. 由call或者apply(或者bind)调用?绑定到指定的对象。
    3. 由上下文对象调用?绑定到那个上下文对象。
    4. 默认:在严格模式下绑定到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 () {};