==和===的区别

两种符号的定义:   

"==" 叫做相等运算符; "===" 叫做严格相等运算符(全等运算符)
它们之间的区别:
  "==" 允许隐式类型转换,只判断等号两边的值是否相等,而不判断类型是否相同。值相同则返回 true ;
  "===" 不允许隐式类型转换,既要判断值是否相等,也要判断类型是否相同,即全等才能返回 true ;

        “==”运算符认为null和undefined是相等的;

        “===”运算符认为null和undefined是不相等的。

判断布尔值:

0  f

‘0’  t

Undefined  f

Null  f

以下6个值会被转化为false,其他都视为true

  • null
  • undefined
  • 0
  • -0
  • NaN
  • “” 或 ‘’(空字符串)

js 基本数据类型:String Number Boolean Null Underfined

 引用数据类型:Object function array

Js任务队列

同步代码放到执行栈中执行,异步代码会先存放到任务队列中,执行栈代码先执行,异步代码在执行栈执行完后再执行。任务队列优先级高于消息队列

宏任务和微任务都有什么

宏任务(macrotask):

异步Ajax请求
setTimeout 、setInterval
文件操作
 

微任务(microtask):

Promise.then、Promise.catch和Promise.finally
process.nextTick

'the-first-index'转成小驼峰

let reg=/-(\w)/g;

let str='the-first-index';

let str1=str.replace(reg,($,$1)=>{

    return $1.toUpperCase();

});

console.log(str1);

数组方法(增删改查、迭代)

2.2.1 增
push——尾增(返回新数组长度)
unshift——首增(返回新数组长度)
splice(返回空数组)
concat(用于合并两个或多个数组,返回新构建的数组,不影响原数组)
// 增-splice(开始位置, 要增加的元素数量, 要插入的元素) 返回空数组
let colors = ["red", "green", "blue"];
let removed = colors.splice(1, 0, "yellow", "orange")
console.log(colors) // [ 'red', 'yellow', 'orange', 'green', 'blue' ]
console.log(removed) // []
 
// 增-concat 返回新构建的数组
let colors1 = ['red', 'green', 'blue'];
let colors2 = colors1.concat('yellow', ['black', 'brown']);
console.log(colors1); // [ 'red', 'green', 'blue' ]
console.log(colors2); // [ 'red', 'green', 'blue', 'yellow', 'black', 'brown' ]
2.2.2 删
pop——尾删(返回被删除项)
shift——首删(返回被删除项)
splice(返回被删除元素的数组)
slice(返回新切片构建的数组,但不影响原数组)
// 删-splice(开始位置,要删除元素的数量) 返回删除元素的数组
let colors = ["red", "green", "blue"];
let removed = colors.splice(0,1); // 删除第一项
console.log(colors); // [ 'green', 'blue' ]
console.log(removed); // [ 'red' ]
 
 
// 删-slice(新构建数组的开始元素位置, 新构建数组的结束元素位置边界) 不包括结束元素
let colors1 = ["red", "green", "blue", "yellow", "purple"];
let colors2 = colors1.slice(1);
let colors3 = colors1.slice(1, 4);
console.log(colors1); // ['red', 'green', 'blue', 'yellow', 'purple']
console.log(colors2); // ['green', 'blue', 'yellow', 'purple']
console.log(colors3); // ['green', 'blue', 'yellow' ]
2.2.3 改
改:splice(删除部分元素,同时插入元素,影响原数组)
// 改-splice(开始位置, 要删除的元素数量, 要插入的元素) 返回删除元素的数组
let colors = ['red', 'green', 'blue'];
let removed = colors.splice(1, 1, 'purple'); // 删除一个元素,插入一个元素
console.log(colors); // [ 'red', 'purple', 'blue' ]
console.log(removed); // [ 'green' ],只有一个元素的数组
2.2.4 查
indexOf
includes
find(传入逻辑函数,返回使得逻辑函数为真的第一个元素)
filter(传入逻辑函数,返回所有使得逻辑函数为真的数组)
let numbers = [1, 2, 3, 4, 5, 4];
console.log(numbers.indexOf(4)); // 3
console.log(numbers.includes(4)); // true
console.log(numbers.find((d, index) => d >= 5)); //5

