1.基础数据类型:
Number、String、Boolean、undefined、Null
2.复杂数据类型:
object(Array、function、Data等)
Object本质上是由一组无序的名值对组成的。
1)Array.length
返回或设置一个数组中的元素个数
设置 length 属性的值来截断任何数组
2)Array.from()
对伪数组或可迭代对象(包括arguments Array,Map,Set,String…)转换成数组对象
语法 Array.from(arrayLike, mapFn, thisArg)
3)concat()
用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
var arr1 = ['a', 'b', 'c'];
var arr2 = ['d', 'e', 'f'];
var arr3 = ['f'];
var arr4 = arr1.concat(arr2,arr3);
// arr4 is a new array [ "a", "b", "c", "d", "e", "f" ]
4)forEach()
方法对数组的每个元素执行一次提供的函数
array.forEach(callback(currentValue, index, array){
//do something
}, this)
5)indexOf()
返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1
let a = [2, 9, 7, 8, 9];
a.indexOf(2); // 0
a.indexOf(6); // -1
a.indexOf(7); // 2
a.indexOf(8); // 3
a.indexOf(9); // 1
if (a.indexOf(3) === -1) {
// 数组中不包含3
}
6)map()
创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果
7)pop()
从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度
let a = [1, 2, 3];
a.length; // 3
a.pop(); // 3
a.length; // 2
8)push()
将一个或多个元素添加到数组的末尾
9)toString()
返回一个字符串,表示指定的数组及其元素
10)unshift()
将一个或多个元素添加到数组的开头,并返回新数组的长度
11)shift()
从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度
12)reverse
方法将数组中元素的位置颠倒
13)slice
返回一个从开始到结束(不包括结束)选择的数组的一部分到一个新数组对象
14)sort()
对数组的元素进行排序,并返回数组
15)join()
将数组(或一个类数组对象)的所有元素连接到一个字符串中
let a = ['Wind', 'Rain', 'Fire'];
a.join();
// 默认为 ","
// 'Wind,Rain,Fire'
16)includes()
用来判断一个数组是否包含一个指定的值,返回 true或 false
let a = [1, 2, 3];
a.includes(2);
// true
a.includes(4);
// false
17)reduce()
累加器和数组中的每个元素(从左到右)应用一个函数
var total = [0, 1, 2, 3].reduce(function(sum, value) {
return sum + value;
}, 0);
// total is 6
18)lastIndexOf()
返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找第一个出现位置的索引
19)copyWithin(target, start, end)
浅复制数组的一部分到同一数组中的另一个位置
20)fill()
用一个固定值填充一个数组中从起始索引到终止索引内的全部元素
// arr.fill(value, start, end)
ar numbers = [1, 2, 3]
numbers.fill(1);
// results in [1, 1, 1]
21)find()
返回数组中满足提供的测试函数的第一个元素的值
function isBigEnough(element) {
return element >= 15;
}
[12, 5, 8, 130, 44].find(isBigEnough); // 130
22)findIndex()
返回数组中满足提供的测试函数的第一个元素的索引
function isBigEnough(element) {
return element >= 15;
}
[12, 5, 8, 130, 44].findIndex(isBigEnough);
//'3'
简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。
面试常问,基本数据类型有哪些,number,string,boolean,null,undefined,symbol以及未来ES10新增的BigInt(任意精度整数)七类;引用数据类型(Object类)有常规名值对的无序对象{a:1},数组[1,2,3],以及函数等。
而这两类数据存储分别是这样的:
拓展:实现深拷贝的三种方式
①递归去复制所有层级属性
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
let a=[1,2,3,4],
b=deepClone(a);
a[0]=2;
console.log(a,b);
②JSON对象的stringify和parse
function deepClone(obj){
let _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone
}
let a=[0,1,[2,3],4],
b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
③JQ的extend方法
$.extend( [deep ], target, object1 [, objectN ] )
let a=[0,1,[2,3],4],
b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
拓展:实现浅拷贝
①使用object.assign方法
let target=[];
let testArr=[2,3,5,8];
Object.assign(target,testArr);
console.log(target);
testArr.push(8);
console.log("我是原来的"+target+",我是现在的"+testArr);
通过代码来看:
function Person(name,age){
this.name=name;
this.age=age;
}
var p1=new Person('小满',18);
var p2=new Person('大雪',20);
console.log(p1,p2)
console.log(Person.prototype);
console.log(p1.__proto__);
console.log(p1.__proto__===Person.prototype);
console.log(p2.__proto__===Person.prototype);
console.log(p1.__proto__===p2.__proto__);
console.log(p1.__proto__.constructor);
console.log(Person.prototype.constructor);
Object.prototype.__proto__ === null
时,查找结束,返回undefined。3.利用prototype给对象添加一个自定义方法属性/方法
Array.prototype.duplicator = function() {
let s = this.concat(this);
return s;
}
let t = [1,2,3,4,5].duplicator();
console.log(t);// [1,2,3,4,5,1,2,3,4,5]
(1)四种基本选择器:
①标签选择器:针对一类标签,选择器的名字代表html页面上的标签。
css
②ID选择器:针对某一个特定的标签使用,只能使用一次。css中的ID选择器用”#”定义。
Document
你好
③类选择器:针对你想要的所有标签使用,规定用.定义。优点:灵活。
你好
注意:类上样式,id上行为。意思是说,class属性交给css使用,id属性交给js使用。
④通用选择器(通配符):用*定义,将匹配任何标签,不建议使用,IE有些版本不支持,大网站增加客户端负担。效率不高,如果页面上的标签越多,效率越低,所以页面上不能出现这个选择器。
(2)四种高级选择器
①后代选择器:用空格隔开
对于E F这种格式,表示所有属于E元素后代的F元素,有这个样式。空格就表示后代。
css
注意,交集选择器没有空格。所以,没有空格的div.red(交集选择器)和有空格的div .red(后代选择器)不是一个意思。
③并集选择器(分组选择器):用逗号隔开
css
css
css
④伪类选择器:用冒号定义
常用:
(3)其他选择器:
①子代选择器:用符号>表示(IE7开始兼容,IE6不兼容)
div>p{
color:red;
}
注意:div的儿子p。和div的后代p的截然不同。
②序选择器::first-child、:last-child(IE8开始兼容;IE6、7都不兼容)
设置无序列表
③下一个兄弟选择器(IE7开始兼容,IE6不兼容)
我是一个标题
我是一个段落
我是一个段落
我是一个段落
我是一个标题
我是一个段落
我是一个段落
我是一个段落
我是一个标题
我是一个段落
我是一个段落
我是一个段落
我是一个标题
1.Vue实例需要经过创建、初始化数据、编译模板、挂载DOM、渲染、更新、渲染、卸载等一系列过程,这个过程就是Vue的生命周期,Vue中提供的钩子函数有beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed。
2.常用
①created使用场景(操作数据):
②mounted使用场景: