js学习笔记

目录

  • delete
  • Import、Require、interopRequireDefault
    • require
    • import
    • interopRequireDefault
    • 引用出现的一些问题
      • 循环引用
      • 引用文件的变量作用域
  • defer和async
  • 严格模式
  • undefined和null
  • parseInt等转数子的方法,如果参数是数字加字符,会自动过滤字符
  • 原始字符串
  • 标签语句

delete

我在看nodejs的808协议解析的代码的时候看到了delete这个操作用来对超时做处理。
因为js自带垃圾回收机制,所以delete不常用
但是比如前端通过接口向后端发一个对象,比如这个对象是form表单里的数据,如果不要把每个参数都传给后端,可以用delete删除掉某几个字段;

var obj = {name: "John", age: 25};
delete obj.age;
console.log(obj); // 输出: {name: "John"}

Import、Require、interopRequireDefault

require

require是CommonJS的规范
require是一开始就执行读取模块;
(Nodejs使用的是require)

静态编译:
引用了之后会放入缓存,所以可以使用require(‘…’).xxx直接使用里面的属性,无需再次读取

import

import是ES6的规范,
import是先不执行,遇到使用到的时候再真正的读取模块;

interopRequireDefault

interopRequireDefault的作用就是判断require的模块是否是已经被babel编译过的模块,如果是,则当前require的引用一定存在一个default属性;否则为他加一个default属性,这样便不会调用模块的default为undefined的情况了。

参考:https://www.dvy.com.cn/2020/12/06/6976.html

引用出现的一些问题

循环引用

多个文件引用的时候一定要避免循环引用,无论是几个文件循环都会导致报错,在一开始写代码的时候就要注意将工具函数分出来!

引用文件的变量作用域

举个例子,如下

// utils.js
let a = 1;
const fun = () => {
  a = 2;
};
const getA = () => {
  console.log(a);
};
let obj = {
  x: 0,
};
const changeObj = () => {
  obj.x = 1;
  console.log(obj);
};
module.exports = { a, fun, getA, obj, changeObj };

// main.js
const utils = require("./utils/utils");
utils.fun();
console.log(utils.a); // 1
utils.getA(); // 2
utils.a = 3;
utils.getA(); // 2
// console.log(utils.obj); // { x: 0 }
utils.changeObj(); // { x: 1 }
console.log(utils.obj); // { x: 1 }
utils.obj.x = 2;
console.log(utils.obj); // { x: 2 }

可以看出以下两点,

1.js的执行逻辑是一个文件一旦被加载就不会被销毁,直到进程结束才会被销毁
2.引用可以当成浅拷贝,被赋值的时候如果是对象之类的引用数据类型,那么只会获得一个指针地址,而不是整个数据。

defer和async

之前面试准备的时候知道这两个东西,就是你用script标签的时候可以使用这两个不对html页面渲染阻塞
执行顺序:

普通script:遇到先网络加载,再执行脚本,再继续渲染
defer:遇到并行下载,等渲染完了再执行
async:遇到并行下载,下载完了直接执行

严格模式

“use strict”
防止不规范导致安全问题

undefined和null

!undefined和!null结果都是true

parseInt等转数子的方法,如果参数是数字加字符,会自动过滤字符

原始字符串

String.raw`\u00A9`  // 将版权符号变回字符串

标签语句

之前好像见过但是没怎么在意,看红宝书的时候刚好看到了,记录一下,这个在多层循环的时候可以任意跳出某个循环,可以用continue和break加上label名称,如下示例

let i,
  j,
  count = 0;
label1: for (i = 0; i < 10; i++) {
  label2: for (j = 0; j < 10; j++) {
    if (i > 5) {
      break label1;
    }
    if (j > 5) {
      break label2;
    }
    count++;
  }
}
console.log(i, j, count); // 6 0 36

你可能感兴趣的:(nodejs后端开发,web技术,前端vue,javascript,学习,笔记)