-
Set
+ 扩展运算符...
:
[...new Set(array)]
过滤原数组重复值。数组中数值类型为 undefined
, null
, boolean
, string
, number
。当是object
, function
, array
时则不适用.
- 与(
&&
)运算符将会返回第一个false/‘falsy’
的值。如果没有找到任何虚值表达式,则返回最后一个真值表达式。它采用短路来防止不必要的工作。
或(||
)运算符将返回第一个true/‘truthy’
的值。当所有的操作数都是false
时,将返回最后一个表达式的结果。
- 我们可以通过
+
连接运算符将一个number
类型的变量转换成string
类型。此外,+
也是将字符串转换为数字的最快方法,因为如果值已经是数字,它不会执行任何操作。
const val = 1 + "";
let int = "15"; int = +int;
在某些上下文中,+
将被解释为连接操作符,而不是加法操作符。当这种情况发生时(您希望返回一个整数,而不是浮点数),您可以使用两个波浪号:~~
。(需要注意为英文格式)
const int = ~~"15";
- ES7开始,我们可以使用幂运算符
**
作为求幂的简写,相对之前的Math.pow(2, 3)
更加快捷。这是一个很简单实用的点,但是大部分的教程并不会专门介绍它。
console.log(2 ** 3);
- 我们平时可以使用
Math.floor()
,Math.ceil()
和Math.round()
将float
类型转换成integer
类型。但是还有一种更快的方法可以使用|
(位或运算符)将浮点数截断为整数。该操作结果是直接删除小数点后的内容,将浮点数截断为整数,和上面提到的其他几个方法是有所区别的。
console.log(23.9 | 0); // Result: 23
console.log(-23.9 | 0);
- 如果您想从数组的末尾删除值,有比使用
splice()
更快的替代方法。例如,如果你知道原始数组的长度,就可以通过重新定义它的length
属性来实现截取。
- 实现一个函数,判断输入是不是回文字符串
function run(input) {
if (typeof input !== 'string') return false;
return input.split('').reverse().join('') === input;
}
- 深拷贝和浅拷贝
var obj1 = {a: 1, b: 2};
var obj2 = obj1;
obj2.a = 3;
console.log(obj1); // {a: 3, b: 2}
console.log(obj2); // {a: 3, b: 2}
浅拷贝只是引用的拷贝,两者还是指向内存中的同一个地址。
而深拷贝是指两者指向不同的内存地址。
Object.assign()
浅拷贝 - 处理第一层的深拷贝
var obj1 = {a: 1, b: {c: 2}};
var obj2 =Object.assign({}, obj1);
obj2.a = 3;
obj2.b.c = 3;
console.log(obj1); // {a: 1, b: {c: 3}}
console.log(obj2); // {a: 3, b: {c: 3}}
实现深拷贝 - JSON
var obj1 = {a: 1, b: {c: 2}};
var obj2 =JSON.parse(JSON.stringify(obj1));
简单好用,但是它会抛弃对象的constructor。也就是说,深拷贝之后,不管对象原来的构造函数是什么,深拷贝之后都会变成Object。
而且这种方法正确处理的只有Number,String,Boolean和Array。RegExp和function是无法通过这种方式深拷贝的。
-
实现继承的几种方式
JavaScript实现类与继承的方法(全面整理)
- Event Loop是javascript的执行机制
宏任务一般是:包括整体代码script, setTimeout, setInterval, setImmediate.
微任务:原生Promise(有些实现的promise将then方法放到了宏任务中)、process.nextTick、Object.observe(已废弃)、 MutationObserver 记住就行了。
Event Queue Priority:
宏任务同步-> 微任务(microtask queue, such as Promise) -> 宏任务异步(macrotask queue, such as setTimeOut, setInterval, setImmediate)setTimeout,是经过指定时间后,把要执行的任务加入到Event Queue中
setInterval, 每隔指定的时间将注册的函数置入Event Queue,如果前面的任务耗时太久,那么同样需要等待
- JQuery使用建议
- 尽量减少对DOM元素的访问和操作
- 尽量避免给DOM元素绑定多个相同类型的事件处理函数,可以将多个相同类型事件处理函数合并到一个处理函数,通过数据状态来处理分支
- 尽量避免使用toggle事件
-
Ajax(Asynchronous Javascript And XML)
异步就是向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,等到有了结果它自己会根据设定进行后续操作,与此同时,页面是不会发生整页刷新的,提高了用户体验。
// 创建Ajax的过程:
// 1) 创建XMLHttpRequest对象(异步调用对象)
var xhr = new XMLHttpRequest();
// 2) 创建新的Http请求(方法、URL、是否异步)
xhr.open(‘get’,’example.php’,false);
// 3) 设置响应HTTP请求状态变化的函数。
// onreadystatechange事件中readyState属性等于4。
// 响应的HTTP状态为200(OK)或者304(Not Modified)。
// 4) 发送http请求
xhr.send(data);
// 5) 获取异步调用返回的数据
注意:
- 页面初次加载时,尽量在web服务器一次性输出所有相关的数据,只在页面加载完成之后,用户进行操作时采用ajax进行交互。
- 同步ajax在IE上会产生页面假死的问题。所以建议采用异步ajax。
- 尽量减少ajax请求次数
- ajax安全问题,对于敏感数据在服务器端处理,避免在客户端处理过滤。对于关键业务逻辑代码也必须放在服务器端处理。