console.log(numbers.filter((d, index) => d >= 5)); //[5];

for in和for of

for...in 循环只遍历可枚举属性(包括它的原型链上的可枚举属性)。像 Array和Object使用内置构造函数所创建的对象都会继承自Object.prototype和String.prototype的不可枚举属性,例如 String 的 indexOf() 方法或 Object的toString()方法。循环将遍历对象本身的所有可枚举属性,以及对象从其构造函数原型中继承的属性(更接近原型链中对象的属性覆盖原型属性)。
 

for...of语句在可迭代对象(包括Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句

判断数据类型的方式

1.typeof

typeof 返回值 “object” 、“number”、“boolean”、“undefined”、“function” 、“string”、“function”、'symbol"

typeof 返回的值都是字符串类型

2.instanceof

instanceof 是用来 判断数据是否是某个对象的实例,返回一个布尔值

3.constructor

使用 constructor 可以查看目标构造函数,也可以进行数据类型判断。但是不能判断 null 和 undefined,因为这两个特殊类型没有其对应的包装对象。constructor和instanceof 类似,constructor 返回结果的是自己的构造函数,而 instructor 则是自己与构造函数比较返回布尔值

4.Object.prototype.toString

在判断数据类型时,我们称 Object.prototype.toString 为 “万能方法” “终极方法”,工作中也是比较常用而且准确

把一个对象的属性变成不可改变的

数据描述符{
value:"",
configurable:false不能删除与重新定义,
writeable:true允许修改属性
enumerable:true允许变量循环
}

组件间通信

1.父组件给子组件传值
    1.将传递的数据写入子组件 
    2.在子组件内使用props接收数据
2.子组件给父组件传值
    1.在子组件内发射自定义事件 $emit(自定义事件名称,传递的数据)
    2.在子组件标签上使用自定义事件来接受 @自定义事件='handler'
    handler(a){}
3.兄弟组件传值
   法1

1.定义一个事件总线 new Vue();
    2.引入事件总线 使用事件总线Bus.$emit(事件名称,发送的数据)
    3.引入事件总线 使用事件总线Bus.$on(事件名称,(a)=>{
        a--->数据
    })
   法2: vuex ---传值
4.祖先/子孙组件 
    1.使用provide(){
        return {
            传递的数据
            "属性名":属性值/this.msg
        }
    }
    2.inject注入传递的数据
    inject:['属性',"属性"]
 

Vuex的实现

Vuex 是一个专为 Vue.js 应用程序开发的状态管理插件。(公共数据库)

当项目遇到以下两种场景时

    1. 多个组件依赖于同一状态时。
     2. 来自不同组件的行为需要变更同一状态。

解决的问题:多个视图依赖同一个状态,来自不同视图的行为需要变更同一状态,适用于中大型的单页面应用。
 

v-if v-show 区别

         v-if是一个惰性的 只有满足条件的情况下 才会去加载dom节点 不满足条件 直接不渲染dom元素

        v-show 满足条件 显示元素 不满足条件 隐藏元素 会去加载dom元素 不满足条件 调用display:none

        使用场景:v-if 较少的dom开销

                v-show 频繁的切换css样式

v-for中key的作用

key的作用: 因为vue会高效复用组件 很多时候我们不希望这样去做 所以会给节点添加一个唯一值 key去标识当前组件不被复用 

计算属性computed和methods的区别

    1,计算属性computed有依赖缓存 如果值没有发生变化 不会重新调用计算属性

        methods没有依赖缓存 每一次调用都会重新执行/渲染

    2,可以在methods里发送异步请求,可以封装函数

        计算属性computed 不处理异步请求

        3,computved 不会存在vue变量中,会新建一个属性并返回(缺点)

        4,计算某一属性,只要其中一个变量发生变化,计算属性就可以监听到并处理后返回

watch和computed的区别

  1,watch 监听属性或者监听vue变量的变化

  特点:无缓存性,只有值发生变化的时候才可以监听到

  执行开销较大的异步操作