JavaScript基础整理(二)

  • 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是无法通过这种方式深拷贝的。



  • 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使用建议
  1. 尽量减少对DOM元素的访问和操作
  2. 尽量避免给DOM元素绑定多个相同类型的事件处理函数,可以将多个相同类型事件处理函数合并到一个处理函数,通过数据状态来处理分支
  3. 尽量避免使用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) 获取异步调用返回的数据

注意:

  1. 页面初次加载时,尽量在web服务器一次性输出所有相关的数据,只在页面加载完成之后,用户进行操作时采用ajax进行交互。
  2. 同步ajax在IE上会产生页面假死的问题。所以建议采用异步ajax。
  3. 尽量减少ajax请求次数
  4. ajax安全问题,对于敏感数据在服务器端处理,避免在客户端处理过滤。对于关键业务逻辑代码也必须放在服务器端处理。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容